JeuxOnLineForumsPlusConnectés : 273 (sites) | 413 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > encore un qui joue les manchot ... RSS
   
Répondre
Partager Outils Rechercher
Avatar de Reyan
Reyan [L.D.D]
Roi / Reine
 
Avatar de Reyan
 

encore un qui joue les manchot ...

alors, je sais, c'est pas la première fois qu'il en est question, mais là je séche. C'est pas vraiment important, ni grave, c'est juste pour la frime et ca dure deux seconde, mais maintenant que le reste marche bien, autant aller jusqu'au bout
je m'explique
j'ai un chef mercenaire qui doit confier une mission, donc on introduit les PJ ds le bureau pdt que mon chef s'entraine (pour la montre) ca patiente 2 sec, le chef range ses jouets, tape la discut, les pj sont virés et le chef reprend son entrainement. jusque la ca va.
j'ai mis ca dans un OnHeartBeat, parce que de toute facon c un module euh, one shot (c ca ?) pour pas bcp de gens, pis voila
donc le truc c'est que y a une variable sur le chef, et toute les 6 sec ca vérifie si il doit continuer l'entrainement
le onheartbeat

Code PHP:
void main()
{
  
int nTraining01 GetLocalInt(OBJECT_SELF"TRAINING01");
  
int nTraining02 GetLocalInt(OBJECT_SELF"TRAINING02");
   if(
nTraining01 == 2)
     {
        
//si l'entrainement est finit
        
if(nTraining02 == 1)
          {
           
//arretez l'entrainement si c'est pas fait
           
ClearAllActions();
           
ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_LEFTHAND));
           
ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND));

           
//et lancer dialogue
           
object oPC GetNearestCreature(CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_IS_PC);
           
ActionMoveToObject(oPC);
           
ActionStartConversation(oPC);
           
ActionDoCommand(SetLocalInt(OBJECT_SELF"TRAINING02"0));
          }
     }
   else
     {
        
//entrainement
        //pour trouver les 2 epee dans l'inventaire :
       //-----------------------------------
        
int i1 TRUE;
        
int i2 TRUE;

        
object oEpee01 GetFirstItemInInventory();
        
object oEpee02 GetFirstItemInInventory();

        while(
i1 && GetIsObjectValid(oEpee01))
           {
           if(
oEpee01 == GetObjectByTag("EPEE_01"))
           
i1 FALSE;
           else
           
oEpee01 GetNextItemInInventory();
           }
        while(
i2 && GetIsObjectValid(oEpee02))
           {
           if(
oEpee02 == GetObjectByTag("EPEE_02"))
           
i2 FALSE;
           else
           
oEpee02 GetNextItemInInventory();
           }
       
//-----------------------------------
       //une fois qu'elles sont trouvee, on les equipes
        
ActionEquipItem(oEpee01INVENTORY_SLOT_RIGHTHAND);
        
ActionEquipItem(oEpee02INVENTORY_SLOT_LEFTHAND);
       
//et on attaque le manequin
        
ActionAttack(GetNearestObjectByTag("MANNEQUIN"));
     }


bon, alors je sais pas si les boucles servent à quelque chose, mais elles marchent bien :bouffon:


alors, ce qui marche pas :
c'est qu'il n'équipe pas "epee02"
il spawn, il s'entraine, mais avec une épée
mais le plus bizarre, c'est qu'il équipe les 2 épées quand il reprend l'entrainement
j'ai éssayé de mettre la phase d'quipement dans le onspawn, et ca sert à rien

alors bon, c'est du pinaillage de pinaillage, mais bon on est perfectionniste ou on l'est pas :lol:
Lien direct vers le message - Vieux
Avatar de Zunzun
Zunzun
Alpha & Oméga
 
Avatar de Zunzun
 
A ta place j'aurais plutot tout mis dans le OnPerception et le OnSpawn, enfin bon si ca marche et que ca gene pas, y a pas de probleme.

Pour ton probleme, fais-le spawner avec les 2 armes deja en mains, ca devrait resoudre.
Lien direct vers le message - Vieux
Avatar de Reyan
Reyan [L.D.D]
Roi / Reine
 
Avatar de Reyan
 
ba nan, j'ai bien mis

Code PHP:
 //-----------------------------------
        
int i1 TRUE;
        
int i2 TRUE;

        
object oEpee01 GetFirstItemInInventory();
        
