Random, aléatoire, au hasard quoi !

Répondre
Partager Rechercher
Bien, voilà, j'ai cherché de partout un script permettant de faire spawner une créature ou un pnj à une location aléatoire, mais je n'ai pas trouvé. Alors j'ai fais la chose suivante, mais j'ai besoin d'aide pour le compléter ; en effet, je n'entrave que dalle aux fonctions de random, et j'ignore totalement comment faire pour que ma bestiole spawn au WP_01, 02 etc... jusqu'au 05

Code PHP:

//A mettre sur le OnEnter d'un trigger pour faire spawner un daim à en WP aléatoire
void main()
{

object oPC GetEnteringObject();

if (!
GetIsPC(oPC)) return;

object oTarget;
object oSpawn;
oTarget GetWaypointByTag("WP_01");

// Là normalement il devrais y avoir quelque chose introduisant la notion d'aléatoire, mais quoi ?
oSpawn CreateObject(OBJECT_TYPE_CREATURE"daim01"GetLocation(oTarget));

oTarget oSpawn;

AssignCommand(oTargetActionStartConversation(oPC"dl_daim01"));

oTarget oSpawn;

ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_POLYMORPH), GetLocation(oTarget));


Alors si une âme charitable pouvait me modifier ce script et m'expliquer le pourquoi du comment de la chose, ça serait MMMMMMMerveilleux !

Un truc comme ça ?
Code PHP:

    object oTarget GetNearestObjectByTag("WP_" IntToString(d3())); 

Il faut que tes waypoints s'appellent WP_1, WP_2, ... WP_10 etc. Ce qui au demeurant et la manière de numéroter de l'editeur quand aprés avoir fait tes wp, tu les séléctionnes tous et tu fais une série. Aprés je ne sais pas combien de fonction dX() existent, mais comme il existe un fonction d100 tu dois pouvoir faire exactement celle que tu veux avec un peu de calcul ...
Re: Random, aléatoire, au hasard quoi !
Citation :
Provient du message de Fröhnir
Code PHP:

//A mettre sur le OnEnter d'un trigger pour faire spawner un daim à en WP aléatoire
void main()
{

object oPC GetEnteringObject();

if (!
GetIsPC(oPC)) return;

object oTarget;
object oSpawn;
oTarget GetNearestObjectByTag("WP_" IntToString(d3()));

oSpawn CreateObject(OBJECT_TYPE_CREATURE"daim01"GetLocation(oTarget));

// je ne trouve pas trés sain de renomer ton spawn oTarget quand oTarget a été défini différemment
// auparavant ... 
oTarget oSpawn;

AssignCommand(oTargetActionStartConversation(oPC"dl_daim01"));

// J'dois êt' niais ... Ca sert à quoi ça dessous ? Cette nouvelle affection ?
oTarget oSpawn;

ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_POLYMORPH), GetLocation(oTarget));


Mon code serait le suivant :
Code PHP:

//A mettre sur le OnEnter d'un trigger pour faire spawner un daim à en WP aléatoire
void main()
{

    
object oPC GetEnteringObject();

    if (!
GetIsPC(oPC)) return;

    
object oTarget;
    
object oSpawn;
    
oTarget GetNearestObjectByTag("WP_" IntToString(d3()));
    
oSpawn CreateObject(OBJECT_TYPE_CREATURE"daim01"GetLocation(oTarget));

    
AssignCommand(oSpawnActionStartConversation(oPC"dl_daim01"));
    
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_IMP_POLYMORPH), GetLocation(oSpawn));


Voila.

Sinon, on peut aussi creer la localisation totalement au hasard... mais a ca à un inconvenient majeur si ta zone est surelevée par endroits (bosses / monticules / etc), que tu crée un monstre a l'altitude normale, il sera invisible... (il va être jouable, combatable et tuable, mais invisible, car spawné sous le sol...)
Bah que dire sinon un grand MERCI !

Citation :
Code PHP:

// J'dois êt' niais ... Ca sert à quoi ça dessous ? Cette nouvelle affection ?
oTarget oSpawn
Euh, c'est vrai ça, pourquoi j'ai mis ça là déjà
Faut dire que la scriptation n'est pas un état naturel chez moi, ça demande ENORMEMENT d'efforts intellectuels...

Et euh... comment on fait pour faire spawner aléatoirement différentes bestioles ? (genre un ours, un sanglier et un cerf...) à différents WP aléatoires eux aussi... (histoire de corser la partie de chasse et que chaque participant ne ramène pas forcément le même trophé...)
Code PHP:

string sRandResRef(in nNb 3)
{
nNb nNb+1;
switch 
nNb
    
{
    case 
1:return "ours";
    case 
2:return "loup";
    case 
3:return "galinette_cendree";    
//Bien sur, tu modifie le nNb par defaut et le nombre de case a loisir ^^
    
}
return 
"nw_badger";

a mettre avant ton void main(), puis utilise la nouvelle fonction que tu viens de creer a la place du resref...
Juste comme ça en passant, pourquoi tu n'utilises pas une "Rencontre" en mettant plein de spawns différents (flèches violettes, clic droit dans l'éditeur) et en ajoutant les différentes créatures que tu veux voir apparaitre ?

