Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Comportements animaux (script)
Comportements animaux (script)
Par Corwin Whitehorn le 29/11/2002 à 0:27:21 (#2668734)
J'ai un troupeau de cerf, avec un male dominant...
J'aimerais que les autres cerf le suivent tout le temps...
J'ai bidouillé le script suivant, mais ca marche pas des masses...
//::///////////////////////////////////////////////
//:: Custom User Defined Event
//:: FileName
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/* Script to make Deer wander and flee from Non-Druid or Ranger Class*/ ----->modifié
//:://////////////////////////////////////////////
//:: Created By: John Cook
//:: Created On: June 23, 2002
//:://////////////////////////////////////////////
void main()
{
int nUser = GetUserDefinedEventNumber();
int isFriend;
int Num;
float Distance;
location Loc;
object oPlayer;
oPlayer = GetLastPerceived();
if(nUser == 1001) //HEARTBEAT EVENT
{
Num = Random(100);
Distance = IntToFloat(Num); //Distance to walk to location
Num = Random(10);
Loc = GetLocation(OBJECT_SELF);
if(Num >= 7)
{
ActionMoveToLocation(Loc,FALSE);
}
}
else if(nUser == 1002) // PERCEIVE EVENT
//{
//isFriend = GetClassByPosition(1,oPlayer);
//if(isFriend != CLASS_TYPE_DRUID)
//if(isFriend != CLASS_TYPE_RANGER)
{
ActionMoveToObject(oPlayer,TRUE,1.0f);
//}
}
}
En fait, comme vous pouvez le voir...j'adapte et je suis pas doué...
Il faudrait qu'ils se laissent approcher par les druides et ranger, mais qu'ils suivent leur chef si il se déplace...
Merci d'avance
Par coolstar le 29/11/2002 à 0:31:39 (#2668762)
Est-ce que par là ça ne rejoindrait pas ta question ?? :D
Par Corwin Whitehorn le 29/11/2002 à 0:37:32 (#2668797)
Bref...je suis une quiche, je sais, mais si quelqu'un pouvait me pondre un script tout fait qui marche, je lui serait éternellement (enfin, presque) reconnaissant...
Par coolstar le 29/11/2002 à 0:45:58 (#2668842)
... et en plus tu saurais chaque fois mieux te dépatouiller à force... :ange:
Le temps sacrifié maintenant, c'est du temps gagné demain... et la fierté d'être soi-même efficace... ;)
:merci:
Par Corwin Whitehorn le 29/11/2002 à 0:53:43 (#2668880)
Et j'en suis seulement aux animaux....Ya encore le campement orque après...
Par coolstar le 29/11/2002 à 1:18:06 (#2669035)
Mais faut que je traduise déjà en fait ce que tu viens de mettre... c'est pas très clair encore... beaucoup d'inconnus pour moi... et puis, des choses étranges aussi, comme à "Décommenter"... :D
Dis-moi ? tu le sors d'où ce Script ?? c quoi ça forme initiale ??? Eclaire-moi tout d'abord SVP! :confus:
...
;)
Par shadoh le 29/11/2002 à 1:20:58 (#2669051)
Alors je t'explique comment je ferais personnellement :
// Perso, je poserais ce script sur le onHeartbeat d'un object invisible
// On reccupere la location du dominant via son tag unique
// On force les cerfs domines a bouger l'endroit ou se trouve le dominant en prenant bien garde que
// chaque cerfs domines aient un tag unique
// Ne surtout pas oublier de mettre un ActionRandomWalk() sur le onHeartbeat du dominant pour le faire bouger
// toutes les 6 secondes si il ne le fait pas par lui meme (je ne sais plus si ils bougent par eux meme)
void main()
{
object oDominant = GetObjectByTag("dominant");//Tag de ton cerf dominant
object oCerf1 = GetObjectByTag("Cerf1");//Tag de ton cerf domine 1
object oCerf2 = GetObjectByTag("Cerf2");//Tag de ton cerf domine 2
object oCerf3 = GetObjectByTag("Cerf3");//Tag de ton cerf domine 3
AssignCommand(oCerf1,ActionMoveToLocation(GetLocation(oDominant)));
AssignCommand(oCerf2,ActionMoveToLocation(GetLocation(oDominant)));
AssignCommand(oCerf3,ActionMoveToLocation(GetLocation(oDominant)));
}
Tu peux aussi passer par la commande ActionForceFollowObject(). Ce qui donnerait ceci :
void main()
{
object oDominant = GetObjectByTag("dominant");//Tag de ton cerf dominant
object oCerf1 = GetObjectByTag("Cerf1");//Tag de ton cerf domine 1
object oCerf2 = GetObjectByTag("Cerf2");//Tag de ton cerf domine 2
object oCerf3 = GetObjectByTag("Cerf3");//Tag de ton cerf domine 3
AssignCommand(oCerf1,ActionForceFollowObject(oDominant, x.xf));// Ou X.Xf correspond à la distance entre le suivi et le suiveur genre 1.0f met un metre de distance
AssignCommand(oCerf2,ActionForceFollowObject(oDominant, x.xf));
AssignCommand(oCerf3,ActionForceFollowObject(oDominant, X.Xf));
}
EDIT : D'ailleur je pense que la 2 ème possibilité sera la meilleure au vu de tes besoins.
Par coolstar le 29/11/2002 à 1:48:13 (#2669155)
Tu peux aussi passer par la commande ActionForceFollowObject(). Ce qui donnerait ceci :
Comme le disait coolstar, qui lui-même le tenait de jaha Effect... :ange:
EDIT
---------------------
Après vérification, je me suis rendu compte que le ActionForceFollowObject est très persistante... donc, je ne suis pas sûr qu'il soit nécessaire de le mettre dans le OnHeartBeat... juste veiller à ce que rien ne l'interrompe (comme le Fin de Dialogue!) sera très bien déjà... rassurez ?? ;)
---------------------
Par Corwin Whitehorn le 29/11/2002 à 10:19:47 (#2670329)
//::///////////////////////////////////////////////
//:: Custom User Defined Event
//:: FileName
//:: Copyright (c) 2001 Bioware Corp. //:://////////////////////////////////////////////
/* Script to make Deer wander and flee from
Non-Druid or Ranger Class
*/
//:://////////////////////////////////////////////
//:: Created By: John Cook
//:: Created On: June 23, 2002 //:://////////////////////////////////////////////
void main()
{
int nUser = GetUserDefinedEventNumber();
int isFriend;
int Num;
float Distance;
location Loc;
object oPlayer;
oPlayer = GetLastPerceived();
if(nUser == 1001) //HEARTBEAT EVENT
{
Num = Random(50);
Distance = IntToFloat(Num); //Distance to walk from location
Num = Random(10);
Loc = GetLocation(OBJECT_SELF);
if(Num >= 7)
{
ActionMoveAwayFromLocation(Loc,FALSE,Distance);
}
}
else if(nUser == 1002) // PERCEIVE EVENT
{
isFriend = GetClassByPosition(1,oPlayer);
if(isFriend != CLASS_TYPE_DRUID)
if(isFriend != CLASS_TYPE_RANGER)
{
ActionMoveAwayFromObject(oPlayer,TRUE,50.0f);
}
}
}
avec les deux lignes
SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT); //OPTIONAL
BEHAVIOR - Fire User Defined Event 1001
SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); //OPTIONAL
BEHAVIOR - Fire User Defined Event 1002
du OnSpawnEvent activées
Et merci pour le script...c'est sympa!!
Par mobidique le 29/11/2002 à 11:33:42 (#2670742)
J'ai utilisé ce script de base et en fait je n'en ai pas été du tout satisfait ... Prend un cerf colle lui ce script charge ton module prend un perso standard non druide non ranger et approche toi du cerf ... il fuit ... très bien ... poursuit le ... il fuit il fuit il fuit pas ... :enerve: ... ben pourquoi ? ...
NwN à l'instar d'un logiciel de simulation procède par l'utilisation d'un échéancier, enfin, l'échéancier est une façon de faire de la simulation d'événements. L'échéancier procède par une discrétisation du temps, forcément on ne peut pas faire du continu ... Cette discrétisation elle a pour unité de base les 6 secondes du OnHeartBeat.
Le script précédent est basé sur un user defined event lancé sur la perception d'un objet dans l'environnement de la créature. Le pb provient du fait que ta créature va fuir un moment mais si tu la poursuis, sa fuite va s'arrêter sans que tu sois sorti de son champ de perception et de fait un perso va pouvoir rester dans le champ de perception de la créature parce que le joueurs n'est plus un nouvel événement dans l'environnement de la créature ...
Pour être exacte, les 2 derniers paragraphes sont plus des intuitions à la fois quand au fonctionnement du moteur NwN et de son incidence sur le script, faut pas prendre ça pour parole d'évangile ...
Un autre pb avec les animaux sauvage (ou non) non agressifs c'est qu'il appartiennent à la faction commoner, à partir de ce moment là si tu tue un cerfs quelque part toute les chauve souris de la région tout les lapins te prennent en grippe et te saute dessus ... marche sur une poule par inadvertance et le commandant du port à 10 tiles de là va te sauter à la gorge pour t'étrangler ... En particulier, à l'image de ce script, j'ai voulu en faire un autre où des sangliers, bestioles aggro par défaut, allaient attaquer tous les non-druides non-rangers .. A la rigueur ça tient plus la route que le script de fuite, puisque la bestiole alors doit attaquer les non druides non ranger et ne rien faire en présence des autres ... Pb, pour qu'il attaque pas un druide-ranger, enfin c'est l'approche que j'avais utilisé, mais c'était peut être pas la bonne j'avais passé le sanglier en faction commoner, et s'il attaquait un PJ il passait en faction hostile automatiquement. Un pb je crois c'était que si un druide lattait un sanglier, il passait tout les animaux en hostile aussi enfin ... un bordel ...
J'ai abandonné l'idée de mettre des bambis et des lapins dans mes bois, ça faisait joli mais ça n'apportait rien à mon histoire ...
Par eMRaistlin le 29/11/2002 à 11:53:56 (#2670890)
la seule solution : des nouvelles factions (une par race, ou alors des regroupements coherents.)
Pour ce qui est du onPerception qui se reset pas si l'on ne sort pas du champs, je me demande si ce serait pas interressant d'essayer un
ActionForceMoveToObject(oPC,TRUE,20.0f,10.0f);
Je me demande si Le 20.0 force la creature a bouger a 20.0 metres du oPC, ou si ca interromp l'action si la distance est inferieur a 20
Si quelqu'un pouvais tester...
[EDIT, pour ceux qui veulent tster, mais qui ne veulent pas tout se taper :
OnPerception
void main()
{
object oPC = GetLastPerceived();
if (GetIsPC(oPC))
{
ActionForceMoveToObject(oPC,TRUE,20.0f,10.0f);
SpeakString("Le force move est lancé");
}
}
Par Mastokk le 29/11/2002 à 11:59:27 (#2670935)
Provient du message de eMRaistlin
Ah... les factions... ^^
la seule solution : des nouvelles factions (une par race, ou alors des regroupements coherents.)
Ouais c'est ce que je fais, à chaque nouvel NPC je réfléchis à sa faction est si besoin j'en crée une nouvelle... C'est long mais y a que ca pour que les réactions soient plus ou moins réalistes...
Par shadoh le 29/11/2002 à 12:45:20 (#2671299)
Bref...je suis une quiche, je sais, mais si quelqu'un pouvait me pondre un script tout fait qui marche, je lui serait éternellement (enfin, presque) reconnaissant...
Hey ! j'avais pas lu ça moi :D. Bon alors, je voudrais que tu viennes à l'agence en habit de lapin rose et que tu tues tous les commerciaux qui font rien qu'a papoter et qui me déconcentrent pendant que moi j'essaye d'avancer mon module :D.
PS : j'ai rien compris à la référence d'antériorité qui a été faite coolstar :). Je me fais vieux, je deviens sénile :D.
Par coolstar le 29/11/2002 à 12:52:42 (#2671358)
Par mobidique le 29/11/2002 à 12:57:17 (#2671407)
Provient du message de eMRaistlin
Je parie que ça marche pas si dans le OnSpawn il y a des animations par défaut, mobile ou immobile ou s'il on a affaire à une bestiole instanciée par encounter, pour lesquelles indépendemment du OnSpawn il y a une animation qui est jouée.
Si quelqu'un pouvais tester...
Par ailleurs, un autre pb de ce script c'est que l'on fait fuir la bestiole par rapport à la position du PC au moment de sa perception ... Or si le perso se déplace en poursuivant la bestiole sa position effective n'est pas la même et ta bestiole lorsqu'elle arrive à 20 mètres de l'endroit où elle a perçu le PC, en fait le PC n'a jamais quitté la zone de perception de la bestiole (et d'un) et ensuite le PC n'est pas à 20 de la bestiole (et de 2) ...
C'est chiant hein ... On voudrait en fait que cela se comporte comme des aimants ... Le PC se rapproche, la bestiole s'éloigne ... Peut être est-ce qu'on pourrait jouer sur la capacité de perception de la bestiole, augmenter le range et la sensibilité ... Plutôt que de faire fuir à 20 mètres une bestiole quand un joueur s'en approche à 3 mètres, pourquoi ne pas faire fuir sur 3 mètre une bestioles lorsque le joueur s'en approche à moins de 20 mètres ...
:eureka: ?
Par eMRaistlin le 29/11/2002 à 13:26:19 (#2671625)
Plutôt que de faire fuir à 20 mètres une bestiole quand un joueur s'en approche à 3 mètres, pourquoi ne pas faire fuir sur 3 mètre une bestioles lorsque le joueur s'en approche à moins de 20 mètres ...
Bein, surement pour la meme raison que tu as utilisé le OnPerception : Eviter les Heathbeat pour calculer ^^
[Edit : Je suis par contre sur que Bioware a fait des scripts de fuite pour les NPC... je vais rechercher...]
Par mobidique le 29/11/2002 à 14:43:48 (#2672326)
Je suis pas sûr qu'on soit sur la même longueur d'onde là ... Le script de base de corwin fonctione sur le lancement d'un UserDefinedEvent qui lui même est lancé par le Onheartbeat ... Ca changerai kkchose si on le mettait sur le OnPerception ? Je veux dire en terme de perception effective, ça marche en continue les OnPerception ? Alors que sur le OnHeartbeat l'event n'est lancé que toute les 6 secondes ... :confus: ...
Mon idée est qu'en poussant la sensibilité et la distance de perception si c'est possible, y a un truc kkpart je suis presque sûr, tu as plus de chance sur les 20 mètre de percevoir le PC et que la bestiole se tire ... par ailleurs il serait le cas échéant possible d'augmenter la vitesse de déplacement (ça aussi y a un réglage kkpart et si y en a pas y a qu'a appliquer un effect ... ) du cerf de sorte que lorsque le cerf se tire la distance entre le PC et le cerf augmente plutôt que d'être constante, ainsi lorsque le cerf s'arrête il est bien loin du PC et lorsque ce dernier rentre à nouveau dans l'air de perception du cerf il entraine à nouveau la fuite ddu cerf ... capice ?
Par eMRaistlin le 29/11/2002 à 15:17:13 (#2672573)
- 1: Le OnPerception regarde en permanence, mais comme tu l'a dis, une fois flaggé percu, seul la disparition fera a nouveau reagir le OnPerception. Donc, c'est pas cool ( a moin qu'on s'en serve pour justement arreter le cerf de suivre le Pc : une fois qu'il ne voit plus le PC, il s'arrete...^^... a creuser..)
- 2 :Le heartbeat, sur des animaux de forets, ca va trop bouffer le proc, sauf si tu ne met qu'une seule créature, mais dans ces cas la, ca fait un peu foret LeaderPrice... our un animal fantastique, a la rigueur. L'avantage du Hearthbeat, c'est que du coup, l'animal se cree lui meme des events a verifier. Donc, toute les 6 sec, tu verifie qu'il n'y a pas un PC a moins de 6 sec de lui-meme (grosso-modo), si oui, il s'enfuit, si non, il retoune brouter son herbe et arrete de nous embeter sur les fora ^^
- 3 :Le probleme de pousser la vitesse de creature (c'est tout a fait faisable dans ses propriete, et en etant plus tordu, en appliquant un effet Haste temporaire.) c'est que du coup, ca fais un NPC trop rapide (visuellement bizarre, et en combat, 4 attaqu par tour ^^)
- 4 :Augmenter la perception, c'est tout a fait faisable...
Par contre, ce que je disait, justement, c'est que je ne savais pas si une creature qui percoit un objet a moins de 20 metres et qui possede un OnPerception : forcemoveto20metres va bien s'eloigner du PC.
je pense que oui. mais je suis au boulot, et ne peut par consequent tester.
Dans le cas ou ca marche, justement, je mettrai plus de 20metre, et je demandrait une perception moyenne, afin de pouvoir faire un ClearAllActions sur l'evenment OnPerception (
void main()
{
if GetIsPC(GetLastPerceived())
{
if (GetLastPerceptionVanished())
ClearAllActions();
}
}
Tu vois ce que je veux dire ?
Et du coup, plus besoin de modifier un monstre Ok, ni de calculer et recalculer en permanence la distance entre le Pc et le NPC, vu que le force move va le forcer a aller trop loin pour percevoir le PC, et que le OnPerception va l'arreter si il arrete de percevoir le Pc...
Par mobidique le 29/11/2002 à 15:51:03 (#2672861)
Ben en théorie Bioware dans son onspawn à prévu un comportement spécial pour les herbivores, pas de bol ça marche pas ...
2-> .... Ben je sais pas quels essais tu as fait ... mais perso dans trashcity2 j'avais une zone kkchose comme 16 * 24 c'est déjà assez grand quand même, ben quand t'as mis 3 cerfs 3 sanglier et 3 putois DLMQT t'as rempli ta zone ... c'est vite fait .. après parmi ceux là) y en a qui sont naturellement aggro pour lesquels il n'y a rien à faire et pour l'exemple du cerf il faut faire un cerf unique suivi comme tu l'as indiqué par d'autre cerfs ... les suiveur n'ont pas besoin de ce comportement spécial ...
Avec le spoint 1, 3 et 4 on se retrouve avec un cerf qui fuit très vite, très tôt et très loin ce qui laisse le temps sans doute à ce que le PC soit flaggué non perçu ou déflagué vu comme tu veux.
20 mètres ça fait déjà 2 tiles ... Je vois ce que tu veux dire mais j'ai jamais parlé de recalculer en permanence la distance entre le PC et la bestiole :doute: ... Haaaaa ... c'est comme ça que tu interprètes le script de base ? Beuh non ... je vois pas d'où tu sorts ça
:confus:
Par shadoh le 29/11/2002 à 16:33:03 (#2673211)
Une petite précision au fait. Lorsque tu parles d'utiliser le onPerception pour stopper la cerf, eMRaistlin, tu passes donc par l'attribution de variables pour le cas ou le PC est vu et celui ou il n'est pas vu déclenchant ainsi la fuite ou l'arrêt. Ou bien tu utiliserais juste le onPerception pour stopper le cerf tout en utilisant le onHeartbeat pour vérifier la présence d'un PC toutes les 6 secondes ?
Par eMRaistlin le 29/11/2002 à 16:55:03 (#2673398)
DLMQT ?? (pas compris... sorry)
Pour ce qui est du nombre de zone, je peuple mes zones sur NWNRo de 50 monstres par map en moyenne, aggressif ou non, et ca rend raiment bien ^^ c'estpour ca que j'economise un max sur le OnHrtBt (deja que 50% est affuble d'un HeartBeat afin de looter les objets qui trainasseraient de trop ;))
D'ou l'utilisation du OnPerception, qui est de toute facn automatiquement calculé a chaque fois.Avec le spoint 1, 3 et 4 on se retrouve avec un cerf qui fuit très vite, très tôt et très loin ce qui laisse le temps sans doute à ce que le PC soit flaggué non perçu ou déflagué vu comme tu veux.
Je suis d'accord, mais avec ca, tu peux pas organiser une chasse a cours, ni autre chose : le NPC ira toujours trop vite et trop loin, ce qui me semble moins naturel.Je vois ce que tu veux dire mais j'ai jamais parlé de recalculer en permanence la distance entre le PC et la bestiole
Je sais.. ^^ je disais ca pour vendre mon bifteak (^_^)y
@Shadoh :
ni l'un ni l'autre : je pense que le OnPerception declencherait un mouvement, et qu'un autre evenement du onPerception declencherait le stop, suivant que l'evenement percu en dernier soit la vue d'un PC, ou sa disparition... Donc, aucune variable (qui ralentisse encore le mod) ou aucun heartbeat. (je pense vraiment que le heartbeat doit etre proscrit pour gerer la vie quotidiene des objet qui ne font que peupler et rendre vivant un mod. Sauf besoin specifique, of course !!)
On pourrait essayer ça
Par Jedaï le 29/11/2002 à 17:04:41 (#2673481)
*Sur le OnPerception, un script vérifie la classe du PC et s'il n'est pas druide ou rodeur, colle sur le cerf un local int "bFlee" à TRUE et lui fait démarrer sa fuite par rapport au PC qu'on mémorise dans "oFlee".
*Sur le OnHeartbeat : si "bFlee" est à TRUE, on s'éloigne de "oFlee" sinon rien (c'est pas trop lourd : un seul test en général )
*Sur le OnPerception, si le PC disparait on fait ClearAllActions() on supprime "bFlee" et "oFlee".
Il me semble que cette solution marcherait pas trop mal non ?:p
Par Jedaï le 29/11/2002 à 17:09:49 (#2673520)
Par Corwin Whitehorn le 29/11/2002 à 19:05:23 (#2674394)
Par Jaha Effect le 29/11/2002 à 19:16:22 (#2674483)
Provient du message de Corwin Whitehorn
Ben je vois que le topic intéresse du monde....Merci beaucoup pour vos efforts (même si je comprends pas la moitié de ce que vous écrivez):confus:
Héhéhéhé c'est le problème avec perfectionnistes qui peuplent ce forum, on part d'une question simple et on refait le monde ;)
Jaha Effect :D
Par coolstar le 30/11/2002 à 9:10:35 (#2677629)
Dommage que les Titres de nos Avatars soient fonction de la fréquentation de tous les Forums Jeux Online confondus et non fonction de la fréquentation du Forum Maskado !! on aurait au moins une meilleure idée de quels Vétérants on peut trouver par ici... :D
JOL Archives 1.0.1
@ JOL / JeuxOnLine