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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Spawn régulier de créatures

Par Père Elric--- le 2/11/2002 à 14:27:39 (#2462016)

Je cherche mais j'ai du mal a m'imaginer un script qui ferait spawn regulierement des créatures si les autres ont été éliminé ...

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)

Ben, le plus simple, c'est de faire un script dans le OnDeath avec un DelayCommand


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)

Merci sa va faire exactement ce que je voulais ! :merci:

Par Jedaï le 2/11/2002 à 15:06:26 (#2462275)

Attention eMRaistlin, les DelayCommand() sur les OnDeath sont toujours sensibles et ici en particulier y a quelque chose qui risque de ne pas marcher :



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)

J'ai suivi ton conseil Jedaï et voici ce que donne le script modifié :



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)

Euh... c'est pas ca qui fait l'erreur, mais attention : OBJECT_SELF sur un UserDefined va appeler l'area ou le module, suivant ce sur quoi tu le pose... c'est plutot un script pour un OnDeath...


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)

Excuse ma nioubissité mais... le premier je le met dans le OnDeath?? :doute:

Par Mastokk le 2/11/2002 à 16:28:00 (#2462794)

Ce que tu demande est implémenté dans le module Goblins vs kobold de Bioware.

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)

Pour les DelayCommand dans le OnDeath, autant que je saches ça ne marche plus du tout (quelque soit le code dans le delay) une fois que la créature est effectivement détruite.
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