Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Spawn régulier de créatures
Spawn régulier de créatures
Par Père Elric--- le 2/11/2002 à 14:27:39 (#2462016)
Mais que les Pj ait le temps de souffler , je ne veut pas d'un spawn aussi tot que les monstres son mort.
Si quelqu'un pouvait au moin me guider , je me chargerai du script :merci:
Par eMRaistlin le 2/11/2002 Ã 14:40:30 (#2462093)
Par exemple, tu fais un script qui recupere une position aleatoire parmi des WP placé sur l'area, et tu t'arrange pour que le resref soit egual au tag... strictement egual :
void main()
{
float fDelay = 10.0f; //ICI, le delai a attendre
int nNombredeWP = 5; // ICI, TU CHANGE en fonction de ton area
int nRandomLoc = Random(nNombredeWP )+1;
location lWhere = GetLocation(GetWaypointByTag("RSPWN_"+IntToString(nRandomLoc)));
DelayCommand(fDelay,CreateObject(OBJECT_TYPE_CREATURE,GetTag(OBJECT_SELF),lWhere,FALSE));
}
Par Père Elric--- le 2/11/2002 à 14:59:25 (#2462235)
Par Jedaï le 2/11/2002 à 15:06:26 (#2462275)
DelayCommand(fDelay,CreateObject(OBJECT_TYPE_CREATURE,GetTag(OBJECT_SELF),lWhere,FALSE));
Le GetTag(OBJECT_SELF) risque de s'exécuter en même temps que le CreateObject() et il va avoir du mal à récupérer le Tag d'une créature...qui n'existe plus ! ;)
Il est préférable ici de stocker ce tag dans une variable avant de faire le DelayCommand() et d'utiliser cette variable comme tu l'as fais pour lWhere. Peut-être que ça marcherait tout de même avec le GetTag() mais j'ai eu trop de problème avec les DelayCommand() sur les OnDeath pour prendre le risque de remplacer une armée de monstres par des blaireaux... :)
Par Père Elric--- le 2/11/2002 à 15:22:50 (#2462403)
int nApellepar=GetUserDefinedEventNumber();
void main()
{
switch(nApellepar);
{
case 1007:
object oPoulet=GetObjectByTag(GetTag(OBJECT_SELF));
float fDelay = 15.0f; //ICI, le delai a attendre
int nNombredeWP = 6; // ICI, TU CHANGE en fonction de ton area
int nRandomLoc = Random(nNombredeWP )+1;
location lWhere = GetLocation(GetWaypointByTag("RSPWN_"+IntToString(nRandomLoc)));
DelayCommand(fDelay,CreateObject(OBJECT_TYPE_CREATURE,oPoulet,lWhere,FALSE));
}
}
Mais meme avant d'avoir fait la modification je ne peut compiler car sur la ligne du DelayCommand il me dit DECLARATION DOES NO MATCH PARAMETERS
Et impossible de resoudre le probleme Oo
Par eMRaistlin le 2/11/2002 Ã 16:13:43 (#2462701)
Merci pour le conseil, eadï... c'est vrai que ce serait a tester..^^
Bon, essaye ca :
void main()
{
object oArea = GetArea(OBJECT_SELF);
string sResref = GetTag(OBJECT_SELF);
float fDelay = 10.0f; //ICI, le delai a attendre
int nNombredeWP = 5; // ICI, TU CHANGE en fonction de ton area
int nRandomLoc = Random(nNombredeWP )+1;
location lWhere = GetLocation(GetWaypointByTag("RSPWN_"+IntToString(nRandomLoc)));
DelayCommand(fDelay,SignalEvent(GetArea(OBJECT_SELF),EventUserDefined(9999)));
SetLocalString(oArea,"resref",sResref);
SetLocalLocation(oArea,"location",lWhere);
}
puis, tu met ca dans le userDefined :
int nApellepar=GetUserDefinedEventNumber();
object oArea = OBJECT_SELF;
void main()
{
switch(nApellepar)
{
case 9999:
CreateObject(OBJECT_TYPE_CREATURE,GetLocalString(oArea,"resref"),
GetLocalLocation(oArea,"location"));
break;
}
}
Par Père Elric--- le 2/11/2002 à 16:17:53 (#2462734)
Par Mastokk le 2/11/2002 Ã 16:28:00 (#2462794)
Ils utilisent 2 scripts, un sur chaque créature (j'ai pas bien regardé mais je crois que la créature check elle même combien il reste de ses compatriotes) et un autre je sais plus où.
Il te suffit d'ouvrir le module, de regarder comment ils ont fait et de modifier ca comme tu le désires. A gauche, tu as un menu déroulant avec marqué scripts, dedans tu verra les 3 scripts qu'ils utilisent (y en a 3 parce que les scripts sur les créatures sont au nombre de 2, 1 pour les gobs et 1 pour les kobis, mais en fait c'est le même script modifié).
Par LeProctophantasmiste le 2/11/2002 Ã 17:08:12 (#2463062)
Il y a une logique derrière cela, dans NWScript tout script et toute instruction doit avoir un caller valide ce qui ne serait pas le cas ici.
Un fil qui s'est orienté vers ce problème, avec un petit test de vérification à la fin.
L'astuce consiste à passer l'instruction à un objet, qui, lui , est encore valide i.e.:
AssignCommand(oObjectEncoreEnVie,DelayCommand(....));
Avec GetArea(OBJECT_SELF) il y a peu de chance que ça rate....
JOL Archives 1.0.1
@ JOL / JeuxOnLine