Système d'alternance Jour/Nuit

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

Introduction

On retourne travailler à l'élaboration de mods prestigieux qui prouvent à l'ensemble du monde que les Français, les Belges, les Suisses, les Québécois et même les Monégasques savent faire autre chose que de la merde. Cette-fois ci, je propose de faire un système d'alternance jour/nuit des lumières dans une carte. À ce propos je vous conseille le mod Blood IV Honor, sans doute un des plus anciens mods fr.

Création de Lights.h et modification de Lights.cpp

Pour commencer, créez un fichier nommé lights.h et copiez-y les lignes suivantes :

class CLight : public CPointEntity
{
public:
    virtual void    KeyValue( KeyValueData* pkvd );
    virtual void    Spawn( void );
    virtual void    Style( int style );
    void            Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );

    virtual int    Save( CSave &save );
    virtual int    Restore( CRestore &restore );
       
    static        TYPEDESCRIPTION m_SaveData[];

private:
    int            m_iStyle;
    int            m_iszPattern;
};

Vous pouvez trouver ces lignes dans le fichier lights.cpp (elles sont d'ailleurs à supprimer de ce fichier) excepté la fonction Style( int style ), normal, c'est elle qui règle l'intensité des lumières.
Hop, rajoutez #include "lights.h" dans les en-têtes des fichiers lights.cpp et multiplay_gamerules.cpp afin qu'on puisse utiliser la classe CLight.
Dans lights.cpp, dans la fonction CLight::Spawn(), commentez ces lignes, elles m'énervent.

    if (FStringNull(pev->targetname))
    {    // inert light
        REMOVE_ENTITY(ENT(pev));
        return;
    }

Quelque part ailleurs mettez cette fonction :

void CLight :: Style( int style )
{
    switch(style)
    {
        case 0:
            LIGHT_STYLE(m_iStyle, "b");
            break;

        case 1:
            LIGHT_STYLE(m_iStyle, "d");
            break;

        case 2:
            LIGHT_STYLE(m_iStyle, "g");
            break;

        case 3:
            LIGHT_STYLE(m_iStyle, "j");
            break;

        case 4:
            LIGHT_STYLE(m_iStyle, "n");
            break;

        case 5:
            LIGHT_STYLE(m_iStyle, "r");
            break;

        case 6:
            LIGHT_STYLE(m_iStyle, "u");
            break;

        case 7:
            LIGHT_STYLE(m_iStyle, "x");
            break;

        case 8:
            LIGHT_STYLE(m_iStyle, "z");
            break;
    }
}

Vous comprenez qu'en fonction de l'entier style, on fait varier l'intensité de la lumière de a=noir total à z=putain de soleil qui me rappelle le Chili.
C'est fini pour ce fichier.

Modification de multiplay_gamerules.cpp

Ajoutez cette fonction dans la classe CHalfLifeMultiplay :

virtual void SetTime(int heure);

et dans la partie protected :

    int hour;
    int time; 

On passe au fichier multiplay_gamerules.cpp
Dans la fonction CHalfLifeMultiplay :: CHalfLifeMultiplay() ajoutez :

    hour = 1; //Ici on met l'heure à laquelle la partie commence, ici 1 heure du mat, normal il doit faire nuit ;>
    time = gpGlobals->time ;

Au début de la fonction Think(), mettez:

    if (time < gpGlobals->time)
    {
        hour ++;

        if (hour == 24)
            hour = 0;

        SetTime(hour);
    }

On approche de la fin, voici la fonction SetTime

void CHalfLifeMultiplay :: SetTime(int heure)
{
    int style;
    time = gpGlobals->time + 60;
    if (heure == 0)
        style = 0;
    else if ((heure == 1) || (heure == 23))
        style = 0;
    else if ((heure == 2) || (heure == 22))
        style = 1;
    else if ((heure == 3) || (heure == 21))
        style = 2;
    else if ((heure == 4) || (heure == 20))
        style = 3;
    else if ((heure == 5) || (heure == 19))
        style = 4;
    else if ((heure == 6) || (heure == 18))
        style = 5;
    else if ((heure == 7) || (heure == 17))
        style = 6;
    else if ((heure == 8) || (heure == 16))
        style = 6;
    else if ((heure == 9) || (heure == 15))
        style = 7;
    else if ((heure == 10) || (heure == 14))
        style = 7;
    else if ((heure == 11) || (heure == 13))
        style = 8;
    else if (heure == 12)
        style = 8;
       
    for (int i =1 ;i<5;i++)
    {
        CBaseEntity *pLight = UTIL_FindEntityByClassname(NULL,"light_environment");
        if (pLight)
        {
            CLight *pLight2 =(CLight*)pLight;
            pLight2->Style(style);
        }
    }
}

Conclusion

Voilà, c'est fini, comme j'ai beaucoup de soucis en ces temps mouvementés (j'entends les citoyens qui grondent devant les portes de mon palais), vous comprendrez que je n'ai ni commenté ni réellement expliqué. En tout cas çà marche. Pour plus d'informations vous pouvez me contacter par courrier avant le 5 août 2002 minuit, le cachet de la poste faisant « tonk, tonk, tonk » sur une table en fer, ou « flouf, flouf, flouf » sur un sous-main moelleux, merci Pierre.