[script] [Résolu] ( Montrer || Cacher ) les NPCs à heure fixée par variable

Répondre
Partager Rechercher
Mettre un script comme ça dans le "OnHeartbeat" de chaque PNJ...
Code PHP:

void main()
{
    
object oSelf OBJECT_SELF;

    
int nHour GetTimeHour();
    
int nVarHour GetLocalInt(oSelf"HEURE_ACTUELLE");

    if(
nHour != nVarHour)
    {
        
SetLocalInt(oSelf"HEURE_ACTUELLE"nHour);

        
int nAppear GetLocalInt(oSelf"HEURE_APPARITION");
        
int nDisappear GetLocalInt(oSelf"HEURE_DISPARITION");

        if(
nHour == nAppear || nHour == nDisappear)
        {
            
int bStatus GetScriptHidden(oSelf);
            
SetScriptHidden(oSelf, !bStatus);
        }
    }

... ça n'est vraiment pas la mort.

Bon la méthode que je viens de présenter implique de régler le paramètre "Script dissimulé" des PNJs via l'éditeur, ou mettre ce script dans leur "OnSpawn" :
Code PHP:

void main()
{
    
object oSelf OBJECT_SELF;

    
int nHour GetTimeHour();
    
SetLocalInt(oSelf"HEURE_ACTUELLE"nHour);

    
int nAppear GetLocalInt(oSelf"HEURE_APPARITION");
    
int nDisappear GetLocalInt(oSelf"HEURE_DISPARITION");

    
int bHidden == TRUE;
    if(
nAppear nDisappear && (nHour nAppear || nHour >= nDisappear))
        
bHidden == FALSE;
    else if(
nAppear nDisappear && (nHour >= nDisappear && nHour nAppear))
        
bHidden == FALSE;

    
SetScriptHidden(oSelfbHidden);

Bon alors je me suis pas mal battu, mais j'ai fini par y arriver. Pour faire court, heureusement qu'en son temps GrinningFool m'avait aidé, sinon j'aurai rien compris.

En fait, le flag d'activation de l'AI est très important. Je m'en suis rendu compte en voyant que dans la première version de mon script, le OnHeartBeat de mes PNJ cachés continuait à envoyer des informations de débug. Alors que dans nos essais de cette page, non.

Donc, en bidouillant et en déboggant et en mélangeant, j'ai obtenu ça qui marche déjà pas mal.

Code PHP:

void main()
{
    
object oSelf OBJECT_SELF;

    
int nHour GetTimeHour();
    
int nVarHour GetLocalInt(oSelf"HEURE_ACTUELLE");

    if(
nHour != nVarHour)
    {
        
SetLocalInt(oSelf"HEURE_ACTUELLE"nHour);

        
int nAppear GetLocalInt(oSelf"HEURE_APPARITION");
        
int nDisappear GetLocalInt(oSelf"HEURE_DISPARITION");

   
        if (
nHour==nDisappear)
        {
            
SetScriptHidden(oSelf,TRUE,FALSE);
        }
        
        else if (
nHour==nAppear)
        {
            
SetScriptHidden(oSelf,FALSE,TRUE);
        }
    }
    
    
// Code destine au debuggage : à supprimer
    
string strSecond=IntToString(GetTimeSecond());
    
string strMinute=IntToString(GetTimeMinute());
    
string strHour=IntToString(GetTimeHour());
    
string sTexte="Il est "+strHour+":"+strMinute+":"+strSecond;
    
object oJoueur=GetFirstPC();
    
SendMessageToPC(oJoueursTexte);


Mais je me demande encore si la solution avec un événement perso est possible, maintenant que le onHeartBeat reste actif... Je vais tester ça.
Bon voilà, j'ai fait tourner les deux scripts suivants sur les onHeartBeat et onUserDefinedEvent des NPCs. Pour un timer au niveau module, il faudrait apparemment pour faire bien qu'ils souscrivent à une liste onSpawn, bref un machin compliqué que GrinningFool m'a expliqué. Pour l'instant en tout cas ça marche.

Donc, en l'état je peux dire que c'est résolu, et un grand merci à tous ceux qui m'ont aidé.


Code PHP:

// ev_hb_npc_HideShow
/*
    Description:
    runs a timer and launchs event every hour for npc
    
*/
// Alban 070919

void main()
{

    
int nHour GetTimeHour();
    
object oSelf OBJECT_SELF;

    if(
nHour != GetLocalInt(oSelf,"HEURE_ACTUELLE"))
    {
        
// Mise à jour de la variable heure de l'objet
        
SetLocalInt(oSelf,"HEURE_ACTUELLE",nHour);

        
// Hop on envoie le signal "changement d'heure"
        
SignalEvent(oSelf,EventUserDefined(3001));
    }

Code PHP:

//ev_ude_npc_HideShow
/*
    Description:
    checks NPC appear/disappear vars every hour

    * requires :
    HEURE_ACTUELLE : set by script
    HEURE_APPARITION : set by user
    HEURE_DISPARITION : set by user
    
    * returns
    nothing
    
*/
// Alban 070919

void main()
{
    
int nEvent GetUserDefinedEventNumber();
    if(
nEvent == 3001)
    {
        
object oSelf OBJECT_SELF;
        
        
// Récupération des variables du NPC
        
int nHour GetLocalInt(oSelf,"HEURE_ACTUELLE");
        
int nAppear GetLocalInt(oSelf,"HEURE_APPARITION");
        
int nDisappear GetLocalInt(oSelf,"HEURE_DISPARITION");

        if (
nHour == nAppear)
        {
            
// Hop c'est mon heure, j'apparais...
            
SetScriptHidden(oSelf,FALSE,TRUE);
        }
        else if (
nHour == nDisappear)
        {
            
// Hop c'est mon heure, je disparais...
            
SetScriptHidden(oSelf,TRUE,FALSE);
        }
    } 

wep c'est chouette, avec les variable d'apparition/disparition sur les pj tu peut aussi décaler leurs heure ne pas mettre forcément 6 ou 20 h je veut dire.

Citation :
Pour un timer au niveau module, il faudrait apparemment pour faire bien qu'ils souscrivent à une liste onSpawn,
je veut bien plus d'info la dessus ^^.


je sais plus si les objet placeable possède un onheartbeat mais tu peut aussi imaginer de placer le timer sur un objet placeable ou sur la zone..

tout va dépendre ensuite de ta répartition de pnj qui obéissent a se système par zone !
pour un module ou les pnj sont dispersés dans beaucoup de zone ta solution actuel est idéal...
dans un cas ou tu veut veut te servir de ton système pour 3 ville dense de joueur et de pnj la faudra pas hésiter a mettre le timer sur le module tu ne courera pas le risque de réveiller une zone vide de joueur !
( si nwn2 marche comme nwn1 a ce niveau la ?)
Pour les listes, il apparaît qu'il s'agit d'une gestion de pseudo-tableaux, objets auxquels les PNJs s'ajoutent d'eux même sur leur événement onSpawn. Ensuite les pseudo-tableaux font le tour de leurs membres en temps voulu et envoient des événements par exemple.

Pour le moment c'est assez flou mais je sais que GrinningFool et Sunjammer en utilisent. Je devrais mettre la main sur leurs scripts un de ces 4.

Pour le gain de temps / ressources, ça me semble optimal.

Pour le reste, je ne suis pas assez expert pour en parler
Citation :
Publié par Laban
Pour les listes, il apparaît qu'il s'agit d'une gestion de pseudo-tableaux, objets auxquels les PNJs s'ajoutent d'eux même sur leur événement onSpawn. Ensuite les pseudo-tableaux font le tour de leurs membres en temps voulu et envoient des événements par exemple.
C'est une technique de communication utilisée en java pour prévenir une série d'objet d'un évènement(communication entre les javabeans), l'objet qui déclenche possède une liste d'objet à prévenir, cette liste est constituée par l'ajout des différents objets qui désirent être prévenus. C'est assez simple à réaliser. L'objet auprès duquel s'enregistre les objets voulant être prévenus serait ici le module ou un objet de Tag précisé.
ok merci

je vois en gros ce que ca peut donner.
dans le onspawn les pnj s'inscrive dans la liste ou pas et le module envois les events au objets inscrit.

c'est pas bête en effet. enfin ca doit valoir le coup si plusieur type d'event son lancer..
En fait, tu peux soit lancer un évènement, soit une fonction qui prendrait comme paramètre l'objet pnj de la liste, ça permet de catégoriser l'évènement.
En java l'évènement est un objet avec ses variables propres, ici il faudra soit lancer un fonction, soit aller rechercher les paramètres utiles dans des variables modules ou locales.
Allez hop, petite remontée de topic.

Et si maintenant je veux me faire une petite "Baguette d'Apparition/Disparition" de DM ?

Admettons que basiquement, je prenne trois comportements (6h->20h, 20h->6h, "Annuler cycle apparition/Disparition") ? Comment fait-on pour qu'un objet ait trois "Pouvoir Unique" qui modifient les variables d'une cible ?

Détails :
- Pour "Annuler cycle apparition/Disparition", je mettrai les deux variables à 25
- Evidemment, les variables seraient affectéees si la cible n'est pas un joueur (!IsPC)
Tiens je relance la chose : je risque de refaire le système avec une variable en mode binaire qui définirait les plages horaires d'apparition / disparition, du genre

apparaît de 0h à 1h -> 0x00000001
apparaît de 1h à 2h -> 0x00000002
apparaît de 2h à 3h -> 0x00000004
etc.


Une seule variable pour une gestion beaucoup plus fine en somme.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés