[recherche] Destruction des NPC la nuit

Répondre
Partager Rechercher
J'ai rien trouvé en cherchant dans les archives de Maskado, si quelqu'un peut me dépanner sur le pouce.

Quels script doit-on mettre dans l'evenement de la zone pour détruire les NPC pendant la nuit, en fait, ils doivent tous partir sauf les gardes, is it possible ?
Oui mais veux tu les faire réapparaître après ? That is the question !

Je te propose un schéma basé sur ma réponse au post sur les loups garous, mais laisse à ton entière responsabilité le script de recréation.

Nota : j'ai considéré que tu avais adopté la convention de nommage suivante : tous les gardes ont un tag en "guard_", je ne peux pas faire mieux si tu ne me donne pas plus de détail.

Par ailleurs à toi d'adapter, pour l'instant ce script fait simplement disparaître les NPCs, tu pourrais essayer de simuler une ruée sur les portes les plus proches et les faire disparaître là, c'est relativement facile.

Code PHP:

//spawn de la zone

void main()
{
    
    
float fTime HoursToSeconds(GetTimeHour()) + GetTimeMinute()*60.0 GetTimeSecond();
    if(
HoursToSeconds(22)>fTime && fTime<HoursToSeconds(7))
    {
        if(
fTime >= 0.0)
        {
            
float fFirst HoursToSeconds(7) - fTime;
        }
        else
        {
            
float fFirst HoursToSeconds(9) -(HoursToSeconds(22) - fTime);
        }
        
DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000));
        
SignalEvent(OBJECT_SELFEventUserDefined(4001));
    }
    else
    {
        
float fFirst HoursToSeconds(22) - fTime;
        
DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000));        
    }
    
    
    
//ici évidemment on peut mettre ce qu'on veut

Code PHP:

//ude de la zone

void main()
{
    switch(
GetUserDefinedEventNumber())
    {
        
//...
        
case 4000 :
            
DelayCommand(HoursToSecond(9), SignalEvent(OBJECT_SELFEventUserDefined(4001)));
            
            
object oRef GetFirstObjectInArea(OBJECT_SELF);
            
object oCre GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_NOT_PCoRef1);
        
            
int nNth 1;
            while(
GetIsObjectValid(oCre))
            {
                if(
GetStringLeft(GetTag(oCre), 6) != "guard_")
                {
                    
DestroyObject(oCre);    
                }
                
nNth++;
                
oCre GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_NOT_PCoRefnNth);
            }
            break;
            
        case 
4001 :
            
DelayCommand(HoursToSecond(15), SignalEvent(OBJECT_SELFEventUserDefined(4000)));
        
            
//Ici ton code de recréation
        
            
break;
        
//...
    
}

Avec ce code, tes NPCs seront détruit à 22h et recréés à 7h (si tu les recrées.
Ouai merci Jedaï, effectivement, mes gardes portent pratiquement tous le même tag. Jolie
Aprés maintes et maintes manipulation de ce script, je n'arrive toujours pas à la faire fonctionner malgré l'exemple du loup garou.

Déja, je n'arrive pas à compiler le premier (destruction des PNJ)

je rencontre un problème dans le 1er script:

Code PHP:

DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000
Unknow state in compiler (ligne 15 du script).

ET pour le 2eme, Je ne comprend pas quand Jedaï demande le code de recréation...Que veut tu dire par là s'il te plait ?

Et j'ai également une erreur de compilation à cette ligne

Code PHP:

DelayCommand(HoursToSecond(9), SignalEvent(OBJECT_SELFEventUserDefined(4001))); 

.

"Undefined Identifier" pour celui ci...

J'ai vraiment besoin d'un coup de main. Merci
Hum Zariel, si tu n'arrives pas à corriger des erreurs aussi minimes, tu devrais faire un cours de debugging vite fait....
Je pense qu'on devrait vraiment faire cette liste de message d'erreur dont quelqu'un avait parlé, ça aiderait visiblement beaucoup de monde....


Alors, commençons ici :
Unknow state in compiler (ligne 15 du script).
Code PHP:

DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000)); 

Bon, "état inconnu dans le compilateur" ???
Le message d'erreur est on ne peut plus explicite...
En réalité, avec ce message, la première chose à faire est de vérifier la structure de la ligne indiquée, si on trouve rien, on vérifie la ligne juste au-dessus, etc...

Ici, c'est facile,
* on vérifie qu'il y a bien un ";" à la fin de la ligne, OK,
* on compte les parenthèses ouvrantes : 3, les parenthèses fermantes : 2, c'est bon on a trouvé l'erreur, il manque une parenthèse, nouvelle version :
Code PHP:

DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000))); 

C'est bon, le compilateur compile (en fait j'ai pas vérifié mais bon )


Deuxième erreur :
Code PHP:

DelayCommand(HoursToSecond(9), SignalEvent(OBJECT_SELFEventUserDefined(4001))); 

"Undefined identifier"
Identifiant indéfini....
Autrement dit, il y a sur cette ligne un "mot" qu'il ne comprend pas, soit une fonction, soit une variable, les fonctions sont faciles à vérifier :
on double clique sur chaque fonction, et si aucune aide n'apparait en bas, c'est que la fonction ne fait pas partie des fonctions reconnues par le compilateur (s'il s'agit d'une des nôtre, c'est normal), ici, HoursToSecond ne provoque aucune réaction... Du coup on s'aperçoit qu'il manque un s à la fin (ouais une heure, ça fait beaucoup de secondes), on corrige donc :
Code PHP:

DelayCommand(HoursToSeconds(9), SignalEvent(OBJECT_SELFEventUserDefined(4001))); 

Et voilà
Merci beaucoup Jedaï ! Promis, je vais me mettre au tutorial des quiches ! J'en ai marre aussi de vous déranger pour des choses comme ça. J'ai un peu honte
Pour ce qui est du script de "recréation", il s'agit du script qui va faire réapparaître les PNJs sur la zone à la fin de la nuit, tu as un tas de possibilités diverses mais je ne sais pas exactement ce que tu as déjà fait comme boulot là dessus.
Désolé mais dernière chose:

Quand tu me demandes quel travail j'ai effectué pour que les PNj réaparraissent, je te répond que je n'ai pondu aucun script la déssus. Il s'agit de faire disparaitre les PNJ (qui ont un blueprint différent mais le meme tag) et de ne laisser que les gardes dans la ville (qui portent un tag guard_).

Peux tu m'aider pour faire réaparraitre les gardes la nuit et tous faire réapparaitre le jour (PNJ+GUARD) ?

De plus, aucun des 2 scripts ne se compilent

J'ai une erreur ligne 21 dans le 1er script:
Code PHP:

DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000)); 

erreur: Unknow state in compiler.

D'aprés moi le nombre de parenthèses est bon, par rapport aux ouvertes et fermées .

Dans le deuxieme script:

Code PHP:

case 4001 
Erreur: Skipping declaration via "case" stratement disallowed

Et là, je ne trouve pas
Relis mes dernières réponses Zariel...

Pour le "case 4001 :" qui pose problème, essaie de tout supprimer, recompiler et refaire un copier coller, le compilateur Bioware a parfois du mal avec les switch-case.
et surtout il ne supporte pas les déclarations de variables dans le switch, faut les faire avant

et pour le topic erreurs, ba j'en avait déjà pas mal de référencé dans un .txt, mais g du formater, donc ba g réouvert un erreurs.txt

truc idiot qd on a un gros tas de parenthèse (qui à dit tt un script ) qui merde parce qu'il en manque une : on copmte +1 qd ca ouvre -1 qd ca ferme ^_^

DelayCommand(fFirst, SignalEvent(OBJECT_SELF, EventUserDefined(4000));

1, 2, 3, 2, 1, il manque une fermeture


et donc
Erreur: Skipping declaration via "case" stratement disallowed
est bien typique de la déclaration intraswitch

donc :

Code PHP:

void main()
{
object oRefoCre;
int nNth;
    switch(
GetUserDefinedEventNumber())
    {
        
//...
        
case 4000 :
            
DelayCommand(HoursToSecond(9), SignalEvent(OBJECT_SELFEventUserDefined(4001)));
            
            
oRef GetFirstObjectInArea(OBJECT_SELF);
            
oCre GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_NOT_PCoRef1);
        
            
nNth 1;

... 
et voila, ca ca marchera en théorie

courage, le vrai défi dans les script, c'est pas de les faire, c'est de les faire marcher
Exact, j'avais oublié de vérifier ça (pourtant "skipping declarations" aurait dû me mettre sur la voie, sorry) mais la solution que tu propose Reyan est souvent une erreur, en fait le seul cas où elle est bonne, c'est quand on est sûr qu'on emploiera bien ces variables dans et à l'extérieur du switch-case, ou au moins qu'on les emploiera forcément dans le switch-case....
Ce que ne supporte pas le compilateur en fait, c'est qu'on déclare des variables dans un bloc mais qu'à l'exécution, on ne passe pas forcément sur ces déclarations, même si on passe dans le bloc, je ne connais pas suffisamment l'assembleur pour dire pourquoi mais je suppose que ça doit poser un problème quelconque d'allocation mémoire.
La bonne solution consiste donc à créer proprement un bloc qui définira une portée pour les variables déclarées à l'intérieur, ainsi, ceci compile :
Code PHP:

//ude de la zone

void main()

{
    switch(
GetUserDefinedEventNumber())
    {
        
//...
        
case 4000 :
        {
            
DelayCommand(HoursToSeconds(9), SignalEvent(OBJECT_SELFEventUserDefined(4001)));

            
object oRef GetFirstObjectInArea(OBJECT_SELF);
            
object oCre GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_NOT_PCoRef1);

            
int nNth 1;
            while(
GetIsObjectValid(oCre))
            {
                if(
GetStringLeft(GetTag(oCre), 6) != "guard_")
                {
                    
DestroyObject(oCre);
                }
                
nNth++;
                
oCre GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_NOT_PCoRefnNth);
            }
            break;
        }

        case 
4001 :
            
DelayCommand(HoursToSeconds(15), SignalEvent(OBJECT_SELFEventUserDefined(4000)));

            
//Ici ton code de recréation

            
break;
        
//...
    
}

Ainsi, pas de déclaration si elles sont inutiles et un code qui s'exécutera sans problème.

A part ça, je te signale Zariel que j'avais déjà expliqué dans ma première réponse pourquoi la ligne :
Code PHP:

DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000)); 

