tosqualler Posté(e) le 17 février 2006 Signaler Posté(e) le 17 février 2006 Dans ce nouveau tutoriale, je vais d'abord vous expliquez comment ajouter une bibliothèque, au magnum 357 dans mon tutos. Puis je referais avec vous le zoom d'une arme mais sans aucun bug . ( bug de l'ancien code, zoom arbalète capoute, arme mal placée ) Logiciel utilisé -Steam. -SDK. -Editeur C++. Ajout d'un *.h C'est vraiment tout simple , dans la source vous voyez par exemple weapon_rpg.cpp,weapon_rpg.h,weapon_ar2.cpp,weapon_ar2.h,weapon_357.cpp mais pas de weapon_357.h... Pourquoi? Question de rangement je dirais xD mais si on ajoute beaucoup de fonctions et de variables sa devient vite le bordel. On ne travaillera pas avec le RPG mais le AR2 et nous ajouterons un *.h au weapon_357.cpp Ouvrez weapon_ar2.h Et ouvrez weapon_357.cpp Que voyez-vous après les includes du 357? La même façon de faire que dans weapon_ar2.h Alors pourquoi pas essayer? Commençons, Ajoutez un weapon_357.h avec votre MOD <=> variant d'un IDE a l'autre Ouvrez weapon_357.h, weapon_357.cpp et regarder weapon_ar2.h Dans weapon_357.cpp on voit ceci après les includes [cpp] class CWeapon357 : public CBaseHLCombatWeapon { DECLARE_CLASS( CWeapon357, CBaseHLCombatWeapon ); public: CWeapon357( void ); void PrimaryAttack( void ); void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ); DECLARE_SERVERCLASS(); DECLARE_DATADESC(); }; LINK_ENTITY_TO_CLASS( weapon_357, CWeapon357 ); PRECACHE_WEAPON_REGISTER( weapon_357 ); IMPLEMENT_SERVERCLASS_ST( CWeapon357, DT_Weapon357 ) END_SEND_TABLE() BEGIN_DATADESC( CWeapon357 ) END_DATADESC() [/cpp] Voila c'est justement comme dans le weapon_ar2.h donc prenez cette partie et mettez ma dans votre weapon_357.h (Qui doit être vide). Maintenant vous voyez que dans weapon_AR2.h il y a d'autre truc Des includes <=> si vous utilisez des "fonctions" appartenant a d'autre *.h Des truc bizarre Ça par exemple [cpp] #ifndef WEAPONAR2_H #define WEAPONAR2_H Et en fin de source #endif //WEAPONAR2_H [/cpp] Donc essayons de les mettre dans le weapon_357.h en changeant le nom Et tout ça donne [cpp] #ifndef WEAPON357_H #define WEAPON357_H //----------------------------------------------------------------------------- // CWeapon357 //----------------------------------------------------------------------------- class CWeapon357 : public CBaseHLCombatWeapon { DECLARE_CLASS( CWeapon357, CBaseHLCombatWeapon ); public: CWeapon357( void ); void PrimaryAttack( void ); void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ); DECLARE_SERVERCLASS(); DECLARE_DATADESC(); }; LINK_ENTITY_TO_CLASS( weapon_357, CWeapon357 ); PRECACHE_WEAPON_REGISTER( weapon_357 ); IMPLEMENT_SERVERCLASS_ST( CWeapon357, DT_Weapon357 ) END_SEND_TABLE() BEGIN_DATADESC( CWeapon357 ) END_DATADESC() #endif //WEAPON357_H [/cpp] Enregistrer, compiler, tester et ça marche Mais quelle est la différence avec avant? Aucune c'est justement la preuve que ça marche. Ajout d'une fonction déjà existante. Voila suite a tout les bug rencontrer dans le tutos sur le zoom, j'ai décider de le refaire mais en partant de rien. Souvenez vous dans HL1, il y a un zoom sur le magnum 357, nous allons donc le rajouter et en même temps utiliser notre Nouvelle bibliothèque. Pourquoi le magnum 357? Car il dispose de très peux de fonction de départ et que l'adaptation est plus dure. Avant toute recherche des fonctions permettant le zoom, réfléchissez au arme qui l'on déjà...l'arbalète Donc ouvrons la source de l'arbalète :: weapon_crossbow.cpp La source est grande et ne dispose pas de bibliothèque. Mais n'en rajoutez pas. Cherchez la fonction de tire secondaire void CWeaponCrossbow::SecondaryAttack( void ) mais malchance on tombe la dessu :s [cpp] //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponCrossbow::SecondaryAttack( void ) { //NOTENOTE: The zooming is handled by the post/busy frames } [/cpp] Mais grâce au beau boulot de valve, le commentaire permet de savoir ou se trouve le zoom Ici il indique qu'il se trouve dans tout ce qui pourrait ressembler a post et busy frames . Descendons dans la source et a notre grande surprise on trouve PLEIN de fonction parlant de frames et de zoom C’est gagné enfin presque Faites un copier/coller de tout sa [cpp] //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeapon357::SecondaryAttack( void ) { //NOTENOTE: The zooming is handled by the post/busy frames } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeapon357::CheckZoomToggle( void ) { CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( pPlayer->m_afButtonPressed & IN_ATTACK2 ) { ToggleZoom(); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeapon357::ItemBusyFrame( void ) { // Allow zoom toggling even when we're reloading CheckZoomToggle(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeapon357::ItemPostFrame( void ) { // Allow zoom toggling CheckZoomToggle(); if ( m_bMustReload && HasWeaponIdleTimeElapsed() ) { Reload(); } BaseClass::ItemPostFrame(); } [/cpp] Ne prenez rien parlant des firebolt qui sont les fleches enflamées...pour la culture... Comme pour le RPG il faut enlever le zoom en cas de reload et de switche et la nous devons chercher la fonction Holster Une foi trouvée copier/coller la a la suite des autres fonction du 357 [cpp] //----------------------------------------------------------------------------- // Purpose: // Input : *pSwitchingTo - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CWeapon357::Holster( CBaseCombatWeapon *pSwitchingTo ) { if ( m_bInZoom ) { ToggleZoom(); } // SetChargerState( CHARGER_STATE_OFF ); //desactiver car je ne rajoute pas la fonction SetChargerState return BaseClass::Holster( pSwitchingTo ); } [/cpp] et apres ce code nous voyons le code du zoom !!!! [cpp] //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeapon357::ToggleZoom( void ) { CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( pPlayer == NULL ) return; if ( m_bInZoom ) { if ( pPlayer->SetFOV( this, 0, 0.2f ) ) { m_bInZoom = false; } } else { if ( pPlayer->SetFOV( this, 20, 0.1f ) ) { m_bInZoom = true; } } } [/cpp] et hop copier/coller a la suite de votre source Continuez votre découverte de la source de l'arbalète et vous verrez que la suite ne sert à rien D'après vous est-ce fini? NON !! il manque toutes les déclaration de fonctions, libraire, et varialbe. Nous allons donc utiliser notre nouvelle bibliothèque weapon_357.h Mais comment savoir qu’elles sont les trucs à déclarer. -Soit compiler et regarder les erreurs et après go weapon_ar2.cpp -Soit relire tout le weapon_357.cpp et weapon_ar2.cpp pour tout trouver. Vous trouverez +- tout ici [cpp] class CWeaponCrossbow : public CBaseHLCombatWeapon { DECLARE_CLASS( CWeaponCrossbow, CBaseHLCombatWeapon ); public: CWeaponCrossbow( void ); virtual void Precache( void ); virtual void PrimaryAttack( void ); virtual void SecondaryAttack( void ); // nous interresse pour initialiser le fait qu'il y a une deuxieme attacque virtual bool Deploy( void ); virtual bool Holster( CBaseCombatWeapon *pSwitchingTo = NULL ); // nous interresse pour le switch virtual bool Reload( void ); virtual void ItemPostFrame( void ); // nous interresse partie du zoom virtual void ItemBusyFrame( void ); // nous interresse partie du zoom virtual void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ); virtual bool SendWeaponAnim( int iActivity ); DECLARE_SERVERCLASS();// nous interresse comme point de repere DECLARE_DATADESC();// nous interresse comme point de repere private:// nous interresse void SetSkin( int skinNum ); void CheckZoomToggle( void ); // nous interresse void FireBolt( void ); void ToggleZoom( void ); // nous interresse // Various states for the crossbow's charger enum ChargerState_t { CHARGER_STATE_START_LOAD, CHARGER_STATE_START_CHARGE, CHARGER_STATE_READY, CHARGER_STATE_DISCHARGE, CHARGER_STATE_OFF, }; void CreateChargerEffects( void ); void SetChargerState( ChargerState_t state ); // nous interresse void DoLoadEffect( void ); private:// nous interresse // Charger effects ChargerState_t m_nChargeState; CHandle m_hChargerSprite; bool m_bInZoom; // nous interresse bool m_bMustReload; // nous interresse }; [/cpp] Recopier les declaration importante dans le weapon_357.h Pour donner ceci [cpp] #ifndef WEAPON357_H #define WEAPON357_H //----------------------------------------------------------------------------- // CWeapon357 //----------------------------------------------------------------------------- class CWeapon357 : public CBaseHLCombatWeapon { DECLARE_CLASS( CWeapon357, CBaseHLCombatWeapon ); public: CWeapon357( void ); void PrimaryAttack( void ); virtual void SecondaryAttack( void ); //virtual bool Deploy( void ); virtual bool Holster( CBaseCombatWeapon *pSwitchingTo = NULL ); //virtual bool Reload( void ); virtual void ItemPostFrame( void ); virtual void ItemBusyFrame( void ); void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ); DECLARE_SERVERCLASS(); DECLARE_DATADESC(); private: void CheckZoomToggle( void ); void ToggleZoom( void ); bool m_bInZoom; bool m_bMustReload; }; LINK_ENTITY_TO_CLASS( weapon_357, CWeapon357 ); PRECACHE_WEAPON_REGISTER( weapon_357 ); IMPLEMENT_SERVERCLASS_ST( CWeapon357, DT_Weapon357 ) END_SEND_TABLE() BEGIN_DATADESC( CWeapon357 ) END_DATADESC() #endif //WEAPON357_H [/cpp] Mais il vous reste encore a inclure la librairie du setfov() => player.h dans votre weapon_357.h Et voila voilou tout marche Si vous faites tout vous-même attention j'ai du désactiver certaine partie des fonctions et déclaration Dans mon tutos il reste plus que de faire en sorte que le zoom s'enlève lors du rechargement de l'arme... Le problème vient du fait qu'il n'y a pas de fonction reload comme sur les autres armes :s Donc cherchons dans notre source tout ce qui pourrait faire rapport au rechargement et nous tombons sur [cpp] Reload(); et case EVENT_WEAPON_RELOAD: { CEffectData data; // Emit six spent shells for ( int i = 0; i < 6; i++ ) { data.m_vOrigin = pOwner->WorldSpaceCenter() + RandomVector( -4, 4 ); data.m_vAngles = QAngle( 90, random->RandomInt( 0, 360 ), 0 ); data.m_nEntIndex = entindex(); DispatchEffect( "ShellEject", data ); } break; } [/cpp] Sans aucun doute le rechargement a lieu ici. Maintenant cherchons une condition d'existence gérant le zoom [cpp] bool CWeapon357::Holster( CBaseCombatWeapon *pSwitchingTo ) { if ( m_bInZoom ) { ToggleZoom(); } //SetChargerState( CHARGER_STATE_OFF ); return BaseClass::Holster( pSwitchingTo ); } [/cpp] Nous la voyons ici [cpp] if ( m_bInZoom ) { ToggleZoom(); } [/cpp] Donc il ne reste que a la mettre avant les reload() et dans le switch qui le gère, histoire d'être sur que le zoom seras enlever Se qui donne [cpp] //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeapon357::Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ) { CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); switch( pEvent->event ) { case EVENT_WEAPON_RELOAD: { CEffectData data; if ( m_bInZoom ) //tadada { //tadada ToggleZoom(); //tadada } //tadada // Emit six spent shells for ( int i = 0; i < 6; i++ ) { data.m_vOrigin = pOwner->WorldSpaceCenter() + RandomVector( -4, 4 ); data.m_vAngles = QAngle( 90, random->RandomInt( 0, 360 ), 0 ); data.m_nEntIndex = entindex(); DispatchEffect( "ShellEject", data ); } break; } } } [/cpp] tadada=> devait le montrer mais je ne savait pas quoi mettre et [cpp] void CWeapon357::PrimaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( !pPlayer ) { return; } if ( m_iClip1 <= 0 ) { if ( !m_bFireOnEmpty ) { if ( m_bInZoom ) //tadada { //tadada ToggleZoom(); //tadada } //tadada Reload(); } else { WeaponSound( EMPTY ); m_flNextPrimaryAttack = 0.15; } return; } ... [/cpp] Voila maintenant le zoom s'enlève, assez lentement mais il s'enlève Aller a+ dans un prochain tutos Lien source ( clic droit => enregistrer sous ) :: http://membres.lycos.fr/squallcs/vossey/CPP2/weapon_357.rar Tester le MOD ( clic droit => enregistrer sous ) :: http://membres.lycos.fr/squallcs/vossey/CPP2/test2.rar
Havok Posté(e) le 18 février 2006 Signaler Posté(e) le 18 février 2006 Comme avant, magnifique tuto Merci Edit : j'ai tout de même pas mal d'erreurs : weapon_357.cpp c:\Logistique\src\dlls\weapon_357.h(20) : error C2061: erreur de syntaxe : identificateur 'ChargerState_t' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(31) : error C2011: 'CWeapon357' : redéfinition du type 'class' c:\Logistique\src\dlls\weapon_357.h(3) : voir la déclaration de 'CWeapon357' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(45) : error C2086: 'CEntityFactory weapon_357' : redéfinition with [ T=CWeapon357 ] c:\Logistique\src\dlls\weapon_357.h(27) : voir la déclaration de 'weapon_357' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(47) : error C2086: 'CPrecacheRegister precache_weapon_weapon_357' : redéfinition c:\Logistique\src\dlls\weapon_357.h(28) : voir la déclaration de 'precache_weapon_weapon_357' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(49) : error C2086: 'ServerClass g_CWeapon357_ClassReg' : redéfinition c:\Logistique\src\dlls\weapon_357.h(29) : voir la déclaration de 'g_CWeapon357_ClassReg' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(49) : error C2084: la fonction 'const char *CWeapon357::GetClassName(void)' a déjà un corps c:\Logistique\src\dlls\weapon_357.h(15) : voir la définition précédente de 'GetClassName' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(49) : error C2084: la fonction 'ServerClass *CWeapon357::GetServerClass(void)' a déjà un corps c:\Logistique\src\dlls\weapon_357.h(15) : voir la définition précédente de 'GetServerClass' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(49) : error C2374: 'm_pClassSendTable' : redéfinition ; initialisation multiple c:\Logistique\src\dlls\weapon_357.h(15) : voir la déclaration de 'm_pClassSendTable' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(49) : error C2084: la fonction 'int CWeapon357::YouForgotToImplementOrDeclareServerClass(void)' a déjà un corps c:\Logistique\src\dlls\weapon_357.h(15) : voir la définition précédente de 'YouForgotToImplementOrDeclareServerClass' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(49) : error C2086: 'SendTable DT_Weapon357::g_SendTable' : redéfinition c:\Logistique\src\dlls\weapon_357.h(29) : voir la déclaration de 'DT_Weapon357::g_SendTable' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(49) : error C2374: 'DT_Weapon357::g_SendTableInit' : redéfinition ; initialisation multiple c:\Logistique\src\dlls\weapon_357.h(29) : voir la déclaration de 'DT_Weapon357::g_SendTableInit' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(52) : error C2374: 'm_DataMap' : redéfinition ; initialisation multiple c:\Logistique\src\dlls\weapon_357.h(16) : voir la déclaration de 'm_DataMap' c:\Logistique\src\dlls\hl2_dll\weapon_357.cpp(52) : fatal error C1903: impossible de récupérer à partir des erreurs précédentes ; arrêt de la compilation
ChandlerBing82 Posté(e) le 18 février 2006 Signaler Posté(e) le 18 février 2006 merci tosq pour le temps passé a faire ces tutos. Je les remonte en topic annonce
tosqualler Posté(e) le 18 février 2006 Auteur Signaler Posté(e) le 18 février 2006 Havok essaye avec ma source, tu as prit toutes les variables qui decoullent de void SetChargerState( ChargerState_t state ); qui servent a recharger l'arbalete apres un tir xD et enleve les declaration du weapon_357.cpp vu que tout est dans le weapon_357.h maintenant Mais matte ma source que j'ai mit avec je referais pour la quatrieme fois mon tutos pour voir si j'ai pas fait une faute de rien chandler exclusivitée vossey mon/mes nouveau(x) tutos sera/seront :: -balle explosive. -nouvelle arme.
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.