
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.







La date/heure actuelle est 19/04/2025 12:06:50
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
atapi Novice Messages: 6 |
![]() Bonjour, (j'éspère que je suis dans la bonne section, sinon, merci de le bouger
![]() 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; } } } Dernière édition par atapi le 15/04/2005 20:56:44; édité 1 fois
|
Revenir en haut | ![]() ![]() ![]() |
lylver Héros Messages: 274 |
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; } NWScript :
void main() { object oPC = GetPCSpeaker() ; if( MustHaveNoneOf(oPC,"NW_ITEM_000")>0 ){ if( GetHitDice(oPC) <= 5 ){ GiveGoldToCreature(oPC, 50); GiveXPToCreature(oPC, 50); } } } 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 ; } à mettre à la place du MustHaveNoneOf Dernière édition par lylver le 15/04/2005 18:14:35; édité 2 fois
|
Revenir en haut | ![]() ![]() ![]() |
atapi Novice Messages: 6 |
merci, je vais lire ça
![]() |
Revenir en haut | ![]() ![]() ![]() |
atapi Novice Messages: 6 |
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); } } |
Revenir en haut | ![]() ![]() ![]() |
lylver Héros Messages: 274 |
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 | ![]() ![]() ![]() |
atapi Novice Messages: 6 |
![]() Sinon, je suis quand meme étonné de tes connaissances en NWscripts, t'as étudié toutes les fonctions? ![]() |
Revenir en haut | ![]() ![]() ![]() |


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