JeuxOnLineForumsPlusConnectés : 561 (sites) | 1055 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > [recherche] Destruction des NPC la nuit RSS
   
Répondre
Partager Outils Rechercher
Compte #21157
Invité
 

[recherche] Destruction des NPC la nuit

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 ?
Lien direct vers le message - Vieux
Avatar de Mastokk
JOL Mastokk
Alpha & Oméga
 
Avatar de Mastokk
 
On en parle
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
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.
Lien direct vers le message - Vieux
Compte #21157
Invité
 
Ouai merci Jedaï, effectivement, mes gardes portent pratiquement tous le même tag. Jolie
Lien direct vers le message - Vieux
Compte #21157
Invité
 
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
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
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à
Lien direct vers le message - Vieux
Compte #21157
Invité
 
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
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
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.
Lien direct vers le message - Vieux
Compte #21157
Invité
 
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
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
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.
Lien direct vers le message - Vieux
Avatar de Reyan
Reyan [L.D.D]
Roi / Reine
 
Avatar de Reyan
 
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
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
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 !
Lien direct vers le message - Vieux
Avatar de Reyan
Reyan [L.D.D]
Roi / Reine
 
Avatar de Reyan
 
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 )
Lien direct vers le message - Vieux
Compte #21157
Invité
 
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 ?
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
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
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > [recherche] Destruction des NPC la nuit
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 15h18.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite