Coder une arme côté client

Écrit le 03/07/2003 par DukeNukem
Dernière mise à jour : 30/01/2006

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 allez dans le fichier de votre arme.

Si vous avez surchargé SendWeaponAnim() comme décris dans mon tutorial sur « comment créer une arme », modifiez la comme suit :

// --------------------------------------------
// 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 client dll, 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 event
                         (float *)&g_vecZero, // origine
                         (float *)&g_vecZero, // angles
                         vecDir.x,            // paramètre #1
                         vecDir.y,            // paramètre #2
                         0, 0, 0, 0 );        // autres params 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 le 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 dll et normalement ça marche.