Récuperer une variable d'un autre objet ?

Répondre
Partager Rechercher
Est-il possible de se servir d'une variable créée dans le script d'un PNJ dans un script de zone ou inversement ?

Je m'explique:

J'ai créé une variable "Var1" dans le OnEnter d'une zone :

(int Var1=2);

Dans cette même zone, j'ai mis une condition dans le script d'un PNJ à partir de cette variable :

if ("Var1"==2) {fait ci, fait ça}; ...

Evidemment ça marche pas

Les variables ne sont-elles valables qu'à l'intérieur des scripts où elles sont créées ?
Tout a fait : un variable est declarée pour un script, et n'existe que le temp de son execution.

Si tu veux utiliser une variable d'un script a l'autre (ou sur une periode de temps plus important qu'une micro-seconde ^^), alors tu utilise SetLocalInt / SetLocalLocation / SetLocalObject / SetLocalFloat, et tu recupere ces variable avec GetLocal***

Tout simple non ?
Merci beaucoup


edit:

voilà j'ai mis ça dans le OnEnter de la zone==>

SetLocalInt (OBJECT_SELF,"Var1",1);


Et ça dans le Onspawn du PNJ===>

SetLocalInt Var2=(GetLocalInt("Var1"));

(et après: if var2==1 ... etc etc )

le deuxième veut pas se compiler, je comprend pas pourquoi...
C'est un peu plus compliqué que cela (pas beaucoup, mais quand meme )

Tu devrai vraiment faire les tutoriaux : la demi-journée que tu perdrai a les lire, et la journée suivante que tu perdrais a les comprendre sont TRES TRES vite rentabilisées, en général

Ceci etant, il te faut declarer les objet, avant de les utiliser.

Quand tu ecrit OBJECT_SELF, il faut savoir qu'en fait, le moteur comprend "Rammene moi l'objet qui a lancé le script"

C'est un peu comme si OBJECT_SELF etait une fonction
Code PHP:

object OBJECT_SELF(){GetObjectRunnningScritp();} 

en gros... (bien entendu, ce n'est qu'une hyperbole...)

donc, en fait, ton script ci-dessus fonctionne pour le set, car tu affecte la local Int sur un Objet

Code PHP:

SetLocalInt(OBJECT_SELF,"var",1) == SetLocalInt(GetArea(GetEnteringObject()),"var",1
car tu utilise un on enter. OBJECT_SELF est un raccourci, si tu veux.

HELAS, TU NE PEUX PAS TOUT RACCOURCIR COMME CA

Tu ne peux pas utiliser un tag a la place d'un objet, plus particulierement.

Donc, dans ton Get, tu dois recuperer l'area sur laquelle tu a stockée la variable.

Pour cela, soit tu recupere l'objet qui a declanché le script2 (en l'occurence, le PNJ) soit tu essaye de retrouver cette variable en essayant de retrouver l'area ou se trouve le PC qui parle (c'est tordu, mais ca fonctionneri aussi, normalement...)

Donc, en l'occurence,

Code PHP:

GetLocalInt(GetArea(OBJECT_SELF),"var"); 

Car object_self designe ici le PNJ, vu que c'est lui qui lance le script 2

Ok ?

PS : je t'assure, les tuto sont vraiment bien fait
Lol, j'ai rien compris, mais c'est pas grave^^

(je ne suis pas informaticien moi )

Sinon, il y a un tutorial sur les variables ? Parce que ceux de bioware, je veux bien mais pfiu je rame et je suis pas sûr d'avoir mes réponses

Merci à toi en tout cas