Parce que ce que tu cherches à faire avec ton script, Bioware l'offre tout fait avec un assistant et tout et tout
A titre de témoignage je me suis énervé un petit moment pour faire spawner des bestioles différentes en quantités différentes en des spots différents, pour un même perso déclencheur. Peine perdu ... j'avais toujours 3 blaireaux au même endroit. J'ai du m'énerver une demi heure, certes. En l'occurrence un petit script au final pas si compliqué que cela fait exactement ce que tu veux ... alors ... Mais dans l'idéal c'est sûr qu'il est préférable d'utiliser autant que possible les outils tout prêt de l'éditeur, ce que j'ai toujours essayé de faire.
Ah ? Ben en fait je n'ai jamais trouvé le moyen de localiser les spawn des rencontres. Je croyais que les bébêtes apparaissaient toujours au même endroit DANS le trigger et là je voulais qu'un seul gibier apparaissent dans un endroit aléatoire sur TOUTE la carte, donc voilà, mais effectivement si il est possible de localiser différents WP de spawn grace aux rencontre, alors c'est vrai que c'est plus simple...

*part se flageller dans un coin...*
Citation :
mais a ca à un inconvenient majeur si ta zone est surelevée par endroits (bosses / monticules / etc), que tu crée un monstre a l'altitude normale, il sera invisible
Ben après avoir testé, je me suis rendu compte que seuls les plaçables peuvent être créés à une altitude différente de celle du sol. Donc non les créatures apparaissent toujours bien sur le terrain (et sur le walkmesh normalement), à moins que je me soit trompé

A propos du sujet, ben juste un petit rajout : la fonction Random(int i) permet d'obtenir un entier aléatoire appartenant à [0;i[. (entre 0 et i-1 quoi )
En clair les fonctions dX() sont des raccourcis de cette fonction, donc à toi de voir si tu peux les utiliser, et sinon -> Random()

Et arrête donc de te flageller pour rien, l'éditeur permet de spécifier à quel endroit les monstres de la rencontre doivent apparaitre (par défaut c'est en dehors du champ de vision du PJ), mais il ne permet pas de créer une location de spawn aléatoire
Citation :
Ben après avoir testé, je me suis rendu compte que seuls les plaçables peuvent être créés à une altitude différente de celle du sol. Donc non les créatures apparaissent toujours bien sur le terrain (et sur le walkmesh normalement), à moins que je me soit trompé
Alors je te propose une experience sympa ^^

Essaye de mettre un Waypoint pile a un endroit un peu en pente (genre, avec le smooth hill, mais y'a des fois ou les terrains sont un peu en pente avec les terrains de base), et ce, du premier cop (car si tu deplace un WP, il se recalque bien sur le sol quand tu le repose).

Un peu comme pour la manip pour empiler des placeable.

Puis, fait spawner une creature sur ce WP.

Parfois (pas toujours... oO), tu va obtenir une creature invisible...

Si en plus tu en fait spawner plusieur, l'auto-replacement augmente le risque.

Ceci etant, il te suffit de recliquer sur le WP dans le toolset pour regler ce petit pb, donc ce n'est rien ^^
Pour tes waypoints :

Code PHP:

location Waypoint(int nWPNumberstring sWPTag="WP_")
{
int nWP=Random(nWPNumber+1);
string sWP=sWPTag+IntToString(nWP);
location lLoc=GetLocation(GetWaypointByTag(sWP));
return 
lLoc;

Tu mets cette fonction en debut de script et elle te spawnera tes machins a des endroits differents. Attention, le premier waypoint doit s'appeler WP_0, le 2e WP_1, etc... Ca te retourne direct la location.
Tu peux aussi lui dire d'utiliser un autre nom de waypoint, en utilisant sWPTag. Ca te permet en gros de n'avoir qu'une ligne de code a chaque fois si tu veux spawner plusieurs types de creatures, chacun a des WP particuliers.
Moi pour choisir un waypoint je ferais plutot comme ca :
Code PHP:

object oWaypoint GetFirstObjectInArea();
int nb_waypoints 0;
string sTag;

while (
GetIsObjectValid(oWaypoint))
{
    
sTag GetTag(oWaypoint);
    if (
sTag == "Random_Spawn"nb_waypoints++;
    
oWaypoint GetNextObjectInArea();
}

int WP_number Randomnb_waypoints );
object oTarget GetObjectByTag"Random_Spawn"WP_number ); 
Cela permet d'avoir un tag unique pour tout les waypoint (Random_Spawn dans cet exemple), et comme ils sont comptés on peu en mettre autant qu'on veut sans retoucher au script...
Ouép pas mal, en mettant la possibilité de déclarer le début du string dans la fonction histoire de pas avoir a la refaire pour chaque tag je pense que ca donne la meilleure solution.
D'accord avec Slay, mais malheureusement j'ai l'impression que GetNextObjectInArea() ne marche pas à la perfection.
J'ai fais un test avec plusieurs waypoints de même tag dans une zone. En essayant de les compter sur le OnModuleLoad, ben le résultat est assez chaotique Il en trouve parfois la moitié, parfois 2 fois trop, etc.

Je suis le seul dans ce cas ?
le objet se cree dans le OnModuleLoad, et chaque fois qu'un objet est crée ou detruit durant l'execution d'une boucle GetFirst/GetNext, les resultat deviennent instable, car l'ordonnancement des objet est boulveré.

Donc, vi, ca ne me surprend pas.
Le plus étonnant, c'est que j'ai les même résultats en déclenchant le comptage après un petit délai

Enfin je vais quand même essayer d'utiliser un autre évènement. Marchi eM
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés