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







La date/heure actuelle est 01/05/2025 02:40:31
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 |
nunch Grand Sage du Conseil ![]() Messages: 966 Localisation: Dans la gueule du Lyon |
Hello,
J'expose un problème (je n'ai pas trouvé de sujet similaire avec la recherche) avec sa solution, à titre d'information. J'ai une zone où sont répartis 12 waypoints: 7 nommés WP_VP_GuerrierScorpio, 4 nommés WP_VP_ArcherScorpio et 1 nommé WP_VP_MageScorpio. Quand un PJ marche sur un trigger, je veux qu'une créature apparaîsse à chacun des waypoints, en fonction du nom de ce dernier. Donc dans le OnEnter() de mon trigger j'ai mis le script suivant: Code : void main() { object oZone = GetArea(OBJECT_SELF); object oWaypoint = GetFirstObjectInArea(oZone); while(GetIsObjectValid(oWaypoint)) { if(GetObjectType(oWaypoint) == OBJECT_TYPE_WAYPOINT) { string stWaypoint = GetTag(oWaypoint); if(stWaypoint == "WP_VP_ArcherScorpio") { CreateObject(OBJECT_TYPE_CREATURE,"ct_arch_scorpion",GetLocation(oWaypoint)); } else if(stWaypoint == "WP_VP_GuerrierScorpio") { CreateObject(OBJECT_TYPE_CREATURE,"x0_stinger_war",GetLocation(oWaypoint)); } else if(stWaypoint == "WP_VP_MageScorpio") { CreateObject(OBJECT_TYPE_CREATURE,"x0_stinger_mage",GetLocation(oWaypoint)); } } oWaypoint = GetNextObjectInArea(oZone); } } Seulement ça ne marchait pas. Au lieu de me créer mes 12 monstres, le script en créait 26 !! J'ai mis un bout de temps avant de comprendre pourquoi, et ce grâce au debugger (et au tutorial de Landrast): la fonction GetNextObjectInArea() me renvoyait plusieurs fois certains tags (j'ai vu ça grâce aux valeurs hexadécimales des objets dans le debugger). J'en ai conclu que c'est le CreateObject() qui venait perturber d'une quelconque manière la liste des objets à retourner. Pour contourner le problème, j'ai placé les CreateObject() dans des DelayCommand() avec un délai de 1 seconde (moins peut peut-être fonctionner aussi). Je ne vous remets pas le nouveau script qui est le même que dessus avec la modification mentionnée avant. Voilà, comme je l'ai dit, je n'ai pas trouvé de sujet similaire avec la recherche. Si vous connaissez une meilleurs solution au problème, faites le moi savoir. |
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
Baldurien L'homme qui chutait sur le macadam ![]() Messages: 14070 Localisation: Quadran Alpha |
Mauvaise idée de passer en boucle une liste d'objet et d'en créer ! TRES MAUVAISE IDEE.
Cela va faire une boucle à l'infini car à chaque fois que tu crée un nouvel objet, tu redémarre la liste ! Tu devrais utiliser GetObjectByTag et son deuxième argument : cela permettrait de ne passer que les Waypoints et pas les objets nouvellement crées. ex: Code : string tag = "ahaah"; object bidule = GetObjectByTag( tag, 0 ); int i = 1: while ( GetIsObjectValid( bidule ) ) { /* machin */ bidule = GetObjectByTag( tag, i++ ); } _________________ #nwnights-fr @ irc.darkmyst.org TitanQuest-FR |
Revenir en haut | ![]() ![]() ![]() ![]() |
nunch Grand Sage du Conseil ![]() Messages: 966 Localisation: Dans la gueule du Lyon |
OK d'accord, merci. Je sais pas pourquoi mais j'ai fait l'impasse sur cette fonction quand j'ai cherché dans le lexicon.
|
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
Baldurien L'homme qui chutait sur le macadam ![]() Messages: 14070 Localisation: Quadran Alpha |
bah
![]() tu rajoute une condition D'ailleurs, me semble que le GetObjectByTag te raméne l'objet le plus proche dans la zone, donc un truc du genre : Code : string tag = "ahaah"; string zone_tag = "zone"; object bidule = GetObjectByTag( tag, 0 ); int i = 1: while ( GetIsObjectValid( bidule ) && GetTag( GetArea( bidule ) ) == zone_tag ) { /* machin */ bidule = GetObjectByTag( tag, i++ ); } Devrait correctement fonctionner. Sinon, bah tu devrais utiliser une solution tabloïdesque en conservant la location de tes waypoints ie: Code : int get_count( string varname ) { return GetLocalInt( OBJECT_SELF, varname + "_count" ); } void increment_count( string varname, int count = -1 ) { if ( count == -1 ) SetLocalInt( OBJECT_SELF, varname + "_count", get_count( varname ) + 1 ); else SetLocalInt( OBJECT_SELF, varname + "_count", count ); } location get_location( string varname, int id ) { return GetLocalLocation( OBJECT_SELF, varname + "_l" + IntToString( id ) ); } location set_location( string varname, int id, location whereIam ) { return SetLocalLocation( OBJECT_SELF, varname + "_l" + IntToString( id ), whereIam ); } void delete_location( string varname, int id ) { DeleteLocalLocation( OBJECT_SELF, varname + "_l" + IntToString( id ) ); } void main() { object oZone = GetArea(OBJECT_SELF); object oWaypoint = GetFirstObjectInArea(oZone); string stWaypoint; location lWp; int i = 0, j = 0, k = 0; while( GetIsObjectValid(oWaypoint) ) { if(GetObjectType(oWaypoint) == OBJECT_TYPE_WAYPOINT) { stWaypoint = GetTag(oWaypoint); lWp = GetLocation( oWaypoint ); if( stWaypoint == "WP_VP_ArcherScorpio" ) { increment_count( stWaypoint ); set_location( stWaypoint, i++, lWp ); } else if(stWaypoint == "WP_VP_GuerrierScorpio") { increment_count( stWaypoint ); set_location( stWaypoint, j++, lWp ); } else if(stWaypoint == "WP_VP_MageScorpio") { increment_count( stWaypoint ); set_location( stWaypoint, k++, lWp ); } } oWaypoint = GetNextObjectInArea(oZone); } } Ensuite, tu as grosso modo construit un tableau virtuellement. Pour créer tes créatures, tu peux faire ceci après le while : Code : string bp = "ct_arch_scorpion", varname = "WP_VP_ArcherScorpio"; int count = get_count( varname ), counter; for ( counter = 0; counter < count; counter++ ) { CreateObject( OBJECT_TYPE_CREATURE, bp, get_location( varname , counter ) ); delete_location( varname, counter ); } bp = "x0_stinger_war"; varname = "WP_VP_GuerrierScorpio"; count = get_count( varname ); for ( counter = 0; counter < count; counter++ ) { CreateObject( OBJECT_TYPE_CREATURE, bp, get_location( varname , counter ) ); delete_location( varname, counter ); } bp = "x0_stinger_mage"; varname = "WP_VP_MageScorpio"; count = get_count( varname ); for ( counter = 0; counter < count; counter++ ) { CreateObject( OBJECT_TYPE_CREATURE, bp, get_location( varname , counter ) ); delete_location( varname, counter ); } Sur le papier, ça devrait faire ce que tu veux, mais même plus : le mieux est tout de même de supprimer les variables après utilisation. ie: Code : increment_count( "WP_VP_ArcherScorpio", 0 ); increment_count( "WP_VP_GuerrierScorpio", 0 ); increment_count( "WP_VP_MageScorpio", 0 ); Note que le script détruit après utilisation les variables locales. C'est la seule solution potable pour créer des objets en en ayant sélectionné une liste dans la zone. /me *prie* pour que ça fonctionne ! _________________ #nwnights-fr @ irc.darkmyst.org TitanQuest-FR |
Revenir en haut | ![]() ![]() ![]() ![]() |
nunch Grand Sage du Conseil ![]() Messages: 966 Localisation: Dans la gueule du Lyon |
Merci de ton aide, mais ne fais pas tout le boulot sinon je vais m'ennuyer chez moi
![]() Ta première solution marche très bien en tous cas. Sinon j'ai une derniere question (tant qu'à faire ![]() |
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
Baldurien L'homme qui chutait sur le macadam ![]() Messages: 14070 Localisation: Quadran Alpha |
Les PJ font normalement parti des objets de la zone quand ils sont dans la zone... Donc à priori oui.
_________________ #nwnights-fr @ irc.darkmyst.org TitanQuest-FR |
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