Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Les Questions du Drakalien
Les Questions du Drakalien
Par Drakalien o Amlugaer le 12/10/2002 à 20:21:21 (#2324300)
Bien, je commence ma campagne et je sens que je vais avoir bon nombre de trucs à demander, alors je me fais un topic spécial pour ça. :cool:
On commence tout de suite:
Est-ce qu'il existe une fonction permettant, d'une part de faire balader une créature entre ses waypoints, et de la faire attendre plusieurs minutes à chaque waypoint atteint ? Y'a bien la fonction WalkWayPoints() avec une valeur fPause paramétrable, mais j'ai pas pigé l'utilité de fPause, je change sa valeur et ça ne donne aucun résultat dans le jeu.
Ou bien quel autre moyen existe-t-il ?
Merci bien pour les réponses.
Par Drakalien o Amlugaer le 12/10/2002 à 21:13:17 (#2324593)
Par Jedaï le 13/10/2002 à 1:17:56 (#2325791)
WalkWaypoints(FALSE, 240.0); Normalement ça devrait marcher:confus:
Par Drakalien o Amlugaer le 13/10/2002 à 14:32:55 (#2327703)
Alors j'ai essayé un peu plus compliqué:void main()
{
object oWP001 = GetNearestObject(OBJECT_TYPE_WAYPOINT, OBJECT_SELF, 1);
object oWP002 = GetNearestObject(OBJECT_TYPE_WAYPOINT, OBJECT_SELF, 2);
object oWP003 = GetNearestObject(OBJECT_TYPE_WAYPOINT, OBJECT_SELF, 3);
object oWP004 = GetNearestObject(OBJECT_TYPE_WAYPOINT, OBJECT_SELF, 4);
int nRand = Random(4);
while(nRand < 5) //Boucle infinie, je ne sais pas comment faire mieux...
{
int nRand2 = Random(190);
IntToFloat(nRand2);
if(nRand == 0)
{
ActionMoveToObject(oWP001, FALSE, 0.1);
ActionWait(nRand2);
}
if(nRand == 1)
{
ActionMoveToObject(oWP002, FALSE, 0.1);
ActionWait(nRand2);
}
if(nRand == 2)
{
ActionMoveToObject(oWP003, FALSE, 0.1);
ActionWait(nRand2);
}
if(nRand == 3)
{
ActionMoveToObject(oWP004, FALSE, 0.1);
ActionWait(nRand2);
}
}
}
Et, ooah, je me heurte (en tant que bon débutant du nwn scripting) à des erreurs que je ne comprends pas:
le compilateur m'annonce l'erreur "DECLARATION DOES NOT MATCH PARAMETERS" à mes ActionWait(nRand2). Je ne pige pas où est le problème...
:aide:
Par Tyn' le 13/10/2002 à 15:13:25 (#2327955)
1° NWN ne supporte pas les boucles infinies, dumoins pas de la manière où tu l'a faite. Tu peux en revanche faire quelque chose comme ça ://:: Fichier : bcl_infinite.nss
Ainsi, toutes les 2,5 seconde, un message sera envoyé aux DMs. Attention de ne pas oublier un DelayCommand sur la rééxecution du script, sans quoi le jeu à de fortes chances de crasher.
void main()
{
SendMessageToAllDMs("Passage de la boucle !");
DelayCommand(2.5f,ExecuteScript("bcl_infinite"));
}
2° La fonction ActionWait() demande un FLOAT en paramètre. Ta variable nRand est un integer. Essaye avec :ActionWait(IntToFloat(nRand));
Par Jedaï le 13/10/2002 à 15:15:27 (#2327964)
Deuxio, ActionWait() attend un float comme paramètre, pas un entier, fais donc :
float nRand2 = 1.0*Random(190);
Ca devrait marcher.
[EDIT] C'est bien beau d'avoir mis IntToFloat() mais aucune fonction de NWN n'accepte le passage de paramêtre par référence, autrement dit, nRand2 n'est pas modifié par la fonction...cette fonction renvoie bien un float mais comme tu ne le met nulle part... :rolleyes: Je parle ici de la façon dont tu l'as utilisé, la suggestion de Tyn' marche parfaitement.
Tertio, ton script ne marche pas, examine-le bien et tu constatera que ton nRand est fixé une fois pour toute avant la boucle , le personnage se dirigera donc vers un WP et y attendra pendant tout le jeu, si ta boucle ne fait pas tout péter rapidement, en effet, ActionWait() ne fait pas attendre l'éxécution du script, il fait juste attendre le NPC...:eek:
Un NPC dont la file d'action sera vite pleine et archipleine...
Donc, on reprend tout à 0 :
Rajoute cette ligne à la fin du script dans le OnSpawn du personnage :
ExecuteScript("wppause", OBJECT_SELF);
Et crée un autre script auquel tu donneras le nom de "wppause", ne le met nulle part :
void main()
{
float nRand2 = 1.0*Random(190);
int nRand1 = d4(1);
object o = OBJECT_SELF;
string sWP = "WP_"+GetTag(o)+"_0"+IntToString(nRand1);
if (!IsInConversation(o))
{
ActionMoveToObject(GetWaypointByTag(sWP));
ActionWait(nRand2);
ActionDoCommand(ExecuteScript("wppause", o));
}
else DelayCommand(30.0, ExecuteScript("wppause", o));
}
Ca devrait marcher, si tu crée tes waypoints selon la méthode usuelle.
Par Drakalien o Amlugaer le 13/10/2002 à 18:23:25 (#2328934)
C'est bien beau d'avoir mis IntToFloat() mais aucune fonction de NWN n'accepte le passage de paramêtre par référence, autrement dit, nRand2 n'est pas modifié par la fonction...cette fonction renvoie bien un float mais comme tu ne le met nulle part...:rolleyes:
Ouaip, effectivement. Je suis nul de ne pas avoir vu ça.ton script ne marche pas
Hihi, heu oui, ben heu, c'était pour vous tester ! Bravo Noble Jedaï, tu as gagné ton diplôme ! :ange:
Et Tyn', ben ne t'inquiète pas tu as droit quand même à un cadeau consolation que je te donnerais dès que j'ai un autre problème avec mes scripts. :pActionWait() ne fait pas attendre l'éxécution du script, il fait juste attendre le NPC...:eek:
Ah, ça j'avais pas vu non plus. Merci pour mon processeur qui grâce à toi n'a pas roti.
Bon ben ton script marche très bien, ché super ! Maintenant j'ai des vaches qui déplacent leur gros ventre dans un champ après se l'être copieusement rempli d'herbe grasse pendant quelques minutes. la classe :cool:
P.S.: Au fait, pourriez-vous me dire dans quelle situation il faut utiliser ActionDoCommand() ? Je n'ai pas saisi l'utilité de cette fonction.
P.S.: grumbll, c'est tout de même plus facile de programmer sur ma calculette graphique.
Par Jedaï le 13/10/2002 à 19:51:56 (#2329481)
Ah Ouaissss !!
Par Drakalien o Amlugaer le 13/10/2002 à 20:49:18 (#2329836)
Ca m'a l'air top moumoute.
Deuxième problème du Drakalien:
Par Drakalien o Amlugaer le 14/10/2002 à 18:49:36 (#2335074)
void main()
{
object o = OBJECT_SELF;
SetLocalInt(o, "nRand", d10(1));
SetLocalFloat(o, "fRand2", 1.0 * d10(7));
SetLocalString(o, "sWP", "WP_"+GetTag(o)+"_0"+IntToString(nRand) );
SetLocalObject(o, "oWP", GetObjectByTag(sWP));
if (!IsInConversation(o) && GetIsObjectValid(oWP))
{
ActionMoveToObject(GetWaypointByTag(sWP));
ActionWait(fRand2);
ActionDoCommand(ExecuteScript("sc_vachbouge", o));
}
else DelayCommand(0.0, ExecuteScript("sc_vachbouge", o));
}
(En fait je pense qu'aucun de mes SetLocalMachin ne marche...à ce qu'il me semble)
Une idée du problème?
Par Jedaï le 14/10/2002 à 19:23:20 (#2335334)
Par ailleurs ton script ne peut marcher pour les raisons suivantes :
_ Tu fais des SetLocalInt() et tu essaie ensuite d'utiliser les local int comme si tu les avais déclarés dans ton script (ActionWait(fRand2);, ce qui n'est pas le cas. Les local int ne sont accessible que par GetLocalInt(object ,string NomDeLaVariable);, même à l'intérieur d'un script lancé par l'objet sur lequel la variable local est stockée.
_Ma string pour le WP n'était prévu que jusqu'à 9 WP pour chaque utilisateur du script, si ça ne suffit pas dis-le mais je pense que 9 WP pour un personnage c'est pas mal. Pour obtenir entre 1 et 9, utilise (Random(9)+1)
_Ce n'est pas vraiment une erreur mais faire DelayCommand(0.0, ExecuteScript("sc_vachbouge", o)); c'est exactement la même chose que : ExecuteScript("sc_vachbouge", o); .
Par Drakalien o Amlugaer le 16/10/2002 à 18:45:06 (#2347553)
Théoriquement, le fait que mon script se lance plusieurs fois sur des vaches différentes ne doit pas poser problème
Ah bon, mais alors j'ai pas tout à fait pigé un truc, concernant la définition des variables.
Voyons une des situations que j'avais vues, qui je pensais poserait problème:
On a deux vaches utilisant ton script, la première le lance à un moment et donc commence à se déplacer vers un des waypoints; pendant son chemin, la deuxième lance à son tour le script et se dirige vers un autre wp; la deuxième vache arrive et elle va chercher la variable nRand2 pour savoir combien de temps elle doit attendre, seulement entre-temps la vache 2 a changé cette variable et donc la vache 1 va finalement attendre le même temps que la deuxième vachette...
Bon mais la où je me plante peut-être c'est sur le fait que les deux vaches font varier la même variable... Les variables définies bêtement par int ou string, etc, elle sont stockées à quel niveau? et réutilisable à quelles conditions?
En fait: quelles sont toutes les différences entre variables locales et "générales"?
Voilà, pour le reste, c'est bon j'ai reglé tout mes problèmes et j'ai malgrès tout utilisé des Locales :).
Pfoulala, c'est quand même dur d'être débutant, tu passes ton temps à dire et faire des bourdes.
Boh, je crois que je vais faire un tour dans les leçons pour les quiches, je croyais que je n'en étais plus une mais... :sanglote:
Ahh ok
Par Drakalien o Amlugaer le 16/10/2002 à 22:17:43 (#2348823)
C'est ce que mon cerveau me chuchotait, mais je trouvais ça louche.
Bin merde alors, on doit se crever à chaque fois à mettre des SetLocalInt(oChapeau, "sLapin", 1) si on veut conserver sa variable? C'est fatiguant !:monstre: Va falloire que je me crée une "fonction raccourci" avec un nom plus simple.
(ah puis faut que j'arrête mes posts inutiles. Ce serait une bonne résolution.)
Par Tyn' le 16/10/2002 à 22:19:22 (#2348829)
Par Drakalien o Amlugaer le 16/10/2002 à 23:35:23 (#2349188)
:confus:
Par Tyn' le 16/10/2002 à 23:59:11 (#2349276)
Pour un module online, il s'agit de la sauvegarde serveur qui enregistre toutes les variables de type SetLocalXX SAUF les SetLocalXX liés à un PJ. Il existe néanmoins des alternatives (PWUM, Itemizer,...). Pour un module offline, pareil, sans alternatives.
JOL Archives 1.0.1
@ JOL / JeuxOnLine