Recherche
 
Fermer
Documentation
Toutes les pages
DMFLAGS  -  par FSMOD

DMFLAGS

J'ai constaté que le CVAR dmflags qui fixe le caractère de certains événements, est souvent mal interprété par les managers de serveurs et les valeurs qu'on lui affecte sont souvent très fantaisistes, voire totalement erronées.

Le meilleur moyen de comprendre la fonction de dmflags est encore de recourir à un examen des sources. Dont acte.

Ainsi la biblothèque bg_public.h fixe les valeurs de dmflags comme suit:

code_flags.jpg

puce2.gifInterprétation:

  • dmflags 8   : Le joueur ne subira aucun dommage physique en touchant le sol après avoir sauté depuis un point élevé.
  • dmflags 16 : La valeur de FOV sera fixée à 90 et imposée aux joueurs sans qu'ils puissent en changer.
  • dmflags 32 : Les joueurs se déplaceront sans aucun bruit de pas. A noter que les sauts resteront toutefois audibles.

NOTA :Par défaut, dmflags est fixé à 0 ce qui implique que le capital santé d'un joueur qui se reçoit au sol après avoir sauté d'un point haut sera minoré d'une valeur proportionnelle à la hauteur du saut et à la gravité réglée sur le serveur (g_gravity).

IMPORTANT: Les entiers 8, 16 et 32 peuvent être combinés afin de panacher les différents effets.

Voici un tableau récapitulatif qui reprend toutes les valeurs et rien que les valeurs admises pour dmflags.

DMFLAGS BRUITS DE PAS DOMMAGES SAUT FOV FIXE A 90
0 OUI OUI NON
8 OUI NON NON
16 OUI OUI OUI
24 OUI NON OUI
32 NON OUI NON
40 NON NON NON
48 NON OUI OUI
56 NON NON OUI

Les CVAR dmflags seront de préférence fixés pour chaque map du fichier mapcycle.

puce2.gifPoint particulier

Le CVAR dmflags 16 qui impose un FOV fixe de 90 peut gêner certains joueurs qui trouvent dans d'autres valeurs, un meilleur confort de tir. Je rappelle que les valeurs autorisées sont comprises entre 80 et 100.

Je vous livre un petit truc qui pourra vous affranchir de cette restriction managériale, à condition que vous maitrisiez un peu le langage c.

Cela se passe côté client bien évidement.

   Fichier cg_view.c   

