Documentation
Toutes les pages
READY  -  par FSMOD

READY

A l'intermission chaque joueur doit annoncer qu'il est prêt pour la map suivante, en actionnant la touche ENTREE. Le voyant READY s'affiche alors en face de son pseudo, dans le panneau des scores. Certains joueurs ne connaissent pas cette procédure et bloquent momentanément la rotation du cycle de maps pendant 10 secondes, pendant que d'autres s'impatientent en faisant clignoter leur annonce READY.

Afin d'annuler cette annonce et limiter le temps d'attente, j'ai codé ce qui suit.

Modification du code sources

Fichier g_main.c

Dans la fonction CheckIntermissionExit rechercher le groupe suivant:

 if ( Q_stricmp ( exitReady.string, readylist ) != 0 )
    {
        trap_Cvar_Set( "exitReady", readylist );

    }

Le remplacer par:

 // *FSMOD*  Annule l'affichage READY à l'intermission
 /*
    if ( Q_stricmp ( exitReady.string, readylist ) != 0 )
    {
        trap_Cvar_Set( "exitReady", readylist );
    }
 */
 // *FSMOD
*

Recherchez le groupe suivant

 // if we have waited ten seconds since at least one player
    // wanted to exit, go ahead
    if ( level.time < level.exitTime + (g_intermissionDelay.integer * 1000) ) {
        return;
    }

Le remplacer par

 // if we have waited 5 seconds since at least one player
    // wanted to exit, go ahead
    if ( level.time < level.exitTime + (g_intermissionDelay.integer * 500) )  //*FSMOD* Limite Intermission 5 sec.
    {
        return;
    }

-=biggrin=-

Publié le 16/03/2019 12:26  Prévisualiser...   Imprimer...   Haut
Santé et Goggles  -  par FSMOD

SANTE et GOGGLES

L'usage des jumelles infra-rouges et de vision nocturne (Thermal et NV goggles) affectent le joueur qui les utilise, d'une perte totale de protection par l'armure. Il ne lui reste que la santé. Cette pénalité est justifiée dans la mesure où il perçoit très nettement et à distance, la silhouette écarlate de la cible qui lui offre ainsi, un avantage certain. D'autant plus que des cloisons minces laissent même apparaitre la cible si elle se trouve collée contre la paroi. Le WH n'est pas loin.

Personnellement j'ai jugé insuffisante cette pénalité aussi ai-je codé un CVAR g_healthGoggle, dont la valeur sur une plage de 5 à 100, sera choisie par le Sysop. Elle impactera le capital santé de départ du joueur concerné. La valeur g_healthGoggle est fixée à 50 par défaut.

Pour résumer:

  • 5 = Taux d'anémie très élevé
  • 100 = C'est la pleine forme

Modification du code sources

Fichier g_local.h

Après

 extern vmCvar_t g_realisticAmmo;

Ajouter

 extern vmCvar_t g_healthGoggle; // *FSMOD* Santé goggles

Fichier g_main.c

Après

 vmCvar_t  g_realisticAmmo;

Ajouter

 vmCvar_t  g_healthGoggle;  //*FSMOD* Santé goggles

Après

 { &g_realisticAmmo, "g_realisticAmmo", "0", CVAR_SYSTEMINFO, 0.0f, 0.0f, 0, qfalse },

Ajouter

 { &g_healthGoggle, "g_healthGoggle", "50", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_LOCK_RANGE, 05.0, 100.0 },// *FSMOD* Santé goggles

Fichier g_client.c

Dans la fonction ClientSpawn, remplacez le groupe

  

// Everyone gets full armor in deathmatch
        client->ps.stats[STAT_ARMOR] = MAX_HEALTH;
    }

    client->ps.stats[STAT_HEALTH] = ent->health = MAX_HEALTH;

Par le groupe suivant

    // Everyone gets full armor in deathmatch
        client->ps.stats[STAT_ARMOR] = MAX_HEALTH;
    }

