La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 22/09/2024 15:28:22


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
atapi
Novice
Inscrit le: 15 Avr 2005
Messages: 6
Répondre en citant
Posté le : 15/04/2005 17:30:14 Sujet du message : [réglé]Echange d'objet contre xp et or (problème de boucle)

Bonjour, (j'éspère que je suis dans la bonne section, sinon, merci de le bouger Very Happy)

Voilà, j'ai fais un script pour qu'un pnj échange un objet à un pj de level inférieur à 5 contre de l'or et de l'xp.

Si le pj ne possède pas l'objet, ça fonctionne, il ne reçoit rien
Mais s'il le possède, la boucle ne se finit pas et il en reçoit jusqu'à ce que nwn l'arrête de lui meme

merci

NWScript :
void main()
{
float t = 0.0f;
int a = 1;




    while(a > 0)
    {

    object oItemToTake;
    oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "NW_ITEM_000");

        if(GetIsObjectValid(oItemToTake))
        {
                if(GetHitDice(GetPCSpeaker()) <= 5)
                  {
                  GiveGoldToCreature(GetPCSpeaker(), 50);
                  GiveXPToCreature(GetPCSpeaker(), 50);
                  }
                DestroyObject(oItemToTake, t);
          }


        else
        {
        a = 0;
        }

    }

}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
Dernière édition par atapi le 15/04/2005 20:56:44; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 15/04/2005 18:00:03 Sujet du message :

Source des fonctions du script : le bouchon lyonnais

NWScript :
int MustHaveNoneOf(object oPC, string sObjectTag)
    {
    int iNbItem=0;
    object oItem = GetFirstItemInInventory(oPC);
    while (GetIsObjectValid(oItem)==TRUE)
        {
        if (GetTag(oItem)==sObjectTag)
                {
                iNbItem += GetNumStackedItems(oItem);
                DestroyObject(oItem);
                }
        oItem = GetNextItemInInventory(oPC);
        }
    return iNbItem;
    }
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


NWScript :
void main()
{
  object oPC = GetPCSpeaker() ;
  if( MustHaveNoneOf(oPC,"NW_ITEM_000")>0 ){
      if( GetHitDice(oPC) <= 5 ){
        GiveGoldToCreature(oPC, 50);
        GiveXPToCreature(oPC, 50);
      }
  }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Cause : la manipulation d'objet est traitée en différé par le moteur de jeu : les créations et destructions d'objets sont réalisées APRES la fin du script ou les fonctions create/destroy sont utilisées.

Pour faire strictement ce que tu as demandé, ne pas faire de boucle et détruire juste le premier item trouvé :
NWScript :
int DestroyIfHasOf(object oPC, string sObjectTag)
    {
    object oItemToTake = GetItemPossessedBy(oPC, sObjectTag);
    int bValid = GetIsObjectValid(oItemToTake) ;
    if( bValid ) DestroyObject(oItemToTake);
    return bValid ;
    }
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


à mettre à la place du MustHaveNoneOf
Dernière édition par lylver le 15/04/2005 18:14:35; édité 2 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
atapi
Novice
Inscrit le: 15 Avr 2005
Messages: 6
Répondre en citant
Posté le : 15/04/2005 18:03:53 Sujet du message :

merci, je vais lire ça Very Happy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
atapi
Novice
Inscrit le: 15 Avr 2005
Messages: 6
Répondre en citant
Posté le : 15/04/2005 19:32:56 Sujet du message :

Voilà, merci, ça fonctionne, je sais pas pourquoi avec ton truc ça marche et pas avec le mien, tu peux me dire pourquoi histoire que je ne meurs pas idiot.

je le mets quand meme si ça interesse quelqu'un
NWScript :
void main()
{

string sObjet = "Coeurderat"; //Tag de l'objet
int iOr = 50; //Or par objet donne
int iXp = 50; //Xp par objet donne
int iLvlmax = 5; //Lvl max pour en profiter


object oPC = GetPCSpeaker(), oItemToTake;
int iNbItem=0, iIncr;

//Compte le nombre de fois l'objet sObjet que possede le pj et le dtruit
oItemToTake = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oItemToTake) == TRUE)
        {

        if (GetTag(oItemToTake)==sObjet)
        {
        iNbItem++;
        DestroyObject(oItemToTake);
        }

        oItemToTake = GetNextItemInInventory(oPC);

        }


//Donne l'xp et l'or si iLvlmax pas depasse
if(GetHitDice(oPC) <= iLvlmax)
  {
  iOr *= iNbItem;
  iXp *= iNbItem;
  GiveGoldToCreature(oPC, iOr);
  GiveXPToCreature(oPC, iXp);
  }


}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 16/04/2005 01:35:08 Sujet du message :

Ben comme je le disais plus haut : dans ta boucle tu utilises la fonction DestroyObject ... qui ne détruira pas l'objet avant que ton script soit fini. Donc ta condition de boucle (a>0) positionnée par ce test

Citation :
if(GetIsObjectValid(oItemToTake))
est toujours vraie. Tu boucles à l'infini car l'objet non détruit est toujours valide.

Deux cas pour arriver au résultat :
1) En déplaçant la fonctionnalité destruction dans un appel de script (ExecuteScript), à son retour dans le code principal, l'objet est détruit. (m'enfin par expérience ca marche pas à tous les coups, car il y a un temps de latence sur la gestion des objets)
2) Tu parcours l'inventaire complet du conteneur (ici le PJ) avec les fonctions GetFirst/GetNext, appliquant au passage DestroyObject sur celui qui t'intéresse, jusqu'à tomber sur le marqueur de fin d'inventaire : ici c'est OBJECT_INVALID, c'est ce que fait la fonction MustHaveNoneOf, très robuste.

Le concept :
Les objets sont marqués (Mark) pour destruction avec DestroyObject à l'intention du moteur de jeu qui va gérer (Sweep : passer un coup de balai) en différé sans que tu n'aies à t'en soucier.

Question performance :

Citation :
GetItemPossessedBy(oPC, sObjectTag)
est une fonction interne donc beaucoup plus rapide que le parcours d'inventaire fait avec MustHaveNoneOf, mais elle est inutilisable dans une boucle associant les fonctions de création/destruction à cause du concept précédent de Mark+Sweep
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
atapi
Novice
Inscrit le: 15 Avr 2005
Messages: 6
Répondre en citant
Posté le : 16/04/2005 09:21:25 Sujet du message :

Very Happy merci

Sinon, je suis quand meme étonné de tes connaissances en NWscripts, t'as étudié toutes les fonctions? Shocked
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 58.244ms