Edit: je m'accroche et je commence à comprendre ^^
Ceux de bioware, je sait pas, mais ceux de Celowind (qui sont dans le persistant de Lumina) oui : je dirait meme plus : ils commencent par ca (c'est un peu la base, en fait ^^)


Sinon, pour lexplication, je suis desole, mais je n'ai pas le temps de clarifier plus : je suis au boulot :/
Bon après avoir potasser les tut, j'ai tenté de faire mon truc.

But de l'opération: faire qu'un PNJ se déplace et suive ses waypoints dès qu'un PJ entre dans la zone (et surtout pas avant).

L'idée c'est:
- Quand on entre dans la zone, la variable "Entre" devient égale à 1.
- Dans le OnSpawn du PNJ, le script vérifie la valeur de "Entre" et si elle est égale à 1, alors hop le PNJ commence à déambuler.



J'ai donc mis ceci dans Onenter de la zone :

void main()
{

SetLocalInt (OBJECT_SELF,"Entre",1);


}



Dans le onspawn du PNJ:

void main()
{



//récupère la variable de la zone

int test2=GetLocalInt(GetArea(OBJECT_SELF), "Entre");

/marche si un PNJ entre dans la zone:
if (test2==1)WalkWayPoints();



// ça on s'en fiche
GenerateNPCTreasure();
SetListeningPatterns();

}


Si ça marchait, ce serait trop beau... Je vais vraiment plus quoi faire pour arriver à ce que je veux



(Tant que j'y suis, comment faire en sorte qu'un PNJ suivent ses waypoints puis s'arrête et se poste au dernier sans recommencer eternellement sa ronde ? )

Merci d'avance
bein, a priori, pas de raiso que ca marche pas ^^

(PS : si ca marche opas, verifie les tags de tes WP et de PNJ, et si c'est OK, alors essaye de nous decrire tres precisement la ou le bas blesse.)

PS : pour qu'il s'arrete, met le dernier en POST_*** ca devrait marcher.
Ah oui, bien entendu : le PNJ declare le OnEnter de la Zone ^^

Met ca, dans le OnEnter

Code PHP:

void main()
{

if (
GetIsPC(GetEnteringObject()))
    {
    (
SetLocalInt (OBJECT_SELF,"Entre",1);
    }

Ca, ca prouve que le script est bon. Mais il est mal pensé
(oops, echec critique en Diplo ^^

En fait, ton PnJ se crée, et declenche son OnSpawn. Il verifie que la variable est à 1. Elle est a 0, il ne fait donc rien. (=> Resultat Ok)
Puis, ton Pj entre dans la zone, declenche le OnEnter, et met la variable a 1. (=> Ok)

Et puis plus rien (le OnSpawn ne s'executant que sur le spawn du PnJ ^^)

Donc, plusieurs solutions:

- Soit tu verifie la variable a intervalles fixes (via un OneartBeat, par exemple. => Bof Bof, et peu fiable. (et accesoirement, consomme du temps machine pour rien)

- Soit tu verifie la variable non pas sur le OnSpawn, mais sur le OnPerception (en modifiant un peu le script), et ton PnJ verifie la variable lorsqu'il voit (ou entends, suivant ce que tu veux) le PJ. => C'est deja mieux.

- Soit, sur ton OnEnter, tu assigne au PnJ l'action de parcourir les WayPoint. => Ca, c'est ce que je ferait, plutot ^^

Voila, desolé de ne pas t'avoir prevenu avant, mais si on y a perdu un peu de temps, je pense que ca te permet de mieux cerner les differences entres les scripts, les evenement, et ce que tu veux que ca fasse ^^
PS : Essaye de faire de toi même une des 2 solutions grace a ce que tu a vu dans les tuto, et poste les, que l'on puisse t'aider a corriger
Pour la première solution, pas de problème (merci le tuto d'amaranthe^^)

Rien besoin de mettre dans onEnter, supprimer WalkWayPoints du onspawn du PNJ, et ajouter ça dans le OnPerception du PNJ:

void main()

{

object oVu=GetLastPerceived();

if (GetIsPC(oVu))
WalkWayPoints();

}


et ça marche^^




(par contre je sèche sur le second problème, pour la simple raison que walkwaypoints n'est pas une commande possible dans les scripts de zone...)
C'est a dire ? Arreter le PNJ a la fin ?

Tu cree un trigger sous le WP de fin, et dedans, tu fais un script qui verifie si l'objet qui entre est le PnJ, et si oui, tu fais un ClearAllActions
Citation :
Provient du message de eMRaistlin

- Soit, sur ton OnEnter, tu assigne au PnJ l'action de parcourir les WayPoint. => Ca, c'est ce que je ferait, plutot ^^


Je voulais dire que pour faire marcher le pnj à partir de OnEnter, c'est pas évident (pas d'usage possible de walwaypoint il me semble, dans les scripts de zone)..




PS: (nickel l'idée du trigger )
En fait, si tu fait un

Code:
if (GetIsPC(GetEnteringObejct()))
    {
    WalkWayPoint();
    }
c'est sur que ca marchera pas, car en francais, ca donne : si l'objet qui rentre dans toi (la zone) est un PC, alors parcours les Waypoints...

Or, une zone ne peut pas se deplacer. Il faut donc assigner la commande au NPC de faire WalkWaypoint :

Code PHP:

if (GetIsPC(GetEnteringObejct()))
    {
    
AssignCommand(oNPC,WalkWayPoint());
    } 
Le pb : reste a trouver le NPC. A toi de rejouter le GetObjectByTag ^^
Répondre

Connectés sur ce fil

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