// *FSMOD* La santé est fixée en cas d'usage des goggles
    if ( pm->ps->stats[STAT_GOGGLES] == GOGGLES_INFRARED  || pm->ps->stats[STAT_GOGGLES] == GOGGLES_NIGHTVISION   )


    {
        client->ps.stats[STAT_HEALTH] = ent->health =  g_healthGoggle.integer;
        if (g_healthGoggle.integer != 100 && disable_thermal.integer == 0)

        {

        trap_SendServerCommand(ent-g_entities, "chat -1\ ".:: Your health is reduced by using thermals  ::.\n " );

        }

    }

   else
    {
        client->ps.stats[STAT_HEALTH] = ent->health = MAX_HEALTH;
    }

// *FSMOD*

Nota: Bien entendu il est impératif que les CVAR disable_thermal et/ou disable_NightVision soient à 0 afin de rendre les jumelles disponibles pour les joueurs. Par ailleurs, ceux qui choisiront l'armure ne seront pas affectés par le handicap santé.

-=mad=-

Publié le 13/03/2019 18:38  Prévisualiser...   Imprimer...   Haut
Third Person  -  par FSMOD

Third Person

La fonction third Person codée initialement dans les sources Rocmod a été par la suite invalidée par ses programmeurs, au motif vraisemblable qu'elle a été considérée comme une forme de triche.

Personnellement je ne considère pas que le tir en third Person offre un quelconque avantage à celui qui en use, d'autant plus que le réticule de visée n'est plus affiché, ce qui rend le tir très instinctif, à défaut d'être précis. Toutefois il appert que certains joueurs l'affectionnent particulièrement. Je l'ai donc recodée dans ma version 2.2 et  une commande directe est disponible dans l'onglet Misc. Setup.

Modification du code sources

Cela se passe uniquement côté client

Fichier cg_main.c

Recherchez le groupe suivant

    { &cg_thirdPerson, "cg_thirdPerson", "0", CVAR_CHEAT },
    { &cg_thirdPersonRange, "cg_thirdPersonRange", "80", CVAR_CHEAT },
    { &cg_thirdPersonYaw, "cg_thirdPersonYaw", "0", CVAR_CHEAT },
    { &cg_thirdPersonPitch, "cg_thirdPersonPitch", "15", CVAR_CHEAT },
    { &cg_thirdPersonHorzOffset, "cg_thirdPersonHorzOffset", "0", CVAR_CHEAT },

Le remplacez par celui-ci

 // *FSMOD* Annulation cheat protected

    { &cg_thirdPerson, "cg_thirdPerson", "0", CVAR_ARCHIVE | CVAR_USERINFO },  
    { &cg_thirdPersonRange, "cg_thirdPersonRange", "80", CVAR_ARCHIVE | CVAR_USERINFO },
    { &cg_thirdPersonYaw, "cg_thirdPersonYaw", "0", CVAR_ARCHIVE | CVAR_USERINFO },
    { &cg_thirdPersonPitch, "cg_thirdPersonPitch", "15", CVAR_ARCHIVE | CVAR_USERINFO },
    { &cg_thirdPersonHorzOffset, "cg_thirdPersonHorzOffset", "0", CVAR_ARCHIVE | CVAR_USERINFO },

 // *FSMOD*

 -=eek=-

Publié le 12/03/2019 18:57  Prévisualiser...   Imprimer...   Haut
Caractères interdits  -  par FSMOD

Caractères interdits

Il est fréquent de voir sur les serveurs qui tournent sous la version v 1.00, une foultitude de pseudos ou de binds ponctués par des caractères spéciaux. Même les hostnames de ces serveurs sont affublés de ces artifices scripturaux particulièrement agressifs et colorés.

Ces caractères spéciaux sont les suivants:

symb.jpg

Ils sont générés selon la forme suivante:

liste.jpg

Sous Rocmod et à partir de WIndows 7 ils ne s'affichent que sous la forme d'un simple point, toutefois ils conservent leur apparence dans le fichier log du serveur.

Les considérant ridicules, inutiles et envahissants, j'ai codé ce petit filtre.

Modification du code sources

Fichier g_client.c

Dans la fonction G_ClientCleanName, après les lignes suivantes

 while( 1 )
    {
        ch = *in++;
        if( !ch )
        {
            break;
        }

Insérez le groupe suivant

// *FSMOD*  Caractères refusés

  if (    ch == ''    // doigt d'honneur
     ||   ch == ''    // F1dans une ellipse
     ||   ch == ''    // F2 dans une ellipse
     ||   ch == ''    // F3 dans une ellipse
     ||   ch == ''    // F4 dans une ellipse
     ||   ch == ''    // 1 dans un carré
     ||   ch == ''    // 2 dans un carré
     ||   ch == ''    // 3 dans un carré
     ||   ch == ''    // 4 dans un carré
     ||   ch == ''    // 5 dans un carré
     ||   ch == ''    // 6 dans un carré
     ||   ch == ''    // 7 dans un carré
     ||   ch == ''    // 8 dans un carré
     ||   ch == ''    // 9 dans un carré
     ||   ch == ''    // 0 dans un carré
     ||   ch == ''    // point dans un carré
     ||   ch == ''    // ESC
     ||   ch == ''    // ||
     ||   ch == ''    // flèche horizontale
     ||   ch == ''    // num lock
     ||   ch == ''    // Alt
     ||   ch == ''    // Barre de bateau
     ||   ch == ''    // scroll lock
     ||   ch == ''    // flèche verticale
     ||   ch == ''    // imprimante
     ||   ch == ''    // cadenas
     ||   ch == ' '    // + dans un carré
     ||   ch == ' ' )  // - dans un carré

       {
         break;
       }


// * FSMOD*

NOTA: Les caractères spéciaux ne sont pas affichés entre les croches du code mais sont présents. Toute action de copier/coller sera effective.

Table de vérité

Pseudos connectés Pseudos affichés
1car.jpg  Delco
2car.jpg  Democok
3car.jpg  UnnamedPlayer
4car.jpg  UnnamedPlayer
5car.jpg  Bel]

-=tongue=-

Publié le 11/03/2019 17:37  Prévisualiser...   Imprimer...   Haut
Saut à l'impact  -  par FSMOD

Saut à l'impact

J'ai codé ce petit effet juste pour le fun. Il consiste à projeter en l'air une cible à une hauteur variable dès qu'elle est touchée par un projectile.
Si elle n'est pas tuée sur le coup elle peut  très bien riposter en l'air.

Le paramètre associé au CVAR g_funKillJump est codé à 300 par défaut mais il peut être redéfini à tout moment durant le jeu ou au préalable, dans le fichier server.cfg .

Modification du code sources

Fichier g_local.h

Après

 extern    vmCvar_t    g_punishRecon;

Ajouter

 extern vmCvar_t g_funKillJump; // *FSMOD* saut de la cible à l'impact

Fichier g_main.c

Après

 vmCvar_t    g_punishRecon;

Ajouter

 vmCvar_t g_funKillJump; // *FSMOD* saut de la cible à l'impact

Après

 { &g_punishRecon, "g_punishRecon", "1", CVAR_ARCHIVE, 0.0f, 0.0f, 0, qfalse },

Ajouter

 { &g_funKillJump,  "g_funKillJump", "300", CVAR_SERVERINFO | CVAR_ARCHIVE,   0.0f,   0.0f,   0,  qfalse  }, // *FSMOD* saut de la cible à l'impact

Fichier g_combat.c

Dans la fonction T_Damage recherchez les lignes suivantes

    // do the damage
    if (take)
    {
        targ->health = targ->health - take;

        if ( targ->client )
        {
            targ->client->ps.stats[STAT_HEALTH] = targ->health;

Insérez juste après, le groupe suivant

 

 // *FSMOD* saut de la cible à l'impact
            switch ( mod & 0xff )
                {

                        case MOD_TRIGGER_HURT_NOSUICIDE:
                        case WP_MM1_GRENADE_LAUNCHER:
                        case WP_RPG7_LAUNCHER:
                        case WP_SMOHG92_GRENADE:
                        case MOD_TARGET_LASER:
                        case WP_M4_ASSAULT_RIFLE:
                        case WP_MP5:
                        case WP_MICRO_UZI_SUBMACHINEGUN:
                        case WP_AK74_ASSAULT_RIFLE:
                        case WP_USAS_12_SHOTGUN:
                        case WP_M590_SHOTGUN:
                        case WP_MSG90A1:
                        case WP_SIG551:
                        case WP_M60_MACHINEGUN:
                        case WP_M1911A1_PISTOL:
                        case WP_USSOCOM_PISTOL:

                    if ( targ->health <= 0 )
                    {
                        targ->client->ps.velocity[2] = 3.2f * sqrt(g_funKillJump.value * (take > 100 ? 100 : take) * 0.75 * DEFAULT_GRAVITY / g_gravity.value);
                            }
                    else
                    {
                        targ->client->ps.velocity[2] = 3.2f * sqrt(g_funKillJump.value * (take > 100 ? 100 : take));
                           }
                    break;
                }
 // *FSMOD*

-=cool=-

Publié le 10/03/2019 18:11  Prévisualiser...   Imprimer...   Haut
Entrée des Bots  -  par FSMOD

Entrée des Bots

Les codes sources soit-disant officiels que j'ai glanés sur le net il y a quelques années présentaient dans leur ensemble quelques incohérences heureusement non bloquantes mais la principale d'entre elles se manifestait par l'impossibilité d'admettre des bots dans le jeu, malgré une configuration rigoureuse. Curieusement leur IA était présente ainsi que toutes les fonctions destinés à leur gestion.

La simple modification suivante les a invités manu-militari, à participer au combat tongue

Modification du code sources

Fichier g_client.c

Dans la fonction ClientConnect recherchez la ligne suivante

 if ( strlen(guid) < 32 )

La remplacer par

 if ( !(isBot) && (strlen(guid) < 32) )  // *FSMOD* Autorise l'arrivéee des bots

-=eek=-

Publié le 10/03/2019 15:47  Prévisualiser...   Imprimer...   Haut
Chargement des Bots  -  par FSMOD

CHARGEMENT DES BOTS

Vous avez sans doute remarqué qu'après une suppression totale des bots au cours du jeu, soit par une action "kick allbots" ou suite à une rotation de map avec chargement d'une nouvelle liste de bots, ces derniers mettaient un temps fou à entrer sur le terrain.

Cette lenteur se révèle préjudiciable dans le cas par exemple où, après une petite map qui ne nécessitait que 4 ou 5 bots, une nouvelle map plus grande était lancée avec une douzaine de bots. Avant que cet objectif numérique soit atteint, il fallait attendre une grosse poignée de secondes.

Voici une petite modification très simple qui va accélérer leur envie de se battre frown

Modification du code sources

Fichier g_bots.c

Dans la fonction G_CheckMinimumPlayers recherchez les lignes suivantes

// only check once each 10 seconds
    if (checkminimumplayers_time > level.time - 10000)

Les remplacer par

// *FSMOD* Vérif toutes les secondes
    if (checkminimumplayers_time > level.time - 1000)

Nota: Une valeur inférieure à 1000 peut être de nature à stresser le serveur et conduire éventuellement au crash.

-=cry=-

Publié le 10/03/2019 14:49  Prévisualiser...   Imprimer...   Haut
Pseudos Bot multiples  -  par FSMOD

Les pseudos multiples des bots

Rocmod dans sa version originelle présente une propension particulière a charger des bots portant le même pseudo. Outre le fait que ce processus n'est guère rationnel, les bots de même nom ont forcement les mêmes paramètres et le jeu perd un peu en diversité.

Un simple suffixe numéral est incrémenté à chaque fois qu'un bot utilise le même pseudo. A noter que cette incrémentation reste valable si d'aventure des joueurs réels se connectent avec le même pseudo, mais dans ce cas cela ne pose pas de problème particulier.

Modification du code sources

Fichier g_client.c

Dans la fonction ClientUserInfoChanged recherchez le passage suivant

 // See if we need to find a new name because the one they chose is taken
    Q_strncpyz ( origname, client->pers.netname,  MAX_NETNAME - 5 );
    while ( G_FindClientByName ( client->pers.netname, clientNum ) )
    {
        Com_sprintf ( client->pers.netname, MAX_NETNAME, "%s(%d)", origname, namecount );
        namecount++;
    }

Remplacez le par

 

/*
    // See if we need to find a new name because the one they chose is taken
    Q_strncpyz ( origname, client->pers.netname,  MAX_NETNAME - 5 );
    while ( G_FindClientByName ( client->pers.netname, clientNum ) )
    {
        Com_sprintf ( client->pers.netname, MAX_NETNAME, "%s(%d)", origname, namecount );
        namecount++;
    }

*/


// *********************** FSMOD On vire les bots de même nom **********************


    Q_strncpyz ( origname, client->pers.netname,  MAX_NETNAME - 30 );

    while ( G_FindClientByName ( client->pers.netname, clientNum ) )
    {

        if ((g_entities[clientNum].r.svFlags & SVF_BOT))

        {
            Com_sprintf ( client->pers.netname, MAX_NETNAME, "%s(%d)", origname, namecount );
              trap_SendConsoleCommand( EXEC_INSERT, va("kick %s",client->pers.netname) );

        }
        else
        {
            Com_sprintf ( client->pers.netname, MAX_NETNAME, "%s ^3[%d]", origname, namecount );

            namecount++;
        }
    }

// ***************************  Fin FSMOD  ************************************

-=smile=-

Publié le 09/03/2019 18:52  Prévisualiser...   Imprimer...   Haut
Ping Bots  -  par FSMOD

Pings Bots

Quelques lignes de code juste pour attribuer un pseudo ping aux bots. Je dis 'pseudo' car ce ping aléatoire au gré des parties, n'affectera en rien leur ping réel qui restera à zéro au regard d'internet. Ce ping artificiel n'apparaitra que dans le panel des scores.

Il existe un autre codage qui permet de leur attribuer un ping réel et falsifier ainsi les statistiques d'un serveur traceur comme GameTracker mais là n'est pas l'objet de ce développement.

Modification du code sources

Fichier g_local.h

Après

 extern    vmCvar_t    g_refereePass;

Ajouter

 extern     vmCvar_t g_botPing;  // *FSMOD* ping aléatoire bots

Fichier g_main.c

Après

 vmCvar_t    g_refereePass;

Ajouter

 vmCvar_t    g_botPing;   // *FSMOD* ping aléatoire bot

Après

 { &g_refereePass, "g_refereePass", "none", CVAR_INTERNAL|CVAR_ARCHIVE, 0.0f, 0.0f, 0, qfalse },

Ajouter

{ &g_botPing, "g_botPing", "0",  CVAR_ARCHIVE, 0, qfalse }, // *FSMOD* ping aléatoire bots 

Fichier g_bot.c

Recherchez la fonction G_CountBotPlayers

La remplacer par la suivante

 

/*
===============
G_CountBotPlayers
===============
*/
int G_CountBotPlayers( int team )
{
    int            i;
    int            n;
    int            num;
    gclient_t      *cl;

    num = 0;

    for ( i=0 ; i< g_maxclients.integer ; i++ )
    {
        cl = level.clients + i;
        if ( cl->pers.connected != CON_CONNECTED )
        {
            continue;
        }

        if ( !(g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) )
        {
            continue;
        }

        if ( team >= 0 && cl->sess.team != team )
        {
            continue;
        }

        if (g_botPing.integer )
        {
            cl->ps.ping = Q_irand(12, 87);  //  *FSMOD* Ping aléatoire pour bots
        }

            num++;

    }

    for( n = 0; n < BOT_SPAWN_QUEUE_DEPTH; n++ )
    {
        if( !botSpawnQueue[n].spawnTime )
        {
            continue;
        }

        if ( botSpawnQueue[n].spawnTime > level.time )
        {
            continue;
        }

        if (g_botPing.integer )
        {
            cl->ps.ping = Q_irand(12, 87);  //  *FSMOD* Ping aléatoire pour bots
        }

        num++;


    }

    return num;
}

Le CVAR g_botPing qui commande la fonction, est en "read only memory". Un changement de la valeur binaire de celui-ci (1 ou 0), ne sera effectif qu'à la rotation de la map.

-=cry=-

Publié le 09/03/2019 16:52  Prévisualiser...   Imprimer...   Haut
Poids des armes  -  par FSMOD

POIDS DES ARMES

Une anomalie propre à SOF2 consiste à ne pas prendre en compte le poids de l'arme dans les mouvements du joueur qui la porte. Ainsi un joueur qui tient un M60 de plus de 10 kilos se meut aussi rapidement que celui qui tient un couteau de 100 grammes. La hauteur des sauts n'est pas non plus affectée par cette différence.

Les codes qui suivent rétablissent la bonne proportion.

Modifications du code sources

Fichier g_local.h

Après

 #define    FOFS(x) ((int)&(((gentity_t *)0)->x))

Ajouter

 

//Ajustement speed et gravity en fonction du poids de l'arme *FSMOD*

extern    vmCvar_t   g_wpnMove; // commande générale

extern    vmCvar_t   g_playerspeed;

extern    vmCvar_t   g_knifeSpeed;
extern    vmCvar_t   g_coltSpeed;
extern    vmCvar_t   g_socomSpeed;
extern    vmCvar_t   g_talonSpeed;
extern    vmCvar_t   g_shotgunSpeed;
extern    vmCvar_t   g_uziSpeed;
extern    vmCvar_t   g_m3a1Speed;
extern    vmCvar_t   g_mp5Speed;
extern    vmCvar_t   g_usasSpeed;
extern    vmCvar_t   g_m4Speed;
extern    vmCvar_t   g_ak74Speed;
extern    vmCvar_t   g_sigSpeed;
extern    vmCvar_t   g_sniperSpeed;
extern    vmCvar_t   g_m60Speed;
extern    vmCvar_t   g_mm1Speed;
extern    vmCvar_t   g_rpgSpeed;
extern    vmCvar_t   g_m84Speed;
extern    vmCvar_t   g_smohgSpeed;
extern    vmCvar_t   g_m15Speed;
extern    vmCvar_t   g_anm14Speed;

extern    vmCvar_t   g_playergravity;

extern    vmCvar_t   g_knifeGravity;
extern    vmCvar_t   g_coltGravity;
extern    vmCvar_t   g_socomGravity;
extern    vmCvar_t   g_talonGravity;
extern    vmCvar_t   g_shotgunGravity;
extern    vmCvar_t   g_uziGravity;
extern    vmCvar_t   g_m3a1Gravity;
extern    vmCvar_t   g_mp5Gravity;
extern    vmCvar_t   g_usasGravity;
extern    vmCvar_t   g_m4Gravity;
extern    vmCvar_t   g_ak74Gravity;
extern    vmCvar_t   g_sigGravity;
extern    vmCvar_t   g_sniperGravity;
extern    vmCvar_t   g_m60Gravity;
extern    vmCvar_t   g_mm1Gravity;
extern    vmCvar_t   g_rpgGravity;
extern    vmCvar_t   g_m84Gravity;
extern    vmCvar_t   g_smohgGravity;
extern    vmCvar_t   g_m15Gravity;
extern    vmCvar_t   g_anm14Gravity;


// Fin *FSMOD*

Fichier g_main.c

Après

 vmCvar_t    g_explosionGore;

Ajouter

 

// Ajustement speed et gravity en fonction du poids de l'arme *FSMOD*

vmCvar_t   g_wpnMove;

vmCvar_t   g_playerspeed;

vmCvar_t   g_knifeSpeed;
vmCvar_t   g_coltSpeed;
vmCvar_t   g_socomSpeed;
vmCvar_t   g_talonSpeed;
vmCvar_t   g_shotgunSpeed;
vmCvar_t   g_uziSpeed;
vmCvar_t   g_m3a1Speed;
vmCvar_t   g_mp5Speed;
vmCvar_t   g_usasSpeed;
vmCvar_t   g_m4Speed;
vmCvar_t   g_ak74Speed;
vmCvar_t   g_sigSpeed;
vmCvar_t   g_sniperSpeed;
vmCvar_t   g_m60Speed;
vmCvar_t   g_mm1Speed;
vmCvar_t   g_rpgSpeed;
vmCvar_t   g_m84Speed;
vmCvar_t   g_smohgSpeed;
vmCvar_t   g_m15Speed;
vmCvar_t   g_anm14Speed;

vmCvar_t   g_playergravity;

vmCvar_t   g_knifeGravity;
vmCvar_t   g_coltGravity;
vmCvar_t   g_socomGravity;
vmCvar_t   g_talonGravity;
vmCvar_t   g_shotgunGravity;
vmCvar_t   g_uziGravity;
vmCvar_t   g_m3a1Gravity;
vmCvar_t   g_mp5Gravity;
vmCvar_t   g_usasGravity;
vmCvar_t   g_m4Gravity;
vmCvar_t   g_ak74Gravity;
vmCvar_t   g_sigGravity;
vmCvar_t   g_sniperGravity;
vmCvar_t   g_m60Gravity;
vmCvar_t   g_mm1Gravity;
vmCvar_t   g_rpgGravity;
vmCvar_t   g_m84Gravity;
vmCvar_t   g_smohgGravity;
vmCvar_t   g_m15Gravity;
vmCvar_t   g_anm14Gravity;

// Fin *FSMOD*

Après

 { &g_motd10, "g_motd10", "", 0, 0.0f, 0.0f, 0, qfalse },

Ajouter

 

// Ajustement speed et gravity en fonction du poids de l'arme *FSMOD*

   { &g_wpnMove, "g_wpnMove", "0",CVAR_SERVERINFO|CVAR_ARCHIVE, 0, 0, qfalse },

   { &g_playerspeed, "g_playerspeed", "1", 0, 0, qfalse },

   { &g_knifeSpeed, "g_knifeSpeed", "1", 0, 0, qfalse },
   { &g_coltSpeed, "g_coltSpeed", "0.95", 0, 0, qfalse },
   { &g_socomSpeed, "g_socomSpeed", "0.95", 0, 0, qfalse },
   { &g_talonSpeed, "g_talonSpeed", "0.95", 0, 0, qfalse },
   { &g_shotgunSpeed, "g_shotgunSpeed", "0.9", 0, 0, qfalse },

   { &g_uziSpeed, "g_uziSpeed", "0.9", 0, 0, qfalse },
   { &g_m3a1Speed, "g_m3a1Speed", "0.9", 0, 0, qfalse },
   { &g_mp5Speed, "g_mp5Speed", "0.9", 0, 0, qfalse },
   { &g_usasSpeed, "g_usasSpeed", "0.9", 0, 0, qfalse },
   { &g_m4Speed, "g_m4Speed", "0.8", 0, 0, qfalse },
   { &g_ak74Speed, "g_ak74Speed", "0.78", 0, 0, qfalse },
   { &g_sigSpeed, "g_sigSpeed", "0.75", 0, 0, qfalse },
   { &g_sniperSpeed, "g_sniperSpeed", "0.70", 0, 0, qfalse },
   { &g_m60Speed, "g_m60Speed", "0.6", 0, 0, qfalse },
   { &g_mm1Speed, "g_mm1Speed", "0.78", 0, 0, qfalse },
   { &g_rpgSpeed, "g_rpgSpeed", "0.7", 0, 0, qfalse },
   { &g_m84Speed, "g_m84Speed", "1", 0, 0, qfalse },
   { &g_smohgSpeed, "g_smohgSpeed", "1", 0, 0, qfalse },
   { &g_m15Speed, "g_m15Speed", "1", 0, 0, qfalse },
   { &g_anm14Speed, "g_anm14Speed", "1", 0, 0, qfalse },

      { &g_playergravity, "g_playergravity", "1", 0, 0, qfalse },

   { &g_knifeGravity, "g_knifeGravity", "1", 0, 0, qfalse },
   { &g_coltGravity, "g_coltGravity", "1", 0, 0, qfalse },
   { &g_socomGravity, "g_socomGravity", "1", 0, 0, qfalse },
   { &g_talonGravity, "g_talonGravity", "1", 0, 0, qfalse },
   { &g_shotgunGravity, "g_shotgunGravity", "1", 0, 0, qfalse },
   { &g_uziGravity, "g_uziGravity", "1", 0, 0, qfalse },
   { &g_m3a1Gravity, "g_m3a1Gravity", "1", 0, 0, qfalse },
   { &g_mp5Gravity, "g_mp5Gravity", "1", 0, 0, qfalse },
   { &g_usasGravity, "g_usasGravity", "1", 0, 0, qfalse },
   { &g_m4Gravity, "g_m4Gravity", "1", 0, 0, qfalse },
   { &g_ak74Gravity, "g_ak74Gravity", "1", 0, 0, qfalse },
   { &g_sigGravity, "g_sigGravity", "1", 0, 0, qfalse },
   { &g_sniperGravity, "g_sniperGravity", "1.1", 0, 0, qfalse },
   { &g_m60Gravity, "g_m60Gravity", "1.5", 0, 0, qfalse },
   { &g_mm1Gravity, "g_mm1Gravity", "1.2", 0, 0, qfalse },
   { &g_rpgGravity, "g_rpgGravity", "1.4", 0, 0, qfalse },
   { &g_m84Gravity, "g_m84Gravity", "1", 0, 0, qfalse },
   { &g_smohgGravity, "g_smohgGravity", "1", 0, 0, qfalse },
   { &g_m15Gravity, "g_m15Gravity", "1", 0, 0, qfalse },
   { &g_anm14Gravity, "g_anm14Gravity", "1", 0, 0, qfalse },

// Fin *FSMOD*

Fichier g_active.c

Dans la fonction ClientThink, après

 client->ps.speed = g_speed.value;

Ajouter

// Ajustement speed et gravity en fonction du poids de l'arme *FSMOD*

    if ( g_wpnMove.integer)

     client->ps.speed *= g_playerspeed.value;
     client->ps.gravity *= g_playergravity.value;

  {

      switch(client->ps.weapon)

   {
      case WP_KNIFE:
         client->ps.speed *= g_knifeSpeed.value;
        client->ps.gravity *= g_knifeGravity.value;
         break;
      case WP_M1911A1_PISTOL:
         client->ps.speed *= g_coltSpeed.value;
         client->ps.gravity *= g_coltGravity.value;
         break;
      case WP_USSOCOM_PISTOL:
         client->ps.speed *= g_socomSpeed.value;
         client->ps.gravity *= g_socomGravity.value;
         break;
      case WP_SILVER_TALON:
         client->ps.speed *= g_talonSpeed.value;
         client->ps.gravity *= g_talonGravity.value;
         break;
      case WP_M590_SHOTGUN:
         client->ps.speed *= g_shotgunSpeed.value;
         client->ps.gravity *= g_shotgunGravity.value;
         break;
      case WP_MICRO_UZI_SUBMACHINEGUN:
         client->ps.speed *= g_uziSpeed.value;
         client->ps.gravity *= g_uziGravity.value;
         break;
      case WP_M3A1_SUBMACHINEGUN:
         client->ps.speed *= g_m3a1Speed.value;
         client->ps.gravity *= g_m3a1Gravity.value;
         break;
      case WP_MP5:
         client->ps.speed *= g_mp5Speed.value;
         client->ps.gravity *= g_mp5Gravity.value;
         break;
      case WP_USAS_12_SHOTGUN:
         client->ps.speed *= g_usasSpeed.value;
         client->ps.gravity *= g_usasGravity.value;
         break;
      case WP_M4_ASSAULT_RIFLE:
         client->ps.speed *= g_m4Speed.value;
         client->ps.gravity *= g_m4Gravity.value;
         break;
      case WP_AK74_ASSAULT_RIFLE:
         client->ps.speed *= g_ak74Speed.value;
         client->ps.gravity *= g_ak74Gravity.value;
         break;
      case WP_SIG551:
         client->ps.speed *= g_sigSpeed.value;
         client->ps.gravity *= g_sigGravity.value;
         break;
      case WP_MSG90A1:
         client->ps.speed *= g_sniperSpeed.value;
         client->ps.gravity *= g_sniperGravity.value;
         break;
      case WP_M60_MACHINEGUN:
         client->ps.speed *= g_m60Speed.value;
         client->ps.gravity *= g_m60Gravity.value;
         break;
      case WP_MM1_GRENADE_LAUNCHER:
         client->ps.speed *= g_mm1Speed.value;
         client->ps.gravity *= g_mm1Gravity.value;
         break;
      case WP_RPG7_LAUNCHER:
         client->ps.speed *= g_rpgSpeed.value;
         client->ps.gravity *= g_rpgGravity.value;
         break;
      case WP_M84_GRENADE:
         client->ps.speed *= g_m84Speed.value;
         client->ps.gravity *= g_m84Gravity.value;
         break;
      case WP_SMOHG92_GRENADE:
         client->ps.speed *= g_smohgSpeed.value;
         client->ps.gravity *= g_smohgGravity.value;
         break;
      case WP_ANM14_GRENADE:
         client->ps.speed *= g_m15Speed.value;
         client->ps.gravity *= g_m15Gravity.value;
         break;
      case WP_M15_GRENADE:
         client->ps.speed *= g_anm14Speed.value;
         client->ps.gravity *= g_anm14Gravity.value;
         break;

      default:
         break;
   }

 }


// Fin *FSMOD*

Les coefficients speed et gravity paramétrés par défaut peuvent être revus et adaptés à votre convenance dans le fichier de configuration du serveur, comme l'exemple ci-dessous propre à mon serveur:

seta g_wpnMove  1  // valide les coeff g_speed et g_gravity en fonction de l'arme (0 par défaut)
 
seta g_knifespeed          1     //"1"
seta g_coltspeed          0.96  //"0.95"
seta g_socomspeed         0.96  //"0.95"
seta g_talonspeed         0.94  //"0.95"
seta g_shotgunspeed       0.9   //"0.9"
seta g_uzispeed           0.9   //"0.9"
seta g_m3a1speed          0.85  //"0.9"
seta g_mp5speed           0.89  //"0.9"
seta g_usasspeed          0.83  //"0.9"
seta g_m4speed            0.84  //"0.8"
seta g_ak74speed          0.85  //"0.78"
seta g_sigspeed           0.91  //"0.75"
seta g_sniperspeed        0.81  //"0.70"
seta g_m60speed           0.6   //"0.6"
seta g_mm1speed           0.80  //"0.78"
seta g_rpgspeed           0.72  //"0.7"
seta g_m84speed           0.99  //"1"
seta g_smohgspeed         0.99  //"1"
seta g_m15speed           0.98  //"1"
seta g_anm14speed         0.97  //"1"

seta g_knifegravity       1     //"1"
seta g_coltgravity        1.11  //"1"
seta g_socomgravity       1.10  //"1"
seta g_talongravity       1.14  //"1"
seta g_shotgungravity     1.20  //"1"
seta g_uzigravity         1.21  //"1"
seta g_m3a1gravity        1.26  //"1"
seta g_mp5gravity         1.19  //"1"
seta g_usasgravity        1.32  //"1"
seta g_m4gravity          1.30  //"1"
seta g_ak74gravity        1.31  //"1"
seta g_siggravity         1.21  //"1"
seta g_snipergravity      1.36  //"1.1"
seta g_m60gravity         1.70  //"1.5"
seta g_mm1gravity         1.34  //"1.2"
seta g_rpggravity         1.50  //"1.4"
seta g_m84gravity         1.05  //"1"
seta g_smohggravity       1.05  //"1"
seta g_m15gravity         1.08  //"1"
seta g_anm14gravity       1.09  //"1"

Les valeurs après les les doubles slashes représentent les valeurs par défaut inscrites dans le code.

Enfin pour les puristes voici un tableau récapitulatif sur le poids approximatif  des armes, leur coefficient speed/gravity et leur impact sur la vitesse et la gravité induites, sur des bases respectives de 340 et 500.
Ces valeurs de base peuvent bien sûr être modifiées dans votre configuration serveur. Les valeurs induites seront toujours proportionnelles en fonction des coefficients attribués.

Le poids du couteau sert de référence basique pour le reste des armes.

ARME POIDS en kg Coef speed Coef gravity Speed (340) Gravity (500)
Knife 0,120 1 1 340 500
Colt 1,2 0,96 1,11 326 555
Socom 1 0,96 1,10 326 550
Talon 1,7 0,94 1,14 319 570
Shotgun 3 0,90 1,20 306 600
Uzi 4,45 0,85 1,26 289 630
M3A1 4,45 0,85 1,26 289 630
MP5 2,9 0,89 1,19 302 595
USAS 5,45 0,83 1,32 282 660
M4 5 0,84 1,30 285 650
AK47 5,1 0,85 1,31 289 655
SIG 3,3 0,91 1,21 309 605
Sniper 6,20 0,81 1,36 275 680
M60 13 0,60 1,70 204 850
MM1 5,7 0,80 1,34 272 670
RPG7 9 0,72 1,50 244 750
M84 0,250 0,99 1 05 336 525
SMOGH 0,270 0,99 1,05 336 525
M15 0,850 0,98 1 08 333 540
ANM14 0,900 0,98 1,09 329 545

-=smile=-

Publié le 09/03/2019 14:53  Prévisualiser...   Imprimer...   Haut
Rubriques

Vous êtes ici :   Accueil » Documentation