Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Les Questions du Drakalien

Par Drakalien o Amlugaer le 12/10/2002 à 20:21:21 (#2324300)

Salutations.

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)

Pffou c'est chiant de bloquer sur des scripts aussi basiques!

Par Jedaï le 13/10/2002 à 1:17:56 (#2325791)

Je ne sais pas si c'est ça mais essaie avec :
WalkWaypoints(FALSE, 240.0); Normalement ça devrait marcher:confus:

Par Drakalien o Amlugaer le 13/10/2002 à 14:32:55 (#2327703)

Non, ça marche pas...

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)

Deux choses :

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
void main()
{
SendMessageToAllDMs("Passage de la boucle !");
DelayCommand(2.5f,ExecuteScript("bcl_infinite"));
}
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.

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)

Bon alors d'abord la boucle infinie classique est le for( ; ; ) mais bon...
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)

Ben merci pour l'aide, vous avez même prévu mes futures questions c'est génial !

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. :p

ActionWait() 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)

ActionDoCommand() a cela de super qu'il transforme en action (et donc introduit dans la file d'action) une fonction quelconque pourvu qu'elle ait comme type de retour void (elle ne renvoie aucune valeur, contrairement à GetIsPC() par exemple qui renvoie TRUE ou FALSE), ça permet de ne faire s'effectuer cette fonction qu'après qu'un NPCs ait fini d'effectuer ses autres actions (ici aller jusqu'au WP et attendre). C'est particulièrement utile quand on ne sait pas combien de temps cela va prendre (sinon on utilise DelayCommand()).

Ah Ouaissss !!

Par Drakalien o Amlugaer le 13/10/2002 à 20:49:18 (#2329836)

Glop glop, ça y est je vois l'utilité !! :eureka:
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)

J'ai changé un peu le script de Jedaï, histoire qu'il n'y ait pas de problèmes lorsque deux vaches générent le script en même temps, mais j'ai encore des erreurs que je pige pas (pour le "SetLocalString", j'obtiens l'erreur VARIABLE DEFINED WITHOUT TYPE (je crois que c'est parce que l'integer nRand n'est pas reconnu...)) :

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)

Théoriquement, le fait que mon script se lance plusieurs fois sur des vaches différentes ne doit pas poser problème, au contraire, ce script est justement fait pour que tu puisse le mettre sur n'importe quel NPC (y compris des vaches) sans en modifier une ligne... :D

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)

Les int, float, string, sont temporaires.
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)

Et les SetLocalMachin liés au personnage ne sont pas sauvegardé, faut le préciser aussi.

Par Drakalien o Amlugaer le 16/10/2002 à 23:35:23 (#2349188)

Hein ?? Mais alors quel type de variables sont conservées?
:confus:

Par Tyn' le 16/10/2002 à 23:59:11 (#2349276)

Aucun, sans sauvegarde.

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