Dans la fonction CG_CalcFov identifiez ce groupe:

  else
    {
        // user selectable
        if ( cgs.dmflags & DF_FIXED_FOV )

        {
            // dmflag to prevent wide fov for all clients
            fov_x = 90;
        }
        else
        {
            fov_x = cg_fov.value;
            if ( fov_x < 1 )
            {
                fov_x = 1;
            }
            else if ( fov_x > 160 )
            {
                fov_x = 160;
            }
        }

Remplacez la valeur 90 par celle de votre choix entre 80 et 100.

Ou bien alors, si vous désirez pouvoir choisir votre FOV en cours de jeu, remplacez tout le texte précédent par celui-ci:

 else
    {

            fov_x = cg_fov.value;
            if ( fov_x < 1 )
            {
                fov_x = 1;
            }
            else if ( fov_x > 160 )
            {
                fov_x = 160;
            }

puce2.gif ATTENTION: Cette modification pourrait être interprétée comme un artifice de triche de la part du manager, car votre action ne s'inscrit pas vraiment dans l'optique de gestion de son serveur. frown

Do as you like !

DRAKKAR n'est pas aussi restrictif, quoique....... cool

-=eek=-

Publié le 17/06/2019 20:04  Prévisualiser...   Imprimer...   Haut
Alerte munitions  -  par FSMOD

Alerte munitions

Lorsque le chargeur de votre arme présente une certaine quantité de munitions restantes, le compteur de la barre inférieure s'affiche en rouge. Il n'est pas toujours très aisé de le voir dans un combat acharné. 

Cette petite modification permettra d'afficher à gauche de l'écran une alerte beaucoup plus visible .rolleyes

lowammo.jpg

Modification du code sources

Tout se passe côté client

Fichier cg_newDraw.c

Dans la fonction CG_DrawPlayerWeaponClip remplacez la ligne

 if ( value <= (weaponData[cg.weaponSelect].attack[ATTACK_NORMAL].clipSize / 6) )

Par la suivante

 if ( value <= (weaponData[cg.weaponSelect].attack[ATTACK_NORMAL].clipSize * 20/100) ) *FSMOD* calcul restant

Remplacez le groupe

 if ( weaponToDraw == cg.weaponSelect && value <= (weaponData[weaponToDraw].attack[ATTACK_NORMAL].clipSize / 6) )
                {
                    VectorSet ( ammocolor, 1.0f, 0.2f, 0.2f );
                }
                else if ( weaponToDraw != cg.weaponSelect && value == 0 )
                {
                    ammocolor[3] = 0.5f;
                }

Par le suivant

  // *FSMOD* Low ammo

    // si capacité clip inférieur a 1 pas d'affichage Low Ammo (cas des grenades ou du couteau)
        if ( weaponToDraw == cg.weaponSelect
              && value <= (weaponData[weaponToDraw].attack[ATTACK_NORMAL].clipSize * 20/100)
              &&  (weaponData[weaponToDraw].attack[ATTACK_NORMAL].clipSize >1 ))

                {
                    VectorSet ( ammocolor, 1.0f, 0.2f, 0.2f );

                    CG_DrawText (20,240, cgs.media.hudFont, 0.55f , colorRed, va("^7! ^$Low Ammo ^7!"), 0, DT_OUTLINE );

                }

 // *FSMOD*

-=cry=-

Publié le 21/03/2019 17:15  Prévisualiser...   Imprimer...   Haut
Crosshair Sniper  -  par FSMOD

Crosshair Sniper

Force est de constater que le réticule de visée (crosshair) est disponible pour toutes les armes sauf pour le fusil sniper MSG90A1.

C'est normal, pourrait-on répondre dans un esprit purement cartésien, attendu que ce genre d'arme est prévue pour le tir lointain. Toutefois j'ai préféré le doter d'un crosshair même pour le combat rapproché. Cette aide de visée n'en est pas vraiment une, vu le manque de précision et le recul de l'arme en tir instinctif, mais elle permet toutefois de "dégrossir" l'angle de tir.

J'ai prévu néanmoins un CVAR qui permet au tireur puriste d'annuler cette aide étant donné qu'elle est disponible par défaut.

Modification du code sources

Tout se passe côté client

Fichier cg_local.h

Après

 extern    vmCvar_t        cg_shellEjection;

Insérez la ligne suivante

 extern    vmCvar_t        cg_CrosshairSnip;   // *FSMOD* Crosshair hors zoom

Fichier cg_main.c

Après

 vmCvar_t     cg_stats;

Insérez la ligne suivante

 vmCvar_t    cg_CrosshairSnip;  // *FSMOD* Crosshair hors zoom

Après

 { &cg_footsteps, "cg_footsteps", "1", CVAR_CHEAT },

Insérez la ligne suivante

 { &cg_CrosshairSnip, "cg_CrosshairSnip", "1", CVAR_ARCHIVE },  // *FSMOD* Crosshair hors zoom

Fichier cg_draw.c

Dans la fonction CG_DrawCrosshair, remplacez le groupe

 // If zoomed or unzoomed with the sniper rifle dont draw the standard crosshair
    zoomed = (cg.predictedPlayerState.pm_flags&PMF_ZOOMED);
    if ( zoomed || (cg.predictedPlayerState.weapon==WP_MSG90A1 && !zoomed) )
    {
        return;
    }

Par le groupe suivant

 // *FSMOD* Conserve le réticule de visée hors zoom
        zoomed = (cg.predictedPlayerState.pm_flags&PMF_ZOOMED);
    if ( zoomed ||(!cg_CrosshairSnip.integer && cg.predictedPlayerState.weapon==WP_MSG90A1) )
    {
        return;
    }
 // *FSMOD*

Le CVAR cg_CrosshairSnip pourra être associè à un bind. Il prendra les valeurs suivantes:

cg_CrosshairSnip 0 : Le crosshair n'est visible qu'en mode ZOOM.
cg_CrosshairSnip 1 : Le crosshair est toujours visible.

-=frown=-

Publié le 21/03/2019 16:32  Prévisualiser...   Imprimer...   Haut
Variation sur les BOTS  -  par FSMOD

Variations sur les BOTS

Par défaut, SOF reconnait les bots inscrits dans le fichier bots.txt, lui même inclus dans le répertoire botfiles. Ce fichier est limité en taille (8192 octets) et ne peut abriter qu'une cinquantaine de bots. Même si vous ne prévoyez qu'une dizaine de bots dans une map par le biais du CVAR bot_minplayers, leur panachage ne sera pas optimum et d'une map à l'autre on pourra rencontrer les mêmes pseudos avec les mêmes paramètres associés.

A dessein de bénéficier d' une plus grande diversité il y a deux solutions pour offrir au pointeur de chargement des bots, un choix plus large.

1ère solution

Augmentation de la taille du fichier bots.txt.

Pour ce faire il convient de recoder la bibliothèque bg_public.h comme suit:

 #define MAX_BOTS_TEXT   16384 // AV 8192   *FSMOD* augmentation taille fichier bots.txt

Avec cette nouvelle taille, le fichier bots.txt pourra accueillir une bonne centaine de bots.

2ème solution

La plus longue en matière de rédaction. Il suffit d'utiliser le CVAR g_botsFile. Ce CVAR permet de charger des fichiers bots qui pourront être personnalisés pour chaque map. Ces fichiers sont de la même conception que le fichier bots.txt mais peuvent être réduits en taille de manière à contenir moins de bots.

Une méthode simple

Sur le serveur, créer un répertoire dans la racine du mode que l'on nommera par exemple, multibot

Ecrire dans ce répertoire plusieurs fichiers qui seront nommés a.txt, b.txt, c.txt, etc... . L'idéal est de créer autant de fichiers que de maps inscrites dans le mapcycle. Chacun de ses fichiers accueillera une trentaine de bots avec leur nom unique.

Dans le fichier mapcycle entrer pour la map une ligne sur le modèle suivant:

g_botsFile "multibot/a.txt"

La map suivante recevra cette ligne:

g_botsFile "multibot/b.txt"

et ainsi de suite. Chaque map aura donc son propre fichier associé. D'une map à l'autre, la totalité des pseudos des bots sera ainsi renouvelé.

Afin d'éviter tout mélange de bots il conviendra également d'introduire pour chaque map la commande kick allbots qui permettra ainsi d'éliminer tous les bots du fichier texte précédent et de préparer l'arrivée des nouveaux.

Le simple extrait suivant d'un fichier mapcycle récapitule ce qui précède:

}
 map4
 {
 Command "map arm2;kick allbots"
   cvars
   {
      g_botsFile "multibot/d.txt"
       scorelimit "30"
      bot_minplayers "4"

   }
 }
  map5
 {
 Command "map mp_hk2;kick allbots"
   cvars
   {
      g_botsFile "multibot/e.txt"
      scorelimit "50"
      bot_minplayers "12"

   }
 }

Il faut toutefois remarquer que les bots devront entrer rapidement dans la map à chaque nouvelle rotation, aussi est-il recommandé de recoder les sources comme je l'ai indiqué dans l'onglet CODAGE / CHARGEMENT DES BOTS.

-=smile=-

Publié le 19/03/2019 16:55  Prévisualiser...   Imprimer...   Haut
Limitation BOTS  -  par FSMOD

Limitation des BOTS

Penchons nous sur le cas suivant:

Le serveur tourne en DM avec un CVAR bot_minplayers à 12. Il y donc 12 bots sur le terrain. Un vote est lancé avec agrément des autres joueurs afin que la map soit relancée en CTF. Comme il s'agit d'un jeu d'équipe et conformément à la valeur du CVAR bot_minplayers, chaque équipe se verra dotée de 12 joueurs, soit un total général de 24 bots sur le terrain.

Or le manager du serveur, par souci financier, n'a loué que 16 slots. Les bots vont donc occuper tous les slots en bloquant ainsi l'accès au serveur pour tout joueur voulant se connecter, assorti du message d'alerte "Server Full".

Nota: Pour mémoire, le nombre de slots alloués sur le serveur est fixé par le CVAR sv_maxclients.

Un moyen radical et plus sûr est d'empêcher SOF2 de charger plus de bots que de slots alloués.

Modification du code sources

Fichier g_local.h

Après

 extern    vmCvar_t    g_dropWeapon;

Insérez la ligne suivante

 extern    vmCvar_t    g_slot;              // *FSMOD* Limitation BOTS

Fichier g_main.c

Après

 vmCvar_t    g_dropWeapon;

Insérez la ligne suivante

 vmCvar_t    g_slot;   // *FSMOD* Limitation BOTS

Après

 { &g_dropWeapon, "g_dropWeapon", "0", CVAR_ARCHIVE, 0.0f, 0.0f, 0, qfalse },

Insérez la ligne suivante

 { &g_slot, "g_slot", "6", CVAR_SERVERINFO|CVAR_ARCHIVE, 0.0f, 0.0f, 0, qfalse }, // *FSMOD* Limitation BOTS

Dans la fonction CheckVote recherchez le groupe

 if ( strstr( level.voteString, "g_gametype" ) )
        {
            trap_SendConsoleCommand( EXEC_APPEND, "map_restart 0n" );
        }

Le remplacer par le groupe suivant

 if ( strstr( level.voteString, "g_gametype" ) )
        {
            trap_SendConsoleCommand( EXEC_APPEND, "map_restart 0n" );
            trap_SendConsoleCommand( EXEC_APPEND, va("bot_minplayers %i n", g_slot.integer )); // *FSMOD* Limitation BOTS
        }

Le CVAR g_slot est fixé à 6 par défaut mais il peut être défini par n'importe quelle autre valeur dans le fichier server.cfg,  en fonction du nombre de slots loués sur le serveur.

-=confused=-

Publié le 17/03/2019 01:25  Prévisualiser...   Imprimer...   Haut
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
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 FSMOD et  une commande directe est disponible.

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

Les considérant parfois trop envahissants, voici un filtre qui les éliminera.

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]

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
Rubriques

Vous êtes ici :   Accueil » Documentation