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.

Introduction

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.

Les modifications à effectuer

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.

Creative Commons Logo Contrat Creative Commons

Cet article est mis à disposition sous un contrat Creative Commons (licence CC-BY-ND).