était fausse.
Et je t'avais fourni la correction !
super, merci bcp, une bonne réponse qui vas aider ^_^ pis qui ressemble un peu moins à du ca-marche-comme-ca-alors-cherche-pas
pis ca va méviter de remonter de 300 lignes dans le switch pour déclarer ma variable que g besoin qu'au case 501:
(pis ca doit même être de l'optimisation ca non ? )

(parce que ca m'avait qd même fais ***** cet histoire de reur: Skipping declaration via "case" stratement disallowed )
Je sais Jedaï mais même en essayant d'appliquer ta correction, mon script ne fonctionnait pas, c'est à dire que mes PNJ restent en ville la nuit

Je crois que les deux scripts sont compilés je met donc, le 1er sur le OnHeartbeat de la zone et le 2eme sur le UDE, toujours de la zone, c'est ça ?
Jedai :
Citation :
//spawn de la zone
D'après toi, ceci peut-il signifier que le script qui suit se met sur le OnHeartBeat ?


Jedai :
Citation :
* on compte les parenthèses ouvrantes : 3, les parenthèses fermantes : 2, c'est bon on a trouvé l'erreur, il manque une parenthèse, nouvelle version :

DelayCommand(fFirst, SignalEvent(OBJECT_SELF, EventUserDefined(4000)));
Zariel :
Citation :
J'ai une erreur ligne 21 dans le 1er script:

DelayCommand(fFirst, SignalEvent(OBJECT_SELF, EventUserDefined(4000));

erreur: Unknow state in compiler.

D'aprés moi le nombre de parenthèses est bon, par rapport aux ouvertes et fermées .
Jedai :
Citation :
A part ça, je te signale Zariel que j'avais déjà expliqué dans ma première réponse pourquoi la ligne :

DelayCommand(fFirst, SignalEvent(OBJECT_SELF, EventUserDefined(4000));

était fausse.
Et je t'avais fourni la correction !
Zariel :
Citation :
Je sais Jedaï
Ces citations sont dans l'ordre chronologique, si si....
Arg


@Reyan > Vi, c'est de l'optimisation, parce que quand on déclare des variables qu'on utilise pas, on gaspille à la fois de la mémoire et du temps CPU. (Enfin c'est pas très sensible mais bon )
Et pis ça fait plus propre
Merci de me retraçer le fil de la disctussion mais même ces corrections appliquées et la compilation des scripts, la zone ne se dépeuple pas la nuit.

C'est surtout cela que je voulais dire.

Et quand tu me dis OnSpawn de la zone...Je ne vois pas ce que c'est.
Ca serait bien, mais vu qu'il n y a effectivement pas de OnSpawn pour les zones (là j'ai l'air un peu con... )

Enfin tu peux bricoler ça avec un script de type DoOnce dans le OnHeartBeat, mais je te le donnerais pas, na, tu m'as vexé !

(@ Reyan > y a bien une possibilité, avec les WP et le OnSpawn des PNJs, mais faut un WP par tag de PNJ et surtout, où vas-tu les mettre, tous ces PNJs ? )
Citation :
Provient du message de Jedaï
Enfin tu peux bricoler ça avec un script de type DoOnce dans le OnHeartBeat, mais je te le donnerais pas, na, tu m'as vexé !
Excuse moi Jedaï mais ce n'était vraiment pas le but, j'en suis désolé. Mais ce script me prend tellement la tête que je ne sais plus quoi pensé, je l'abandonne ou pas ?

En tous cas, désolé.
euh, g vite parcouru le script, et en gros tu vérifie au début l'heure qu'il est, tu ajuste pour supprimer tt le monde à 22h ou aprè, pis tu delay jusqu'a que ce soit l'heure ?
ba un onenter avec une incrémentation ? genre :
Code PHP:

//onenter de la zone

void main()
{
   
int nNb GetLocalnt(OBJECT_SELF"ON_SPAWN");
if(
nNb) return;
else   
SetLocalnt(OBJECT_SELF"ON_SPAWN"TRUE);
    
float fTime HoursToSeconds(GetTimeHour()) + GetTimeMinute()*60.0 GetTimeSecond();
    if(
HoursToSeconds(22)>fTime && fTime<HoursToSeconds(7))
    {
        if(
fTime >= 0.0)
        {
            
float fFirst HoursToSeconds(7) - fTime;
        }
        else
        {
            
float fFirst HoursToSeconds(9) -(HoursToSeconds(22) - fTime);
        }
        
DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000));
        
SignalEvent(OBJECT_SELFEventUserDefined(4001));
    }
    else
    {
        
float fFirst HoursToSeconds(22) - fTime;
        
DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000));        
    }
    
    
    
