[TUTOS] Quatrième Partie :: Ma première bibliothèque.


tosqualler

Recommended Posts

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 :P

Ç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 :P.

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 :P

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 :P

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 :D

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 :P

mon/mes nouveau(x) tutos sera/seront ::

-balle explosive.

-nouvelle arme.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.