Écrit par David Henry, le 9 juin 2002
Attention : cet article a été écrit pour le SDK 2.2 d'Half-Life 1 ! Il se peut qu'il ne soit pas entièrement compatible avec des versions antérieures ou supérieures du Kit.
Dans ce tutorial nous allons voir comment passer notre arme du côté de la DLL client. Quelle en est l'utilité? Bien c'est comme pour les events, gagner en bande passante... On va quand même se retrouver avec du code côté serveur, et le même (à 2, 3 choses près) côté client. Bon, vous allez voir, il n'y a pas grand chose à faire.
D'abord côté serveur, assurez-vous que la classe de votre arme est bien
définie dans weapons.h. Si ce n'est pas le cas, déplacez-la dedans.
Ensuite vérifiez qu'il n'y a pas #ifndef CLIENT_DLL
et
#endif // CLIENT_DLL
qui encadrent cette fonction.
Maintenant ajoutez le fichier de votre arme au projet de la client dll et ouvrez-le pour l'éditer.
Si vous avez surchargé SendWeaponAnim()
comme décris dans
mon tutorial sur comment créer une arme,
modifiez-la comme suit :
// -------------------------------------------------------------------------- // CMonArme::SendWeaponAnim // // Joue l'animation iAnim de du modèle de l'arme. // -------------------------------------------------------------------------- void CMonArme::SendWeaponAnim (int iAnim, int skiplocal, int body) { #ifndef CLIENT_DLL MESSAGE_BEGIN (MSG_ONE, SVC_WEAPONANIM, NULL, m_pPlayer->pev); WRITE_BYTE (iAnim); WRITE_BYTE (body); MESSAGE_END (); #endif }
Si jamais vous compilez le contenu de SendWeaponAnim()
dans
la DLL client, vous allez avoir un beau crash quelque secondes voir moins
après l'avoir ramassée. Descendez dans la fonction PrimaryAttack()
.
Si vous avez utilisé les events, modifiez l'appel à
PLAYBACK_EVENT_FULL()
ainsi :
int flags; #if defined (CLIENT_WEAPONS) flags = FEV_NOTHOST; #else flags = 0; #endif // on appelle l'event chez la client dll PLAYBACK_EVENT_FULL (flags, // drapeaux d'état m_pPlayer->edict(), // *pInvoker m_usMonArme, // index event 0.0, // délai avant action de l'event (float *)&g_vecZero, // origine (float *)&g_vecZero, // angles vecDir.x, // paramètre #1 vecDir.y, // paramètre #2 0, 0, 0, 0 ); // Autres paramètres inutilisés
Voilà c'est tout pour la DLL serveur. Passons à la DLL client. Commencez par ajouter le fichier source de votre arme au projet dans le sous dossier hl avec les autres armes d'Half-life. Allez dans hl_weapons.cpp et créez une nouvelle variable globale au début du fichier :
CMonArme g_MonArme;
Descendez jusqu'à un peu plus de la moitié du fichier et à la fin de
HUD_InitClientWeapons()
ajoutez cette instruction :
HUD_PrepEntity (&g_MonArme, &player);
Ile ne reste plus qu'une chose à faire. Toujours dans le même fichier,
cherchez l'instruction switch
de from->client.m_iId
dans la fonction HUD_WeaponsPostThink()
et ajoutez-y le cas
de votre arme :
case WEAPON_MONARME: pWeapon = &g_MonArme; break;
Et c'est tout ce qu'il y'a à faire. Compilez les deux DLLs et normalement ça marche.
Cet article est mis à disposition sous un contrat Creative Commons (licence CC-BY-ND).