object oEpee02 GetFirstItemInInventory();

        while(
i1 && GetIsObjectValid(oEpee01))
           {
           if(
oEpee01 == GetObjectByTag("EPEE_01"))
           
i1 FALSE;
           else
           
oEpee01 GetNextItemInInventory();
           }
        while(
i2 && GetIsObjectValid(oEpee02))
           {
           if(
oEpee02 == GetObjectByTag("EPEE_02"))
           
i2 FALSE;
           else
           
oEpee02 GetNextItemInInventory();
           }
       
//-----------------------------------
       //une fois qu'elles sont trouvee, on les equipes
        
ActionEquipItem(oEpee01INVENTORY_SLOT_RIGHTHAND);
        
ActionEquipItem(oEpee02INVENTORY_SLOT_LEFTHAND);
       
//et on attaque le manequin
        
ActionAttack(GetNearestObjectByTag("MANNEQUIN")); 
à la fin du onspawn, mais ca change rien
et pour le onperception, mm, ca fait p-e plus réaliste, mais je me méfie, ca p-e tellementy bouché un PNJ pis avec les histoire de porte et tt ... je sais pas, faudrait essayer
mais dans ce cas il faut le metre à s'entrainer et l'y laisser, hors régulierement il arrête, c'est pour ca que onheartbeat, et tant qu'on y est j'y est tout mis

ps : elles servent à qq chose les boucles au faite ?

edit : chuis idiot, je suppose qu'en fait tu voulais dire avec déjà les armes en main dans l'éditeur
enfin j'aimerai qd même bien savoir pourquoi ca fait ca c'est zarb qd même, quand il y revient il sort les deux :/
Lien direct vers le message - Vieux
Avatar de Reyan
Reyan [L.D.D]
Roi / Reine
 
Avatar de Reyan
 
bon bon bon
après une deuxième batterie de tests, ca marche en lui mettant d'office les armes dans les mains, et il les réequipe bien après, et ca sert à rien de mettre l'équipe dans le onspawn, et les boucles sont indispensables pour trouver les armes.
sauf si il exitse une fonction faite pour, mais je l'ai pas trouvée

mais ma question reste entière ou presque
pourquoi est ce qu'il équipait pas la deuxième arme tt de suite ? ca peut paraitre purement théorique et idiot, mais j'aime bien comprendre
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
Bah vu la méthode... C'est vraiment très chelou comme méthode : tu lui fait amorcer deux boucle dans l'inventaire en même temps, et tu le fait tourner pour une épée puis l'autre...suffit que l'épée 1 soit rencontré dans l'inventaire après qu'on soit passé par l'épée 2 (ou même qu'elle ne soit pas rencontrée du tout) et la seconde boucle ne marchera pas....

En plus j'adore parce que tu te plains qu'on puisse pas trouver directement les épée dans l'inventaire alors que tu leur as visiblement mis des tags uniques et que tu fais un GetObjectByTag()...

PS : Sinon, pour trouver un objet d'un certain tag dans l'inventaire d'un objet suffit d'utiliser GetItemPossessedBy( object oContainer, string sTag ).

