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







La date/heure actuelle est 19/04/2025 10:22:07
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 |
Enki Légende vivante ![]() Messages: 432 |
Bonjour, j'ai fait une taverne possédant quatre portes avec des PNJs qui apparaissent à des heures bien précises à la proportion d'un PNJ par porte. Je veux qu'à chaque fois qu'un PNJ entre avec un préfixe particulier, il se dirige aléatoirement vers une chaise (il y en a 16 en tout) et s'assoit. Jusque là, tout fonctionne, mais le problème, c'est que si le PNJ entrant s'approche d'une chaise déja occupée, il reste planté comme un idiot devant. Pourtant, j'ai placé une condition (c'est sûrement là le problème), qui devrait faire que si la chaise est occupée, le PNJ cherche aléatoirement l'une des trois premières chaises à proximité de de la chaise occupée pour s'y installer.
Voici le script en question, sur le OnEnter de la zone. NWScript :
void main() { object oNPC=GetEnteringObject(); int n; string sPassant="passant"; string sPassant01="marcheur_"; string sString01=GetStringLeft(GetTag(oNPC),9); object oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", oNPC,n); string sString=GetStringLeft(GetTag(oNPC),7); if (sString==sPassant) { if(!GetIsObjectValid(GetSittingCreature(oChair))) { n=Random(16); oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", oNPC,n); AssignCommand(oNPC,ActionMoveToObject(oChair)); AssignCommand(oNPC,ActionSit(oChair)); } if(GetIsObjectValid(GetSittingCreature(oChair))) { n=Random(3); oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", GetSittingCreature(oChair),n); AssignCommand(oNPC,ActionMoveToObject(oChair)); AssignCommand(oNPC,ActionSit(oChair)); } } if (sString01==sPassant01) { if(!GetIsObjectValid(GetSittingCreature(oChair))) { n=Random(16); oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", oNPC,n); AssignCommand(oNPC,ActionMoveToObject(oChair)); AssignCommand(oNPC,ActionSit(oChair)); } if(GetIsObjectValid(GetSittingCreature(oChair))) { n=Random(3); oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", GetSittingCreature(oChair),n); AssignCommand(oNPC,ActionMoveToObject(oChair)); AssignCommand(oNPC,ActionSit(oChair)); } } } Si quelqu'un peut me dire pourquoi cela ne marche pas, cela serait très gentil ! Merci par avance. |
Revenir en haut | ![]() ![]() ![]() |
L'Erudit Seigneur ![]() Messages: 167 |
Coucou Enki, je pense que tes conditions sont bien formulées, peut être que tu devrais assayer ceci:
NWScript :
// Petite simplification du script avec les || if (sString==sPassant || sString01==sPassant01) { if (!GetIsObjectValid(GetSittingCreature(oChair))) { n=Random(16); oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", oNPC,n); AssignCommand(oNPC,ActionMoveToObject(oChair)); AssignCommand(oNPC,ActionSit(oChair)); } // Tu as 2 conditions en tout et pour tout, donc autant mettre un else. else { n=Random(3); oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", GetSittingCreature(oChair),n); AssignCommand(oNPC,ActionMoveToObject(oChair)); AssignCommand(oNPC,ActionSit(oChair)); } } Je n'ai pas testé, donc dis moi si ça fonctionne... EDIT: je crois, après réfléxion, que le probleme ne se situe pas là. En fait, c'est ta variable n qui ne possède pas de valeur quand tu définis oChair (en premier), par conséquent, lorsque ta première condition est testée, on ne sait pas quelle chaise va être testée (n=?). Ensuite, tu utilises un Random pour décider de la chaise sur laquelle va s'assoir le PNJ, mais rien ne te dit que ce sera celle qui a été testée avec ton "if". |
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Merci, je crois que j'ai compris d'où vient l'erreur, je vais modifier mon script et je te tiens au courrant.
|
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Bon j'ai trouvé, merci pour tes remarques et conseils, l'Erudit !
Voici le bon script : NWScript : void main() { object oNPC=GetEnteringObject(); int n;//=Random(16); string sPassant="passant"; string sPassant01="marcheur_"; string sString01=GetStringLeft(GetTag(oNPC),9); object oChair; // =GetNearestObjectByTag("X 2_PLC_CHAIRMIND", oNPC,n); object oComptoir=GetWaypointByTag("comptoir"); string sString=GetStringLeft(GetTag(oNPC),7); // Petite simplification du script avec les || if (sString==sPassant || sString01==sPassant01) { n=Random(16); oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", oNPC,n); AssignCommand(oNPC,ActionForceMoveToObject(oChair)); if (GetIsObjectValid(GetSittingCreature(oChair))) { n=Random(3); oChair=GetNearestObjectByTag("X2_PLC_CHAIRMIND", oNPC,n); // AssignCommand(oNPC,ActionForce MoveToObject(oComptoir)); AssignCommand(oNPC,ActionForceMoveToObject(oChair)); AssignCommand(oNPC,ActionSit(oChair)); } // Tu as 2 conditions en tout et pour tout, donc autant mettre un else. else { AssignCommand(oNPC,ActionSit(oChair)); } } } |
Revenir en haut | ![]() ![]() ![]() |
L'Erudit Seigneur ![]() Messages: 167 |
Super, je suis content que tu aies pu trouver la solution, d'autant que ce script est très utile pour animer les intérieurs
![]() |
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