//ici évidemment on peut mettre ce qu'on veut

nan ? g rien compris ? dsl, g pas trop cherché
Et bien meme en corrigant les parenthéses sur ce script et en le recompilant j'obtient une PARSING VARIABLE LIST sur cette ligne :

Code PHP:

int nNb GetLocalnt(OBJECT_SELF"ON_SPAWN"); 

C'est parce qu'il manque le I de Int, suffit de mettre :
Code PHP:

int nNb GetLocalInt(OBJECT_SELF"ON_SPAWN"); 

J'avoue que là c'était un peu vicieux, mais en double-cliquant sur la fonction, tu aurais pu voir qu'elle avait un problème...


Citation :
Excuse moi Jedaï mais ce n'était vraiment pas le but, j'en suis désolé.
Ne t'inquiète pas je disais ça pour rire

Sinon, l'idée de Reyan est très bonne, meilleure que la mienne en fait puisqu'elle exigera moins de charge CPU, cependant, je mettrai plutôt ça ainsi :
Code PHP:

//onenter de la zone



void main()

{

    if( ! 
GetLocalInt(OBJECT_SELF"ON_SPAWN") )
    {
    
SetLocalInt(OBJECT_SELF"ON_SPAWN"TRUE);
    
float fTime HoursToSeconds(GetTimeHour()) + GetTimeMinute()*60.0 GetTimeSecond();
    if(
HoursToSeconds(22)>fTime && fTime<HoursToSeconds(7))
    {
        if(
fTime >= 0.0)
        {
            
float fFirst HoursToSeconds(7) - fTime;
        }
        else
        {
            
float fFirst HoursToSeconds(9) -(HoursToSeconds(22) - fTime);
        }
        
DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000));
        
SignalEvent(OBJECT_SELFEventUserDefined(4001));
    }
    else
    {
        
float fFirst HoursToSeconds(22) - fTime;
        
DelayCommand(fFirstSignalEvent(OBJECT_SELFEventUserDefined(4000));        
    }   
    }

    
    
//ici évidemment on peut mettre ce qu'on veut

Ben ça supprime une variable intermédiaire inutile (nNb) puisqu'on utilise une seule fois cette valeur. Puis c'est plus 'élégant' de faire ça :
Code PHP:

if( ! GetLocalInt(OBJECT_SELF"ON_SPAWN") )
{
//blabla

que ça :
Code PHP:

int nNb GetLocalnt(OBJECT_SELF"ON_SPAWN");
if(
nNb) return;
else   
SetLocalnt(OBJECT_SELF"ON_SPAWN"TRUE);
//blabla 
Avec un else qui sert à rien en plus

En fait, ma principale raison, c'est que tu avais laissé :
Code PHP:

//ici évidemment on peut mettre ce qu'on veut 

à la fin de ton script, alors qu'évidemment cette partie n'aurait pas eu le comportement d'un OnEnter classique, mais elle aussi d'un OnSpawn de zone, ce qui n'était absolument pas ce que je voulais dire quand j'ai écrit cette ligne.
Répondre

Connectés sur ce fil

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