PPS : Pourquoi est-ce que ça marche la seconde fois ? Visiblement, lorsque le PNJ déséquipe la première épée, il la met au tout début de l'inventaire, du coup la boucle marche.
Il trouve la première épée avec la première boucle puis il continue sa boucle dans l'inventaire et il trouve sa seconde épée, parfait !
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
Au cas où t'aurais pas compris (et même si t'as compris), je te fait un petit topo sur GetFirstItemInInventory() et GetNextItemInInventory() :
Ils se contrefoutent de ce à quoi tu les affectes, on est en C alors ils ont aucun moyen de le savoir !!
Donc leur seul point de repère pour savoir où ils en sont est interne et commun à toutes les fonctions GetNextItemInInventory() de ton module (ou de ton script... c'est plus probable), la seule façon qu'on ait d'accéder à ce point de repère c'est GetFirstItemInInventory() qui réinitialise ce point de repère et le met "au début" de l'inventaire.
Donc si on fait GetFirstItemInInventory() puis qu'on fait GetNextItemInInventory() jusqu'à ce que l'objet renvoyé soit invalide, on parcoure tout l'inventaire. Indépendamment de ce à quoi on l'affecte !!
Donc ce que tu fais toi :

Code PHP:
int i1 TRUE;
        
int i2 TRUE;

        
object oEpee01 GetFirstItemInInventory();
        
object oEpee02 GetFirstItemInInventory();

        while(
i1 && GetIsObjectValid(oEpee01))
           {
           if(
oEpee01 == GetObjectByTag("EPEE_01"))
           
i1 FALSE;
           else
           
oEpee01 GetNextItemInInventory();
           }
        while(
i2 && GetIsObjectValid(oEpee02))
           {
           if(
oEpee02 == GetObjectByTag("EPEE_02"))
           
i2 FALSE;
           else
           
oEpee02 GetNextItemInInventory();
           } 
Revient en fait à ça :
Code PHP:
i1 <- VRAI
i2 
<- VRAI

J
'initialise la boucle dans l'inventaire.
oEpee01 <- 1er item dans l'inventaire
J'
initialise la boucle dans l'inventaire.
oEpee02 <- 1er item dans l'
inventaire

Tant que i1 est VRAI et que oEpee01 est valide
{
  
Si oEpee01 est l'objet dont le tag est "EPEE_01" 
    alors i1 <- FAUX
  Sinon 
  {
    Je passe à l'
objet suivant dans l'inventaire
    oEpee01 <- objet suivant dans l'
inventaire
  
}

Tant que i2 est VRAI et que oEpee02 est valide
{
  
Si oEpee02 est l'objet dont le tag est "EPEE_02" 
    alors i2 <- FAUX
  Sinon 
  {
    Je passe à l'
objet suivant dans l'inventaire
    oEpee02 <- objet suivant dans l'
inventaire
  
}

Tu vois donc que tu ne réinitialise pas la boucle dans l'inventaire entre tes deux while... Elle se poursuit donc, et il y a toute une partie de l'inventaire qui n'est jamais passé en revue par la seconde boucle while..., celle qui se trouve "avant" l'épée 1.
Plus grave : si l'épée 1 n'est plus dans l'inventaire, la première boucle "avale" tout l'inventaire et ne laisse rien à la seconde...





Pour être plus technique, je pense que pour ce couple de fonctions, l'inventaire est une structure LIFO (Last In, First Out) : GetFirstItem..() doit copier une pile de pointeur vers les objets de l'inventaire et c'est cette pile qui est ensuite "poppé" par les GetNextItem...(). Ca expliquerait que l'épée soit trouvé la seconde fois puisqu'il vient de la remettre dans l'inventaire.
Intéressant !!
Lien direct vers le message - Vieux
Avatar de grenwald
grenwald
Roi
 
Avatar de grenwald
 
Arf, ça y est, je vais être obligé d'avouer que je suis une quiche en script, mais j'ai une petite question sur ce que tu viens de mettre Jedaï :

Tu dis qu'il ne réinitialise pas la boucle d'inventaire entre les deux while, mais il utilise bien deux boucles différentes, non?

Je m'explique :
Il met
Code PHP:
oEpee01=GetFirstItemInInventory();
oEppe02=GetFirstItemInInventory(); 
Donc si je ne m'abuse, les objets oEpee01 et oEpee02 correspondent tous deux au premier objet de l'inventaire.
Ensuite il fait la première boucle avec un
Code PHP:
oEpee01=GetNextItemInInventory 
Donc la l'objet oEpee01 passe a l'item suivant, mais le oEpee02 reste au premier (enfin c'est ce qu'il me semble)
Une fois qu'il a trouvé la première épée, il passe a la deuxième boucle avec oEpee02 qui doit toujours être sur le premier objet (on lui a pas demandé de changer)

En gros, j'ai l'impression qu'il y a bien deux boucles, mais qui commencent toutes les deux avec le premier objet d'inventaire vu qu'il utilise de variables différentes..........

Mais du coup je comprends pas pourquoi ça marche pas sur le onspawn

Menfin, comme je l'ai dis, je reste une vrai quiche et j'ai peut-être dit une connerie
Lien direct vers le message - Vieux
Avatar de Reyan
Reyan [L.D.D]
Roi / Reine
 
Avatar de Reyan
 
d'accord !!
en fait, si j'ai bien compris, le fait de faire
Code PHP:
oEpee01=GetFirstItemInInventory();
oEppe02=GetFirstItemInInventory(); 
ne sert à rien, parce qu'il va faire défiler l'inventaire dans la première boucle, puis partir de là où il était rendu dans la deuxième boucle, c'est ca que veut dire

Citation:
Indépendamment de ce à quoi on l'affecte !!
c ca ? j'ai bon ?

donc en fait, pour ces boucles, il faudrait faire :

Code PHP:
int i1 TRUE;
        
int i2 TRUE;

        
object oEpee01 GetFirstItemInInventory();
        
object oEpee02 GetFirstItemInInventory();

        while(
i1 && GetIsObjectValid(oEpee01))
           {
           if(
oEpee01 == GetObjectByTag("EPEE_01"))
           
i1 FALSE;
           else
           
oEpee01 GetNextItemInInventory();
           }
        
object oEpee02 GetFirstItemInInventory();
        while(
i2 && GetIsObjectValid(oEpee02))
           {
           if(
oEpee02 == GetObjectByTag("EPEE_02"))
           
i2 FALSE;
           else
           
oEpee02 GetNextItemInInventory();
           } 
c'est ca ?
il faut lui redire de revenir au début

oki, bon là ca sert à rien, parce que y a la fonction faites pour, mais c'est toujours utile à savoir
en fait ca aurait très bien pu marcher, sauf que la EPEE_02 est devant EPEE_01, si elle était après dans l'inventaire ca marcherait ... interessant
bon, vais supprimer ces boucles inutiles

Citation:
En plus j'adore parce que tu te plains qu'on puisse pas trouver directement les épée dans l'inventaire alors que tu leur as visiblement mis des tags uniques et que tu fais un GetObjectByTag()...
ba justement, avec un
Code PHP:
  ActionEquipItem(GetObjectByTag("EPEE_01"), INVENTORY_SLOT_LEFTHAND); 
ca marchait pas :-/
mais c'est parce qu'il faut faire
Code PHP:
  ActionEquipItem(GetItemPossessedBy(OBJECT_SELF"EPEE_01"), INVENTORY_SLOT_LEFTHAND); 
c ca ?
vais de ce pas essayer
mici
Lien direct vers le message - Vieux
Avatar de Reyan
Reyan [L.D.D]
Roi / Reine
 
Avatar de Reyan
 
ploum ploum
alors, encore qq tests
ca marche en réinitialisant le "GetFirstItemInInventory"
ca marche pas avec les GetItemPossesedBy
g mis :

Code PHP:
        ActionEquipItem(GetItemPossessedBy(OBJECT_SELF"EPEE01"), INVENTORY_SLOT_RIGHTHAND);
        
ActionEquipItem(GetItemPossessedBy(OBJECT_SELF"EPEE02"), INVENTORY_SLOT_LEFTHAND);
        
ActionAttack(GetNearestObjectByTag("MANNEQUIN")); 
et il attaque à mains nus, bon, c'est pas grave, m'en fiche, j'arrive à retrouver un objet dans l'inventaire maintenant, mais bon, qd même, si elle sert pas à ca, elle sert à quoi cette fonction "GetItemPossessedBy"
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
C'est curieux tes tags ont changés en cours de route : avant c'était EPEE_01 et dans ton exemple qui ne marche pas, c'est EPEE01, je me demande s'il n'y aurait pas un rapport de cause à effet...

Sinon c'est exactement ça, les fonctions GetFirstItem...() et GetNext..() ne se préoccupent absolument pas de ceux à quoi elles sont affectées (elles n'ont aucun moyen de le savoir en C) ni même de savoir si elles sont affectées à quelque chose : elle tournent dans l'inventaire jusqu'à ce qu'il soit fini ou qu'on les réinitialise avec GetFirstItemInInventory(). Il n'y a donc qu'une seule boucle et pas deux : un mauvais point pour Grenwald donc ! (mais enfin il dit lui même qu'il est une quiche donc on lui pardonne)
Lien direct vers le message - Vieux
Avatar de Reyan
Reyan [L.D.D]
Roi / Reine
 
Avatar de Reyan
 
Citation:
Provient du message de Jedaï
C'est curieux tes tags ont changés en cours de route : avant c'était EPEE_01 et dans ton exemple qui ne marche pas, c'est EPEE01, je me demande s'il n'y aurait pas un rapport de cause à effet...
j'ai rien dit
Lien direct vers le message - Vieux
Avatar de grenwald
grenwald
Roi
 
Avatar de grenwald
 
C'est bien ce que je disais : j'ai encore bien du boulot avant de pouvoir pondre des scripts utiles et optimisés
Menfin, maintenant je me méfierais du coup du GetNextItemInInventory
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > encore un qui joue les manchot ...
   

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 07h21.
   

© 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