La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 27/11/2024 04:14:32
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 |
Claythest Ecuyer Messages: 61 |
Bonjour tout le monde !
Est-ce qu'il est possible dans le même script d'effectuer plusieurs CreateObject mais avec délai d'attente entre 2 ? Le DelayCommand ne va pas car j'ai besoin de récupérer l'objet créé pour faire des actions avec. En gros je voudrais écrire un truc du genre : NWScript :
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. Comment faire ? Merci d'avance ! |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Peux-tu décrire plus généralement ton besoin ? Il existe plusieurs réponses possibles à ta question et je ne suis pas sûr qu'elles conviennent toutes. Car même si on parvient à séparer la création d'objet ainsi, il faudra sans doute ruser pour exécuter le reste de tes commandes. Tant qu'on ne sait pas ce que tu veux faire, les propositions peuvent être inutilisables. Donc n'hésite pas à décrire plus en avant la situation que tu veux gérer.
_________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
Claythest Ecuyer Messages: 61 |
C'est vrai que c'est pas très clair...
Je m'explique : Je voudrais faire sortir des gardes d'une porte, et ces gardes doivent aller à un certain endroit. Au point où j'en suis, je crée 10 gardes mais seuls quelques-uns arrivent à destination car les autres se bloquent entre eux (et de plus c'est pas très beau puisque tout d'un coup j'ai un paquet de 10 gardes qui apparaissent devant la porte). Je voudrais donner l'impression que ces gardes sortent de cette porte, les uns à la suite des autres. C'est pour ça que je voudrais en créer un, lui dire d'aller à telle destination, attendre un peu et recommencer avec le suivant. Et tout celà si possible dans le même script. Comment je peux faire svp ? (voilà j'espère avoir été plus clair). |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum... Hum...
Je crois avoir rencontré ce problème un certain nombre de fois et il est impossible de mettre un DelayCommand à un CreateObject... Ce n'est pas une action... Mais il existe une solution... en trois étapes Créer un script qui crée uniquement ton 1e objet "cr_objet1" NWScript :
void main() { CreateObject(OBJECT_TYPE_CREATURE, "resref du 1e objet", location de destination, FALSE); } Créer un script qui crée uniquement ton 2e objet "cr_objet2" NWScript :
void main() { CreateObject(OBJECT_TYPE_CREATURE, "resref du 2e objet", location de destination, FALSE); } Créer un script qui lance les deux créations avce un délai NWScript : void main() { ExecuteScript ("cr_objet1", OBJECT_SELF); DelayCommand(2.0, ExecuteScript ("cr_objet2", OBJECT_SELF)); } _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
Claythest Ecuyer Messages: 61 |
Ouai bien pensé mais je trouve ça un peu lourd : créer et lancer un script juste pour une petite fonction .
Si quelqu'un a une autre solution je suis preneur . Mais bon si y en a pas ben tant pis je ferais comme tu dis. Merci beaucoup pour ta réponse . Je sais pas il n'y a pas par exemple une fonction qui permet d'arreter momentanément l'exécution du script ? |
Revenir en haut | |
Claythest Ecuyer Messages: 61 |
arf ! Et non longbow, désolé mais ta réponse ne me convient pas puisque après avoir créé cet objet, j'ai besoin de lui dire où aller ! Et j'aurai besoin de lui passer un parametre pour la location de la destination parce qu'elle est variable...
|
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum.. Hum...
Pour ton problème de garde, si ils ont le même blueprint (ResRef).... Hypothèse de travail: 1. Le Tag de ces gardes est "Gard", le blueprint (ResRef) = "gard") 2. Tu crée un script nommé "cr_gard" NWScript :
void main() { location lLoc = GetLocation (GetObjectByTag("Tag de la porte")); CreateObject(OBJECT_TYPE_CREATURE, "gard", lLoc , FALSE); } 3. Tu crée un Waypoint "POST_Gard" vers lequel ils se dirigeront automatiquement 4. Tu utilises un script de lancement pour la création de tes gardes à intervalle régulier NWScript :
void main() { ExecuteScript ("cr_gard", OBJECT_SELF); DelayCommand(2.0, ExecuteScript ("cr_gard", OBJECT_SELF)); DelayCommand(4.0, ExecuteScript ("cr_gard", OBJECT_SELF)); DelayCommand(6.0, ExecuteScript ("cr_gard", OBJECT_SELF)); DelayCommand(8.0, ExecuteScript ("cr_gard", OBJECT_SELF)); DelayCommand(10.0, ExecuteScript ("cr_gard", OBJECT_SELF)); } Je pense que cela devrait permettre d'éviter la bousculade... _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Selon moi, la solution ultime de toute sorte d'animation quelle qu'elle soit, c'est la queue d'action. Le DelayCommand est imprecis, voire incertain (Bioware ne le recommande pas). Après 2 ou 3 réglages, une queue d'action est le meilleur support de temporisation (j'avais fais différents sujets à ce propos, dont la proposition d'un usage de la "queue d'action infinie"... Un sujet qui s'est un peu perdu depuis). Pour engendrer l'animation souhaitée, voici le travail préparatoire que je te propose :
Dans un premier temps, tu vas créer une créature ayant l'apparence "null human" (invisible) et dénué du moindre script. Tu vas la rendre invulnérable ("plot" ou "objet de quête" coché) et en créer un exemplaire sur ton module dans une zone cachée (que l'on ne peut atteindre par aucun moyen). L'usage que nous allons en faire justifie cette préparation. Je te propose de l'appeler "interpretor" (blueprint resref) et de le taguer de même (mais en majuscule : convention d'écriture). Si on le met dans une zone cachée, le fait qu'il soit ou non visible n'a que peu d'importance, mais c'est pour un autre type d'utilisation que je le fais ainsi (de fait, tu lui donnes l'apparence que tu veux). N'oublie pas d'enlever tous les scripts par défaut à cette créature, son seul intérêt est d'exister. Une fois ceci fait, passons à la réalisation proprement dite de ton idée. Considérons 10 points de passage (waypoint) conçus pour être l'endroit ou chacun des 10 gardes doit se rendre (respectivement). Donnons leur les tags suivant : WP_GUARD1, WP_GUARD2, etc... jusqu'à WP_GUARD10. Ajoutons un waypoint pour le point d'apparition des gardes, en l'occurrence sur le pas de la porte, et nommons son tag WP_DOORGUARD. Voici mainetenant le script que je mettrai en place en supposant que tes gardes ont pour ResRef "guard". NWScript :
void SpawnGuard(int nGuardNumber) { location lSpawnLoc = GetLocation(GetObjectByTag("WP_DOORGUARD")); location lLocToGo = GetLocation(GetObjectByTag("WP_GUARD" + IntToString(nGuardNumber))); object oGuard=CreateObject(OBJECT_TYPE_CREATURE, "guard", lSpawnLoc); AssignCommand(oGuard, ClearAllActions()); // Vider sa queue d'action AssignCommand(oGuard, ActionForceMoveToLocation(lLocToGo, TRUE, 15.0)); } void main() { int nCount; float fRanTime; object oInterpretor = GetObjectByTag("INTERPRETOR"); AssignCommand(oInterpretor, ClearAllActions()); // On vide sa queue d'action for (nCount=1; nCount<=10; nCount++) { AssignCommand(oInterpretor, ActionDoCommand(SpawnGuard(nCount))); fRanTime = 0.5 + IntToFloat(Random(30)) / 10.0; AssignCommand(oInterpretor, ActionWait(fRanTime)); // Ajouter cette attente dans la queue d'action de l'interpreteur } } J'ai ajouté le hasard en ce qui concerne le temps entre chaque apparition. Cela devrait créer un mouvement un peu moins ordonné (donc plus réaliste). Toutefois, il est aisé de le fixer à une valeur constante, il suffit d'intervenir sur la ligne qui génère la valeur aléatoire. A noter que ce script va créer 20 actions dans la queue d'action de l'interpréteur (une alternance de Spawn de garde et de temps d'attente). Ce dernier peut servir ensuite pour d'autres animations du même genre. c'est sa queue d'action qui donne le rythme, même si les actions que nous lui faisons faire ne le concernent pas directement. Dans ce cadre précis de l'utilisation de la queue d'action, il ne faut jamais oublier cette magnifique fonction ActionDoCommand qui transforme n'importe quel appel de fonction NWScript en Action. Attention à ne pas aller trop loin avec ce procédé, car la queue d'action est limitée à 75 actions. Donc, dans le cas présent, il faut s'arrêter à 37 gardes . Si on veux aller plus loin, il faut créer une queue d'action infinie et c'est un autre processus . Sous réserve qu'il n'y a pas d'erreur, car je n'ai hélas pas eu le temps de le tester. _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
aldech Gagnant du Concours Gothic 3 Messages: 61 Localisation: Le Havre |
Très intéressant comme sujet, j'ai testé ta solution Lendraste et apparemment il y a un problème.
Juste une petite erreur, je verrais plutôt cela pour la formule : NWScript :
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. Mais là n'est pas le problème qui est que cela dépends des fois, le premier garde ou les deux premiers reste bloqué au waypoint de départ sans se déplacer vers leur waypoint d'arrivée. Et la téléportation après un timeout de 15 secondes ne semble pas fonctionner non plus. J'ai cherché mais je ne trouve pas pourquoi. |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
aldech a écrit : Très intéressant comme sujet, j'ai testé ta solution Lendraste et apparemment il y a un problème.
En faisant cela tu créé une durée aléatoire entre 5 et 8 secondes. La division est prioritaire sur l'addition, c'est pour cela que j'ai placé ma constante 0.5 avant. J'aurai pu faire mon addition après ou mettre des parenthèses, mais c'était un peu inutile.
Juste une petite erreur, je verrais plutôt cela pour la formule : NWScript : 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. Citation : Mais là n'est pas le problème qui est que cela dépends des fois, le premier garde ou les deux premiers reste bloqué au waypoint de départ sans se déplacer vers leur waypoint d'arrivée. Et la téléportation après un timeout de 15 secondes ne semble pas fonctionner non plus. J'ai cherché mais je ne trouve pas pourquoi. - Creation du garde - Légère attente - Donner des ordres au garde - Attente avant le prochain Cela réduit encore le nombre de garde pouvant être géré au maximum par la queue d'action de l'interpréteur. Pour faire cela, il faut séparer la fonction SpawnGuard en deux. Je garde SpawnGuard et je créé MoveGuard sur le même principe. Voici une solution dérivée de la première. Dans cette solution, à la création du garde, nous allons lui créer un tag unique numéroté de façon à pouvoir le retrouver par un GetObjectByTag un peu plus tard. Il ne faut jamais perdre de vue que les actions de ce genre sont différées, elles doivent donc être autonomes et ne pas avoir besoin de connaître l'environnement qui les exécute pour s'exécuter sans problème : NWScript :
void SpawnGuard(int nGuardNumber) { location lSpawnLoc = GetLocation(GetObjectByTag("WP_DOORGUARD")); object oGuard=CreateObject(OBJECT_TYPE_CREATURE, "guard", lSpawnLoc, "GUARD" + IntToString(nGuardNumber)); } void MoveGuard(int nGuardNumber) { location lLocToGo = GetLocation(GetObjectByTag("WP_GUARD" + IntToString(nGuardNumber))); object oGuard = GetObjectByTag("GUARD" + IntToString(nGardNumber)); // On retrouve le garde AssignCommand(oGuard, ClearAllActions()); // Vider sa queue d'action AssignCommand(oGuard, ActionForceMoveToLocation(lLocToGo, TRUE, 15.0)); } void main() { int nCount; float fRanTime; object oInterpretor = GetObjectByTag("INTERPRETOR"); AssignCommand(oInterpretor, ClearAllActions()); // On vide sa queue d'action for (nCount=1; nCount<=10; nCount++) { AssignCommand(oInterpretor, ActionDoCommand(SpawnGuard(nCount))); AssignCommand(oInterpretor, ActionWait(0.1)); AssignCommand(oInterpretor, ActionDoCommand(MoveGuard(nCount))); fRanTime = 0.5 + IntToFloat(Random(30)) / 10.0; AssignCommand(oInterpretor, ActionWait(fRanTime)); // Ajouter cette attente dans la queue d'action de l'interpreteur } } Pour s'assurer que cela marche bien, on peut augmenter les temps d'attente, puis les réduire progressivement. Le problème posé par la création d'objet est que ce n'est pas toujours instantanné car la dite création engendre elle-même l'exécution d'autres script (le OnEnter de la zone, le OnEnter d'un éventuel déclencheur dans lequel elle serait créée, le OnSpawn de la créature créée, pour ne citer qu'eux), c'est pour cela qu'avec des temps d'attente très réduit (ou innexistant comme dans la première version), les choses ne se passe pas forcément bien (il faut aussi tenir compte de la capacité de la machine). Si cette solution ne marche pas, il faudra que je creuse la question. _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
aldech Gagnant du Concours Gothic 3 Messages: 61 Localisation: Le Havre |
Dsl, j'avais pas pensé à l'ordre des opérations.
Pour le reste, j'ai testé ta nouvelle solution et j'ai eu trois gardes de coincer au point de départ. Par contre pour faire les tests, j'ai mis le script dans le OnSpawn de la créature "interpretor", est ce le bon endroit ? |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
aldech a écrit : Dsl, j'avais pas pensé à l'ordre des opérations.
Je testerais mon script, cela m'intrigue.
Pour le reste, j'ai testé ta nouvelle solution et j'ai eu trois gardes de coincer au point de départ. Citation : Par contre pour faire les tests, j'ai mis le script dans le OnSpawn de la créature "interpretor", est ce le bon endroit ? Pas forcément. Vu que je suggérais de créer "interpretor" avec l'éditeur, le OnSpawn est donc déclenché dès le démarrage du module... Il se passe tellement de chose (notamment plein d'autres OnSpawn de plein d'autres créatures et j'en passe) pendant un démarrage de module que ce n'est pas le moment idéal pour "charger la barque".
Moi je pensais que ce script pouvait être lancé à partir d'un dialogue comme "Action résultante" ou encore par l'activation d'un objet ou l'entrée dans un trigger. Bref, à un moment où il n'y a que ça à faire. Le meilleur moyen de le tester est encore d'utiliser la console pour le lancer indépendamment de tout évènement (dm_runscript). _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
aldech Gagnant du Concours Gothic 3 Messages: 61 Localisation: Le Havre |
J'ai essayé avec un trigger et dm_runscript, cela marche parfaitement !!
|
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Je ne sais pas si cela est purement en relation avec la puissance de la machine, mais chez moi, la première des solutions que j'ai proposé fonctionne au quart de poil. Comme elle est plus simple, je la conseille davantage que la seconde quand même nettement plus lourde et moins évidente à comprendre.
_________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
Claythest Ecuyer Messages: 61 |
Ben merci à vous tous pour toutes vos réponses, je n'ai pas encore le temps de tester ces scripts (emploi du temps chargé... ), mais c'est prévu, dès que je reprends nwn, je vous donnerai mon avis (j'espère ce week-end... ) !
Encore merci pour votre aide ! |
Revenir en haut | |
Claythest Ecuyer Messages: 61 |
Je tiens tout d'abord à vous remercier tous pour vous etre penché sur ce sujet, mais bon finalement je vais m'y prendre autrement parce que sur ma machine c'est un peu lourd tout ca...
Mais bon j'espere que ca aidera quelqu'un d'autre... Voila donc merci à vous tous (maintenant au moins si l'envie me reprend je saurais comment faire ! ) ! |
Revenir en haut | |
eldric Novice Messages: 17 |
j'arrive un peu tard mais pourquoi ne pas faire de la maniére suivante en rajoutant un sous programme en amont du programme principal :
NWScript : void cree () { location lLoc = GetLocation (GetObjectByTag("Tag de la porte")); CreateObject(OBJECT_TYPE_CREATURE, "gard", lLoc , FALSE); } void main() { DelayCommand(2.0, cree()); DelayCommand(4.0, cree()); DelayCommand(6.0, cree()); DelayCommand(8.0, cree()); } _________________ Mieux vos régner en maitre en Enfer plutôt que servir au Paradis !! |
Revenir en haut | |
Claythest Ecuyer Messages: 61 |
J'y avait pensé, mais le probleme c'est que après avoir créé le guarde, j'avais besoin de lui donner des ordres plus tard... Donc il me fallait récupérer tous les objets correspondants aux guardes créés...
Et avec cette méthode je ne peux pas . Mais sinon c'est vrai que c'est plus simple. Merci pour ta réponse Au fait t'as vu Eldric, on s'est inscrit le même jour ! |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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