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

Panneau de contrĂ´le

Recherche | Retour aux forums

JOL Archives

Déclarer un objet pas encore créé

Par Cassin le 14/1/2003 Ă  23:20:38 (#3023137)

Salut !

Je bosse sur un petit script d'anim, et j'ai un petit problème.

En effet dès le début du script (après avoir immobilisé le joueur) je fais apparaître un PNJ de tag "Baldurien", que je dois faire interagir par la suite avec un autre PNJ (des ActionSpeakString surtout, ainsi que des AdjustReputation).

Malheureusement je me suis aperçu qu'en déclarant l'objet au début du script (object oBal = GetObjectByTag("Baldurien"); ), aucune commande associée à oBal ne s'exécutait.
J'en ai conclut que le script devait certainement être lu en entier dès le début (le reste est une suite de DelayCommand), ce qui fait qu'au moment de la déclaration de l'objet, et ben l'objet en question n'existe pas encore !
J'ai essayé de déplacer la déclaration APRES la création du PNJ, mais ça ne change rien.

J'ai réussi à contourner le problème pour les ActionSpeakString en remplaçant le oBal par un GetObjectByTag("Baldurien"), c'est chiant et long mais ça marche, mais apparemment pour les AdjustReputation ça ne marche pas...
Ou alors j'ai foiré quelque chose...

En fait j'ai fais ça

DelayCommand (27.0, AdjustReputation (oAsh, GetObjectByTag("Baldurien"), -50));
DelayCommand (27.0, AdjustReputation (GetObjectByTag("Baldurien"), oAsh, -50));

pour que les deux PNJ (de faction différentes et neutre l'une envers l'autre) se foutent sur la gueule, mais ça ne marche pas, ils restent neutres.

Alors est-ce moi qui me suit planté dans les commandes ? (j'ai aussi essayé ActionAttack, ça ne marche pas non plus)

Et y a-t-il un moyen de déclarer l'objet une fois celui-ci créé ?

Par eMRaistlin le 14/1/2003 Ă  23:41:07 (#3023329)

euh...

Tu fais un CreateObject ?

Pasque si oui, il te suffit de faire ca :


object oNPC = CreateObject(blahblahblah);


pour pouvoir ensuite faire des AssignCommand sur oNPC, même s'il n'est pas encore crée...

Par contre, tu devrait mettre des -100 au lieu de -50 sur les adjust reputation, vu que je crois que les faction standart sont gérées a 80 de base (non sur.... je sais que les 2da disent le contraire, mais je crois avoir lu ca qqpart... toute facon, -50 ou -100, ca pose pas de pb même si tu tombe en dessous de 0)

Je confirme toutefois que le GetObjectByTag dans le meme script que le Create a peu de chance de fonctionner... (par contre, les DelayCommand devraient suffire, vu que ils sont recalculés lors de leur resolution... d'ou ma suggestion du dessus...)

PS : SetIsTemporaryEnnemy marche bien aussi :)

Par Cassin le 15/1/2003 Ă  9:03:39 (#3024938)

OK, merci :merci: je teste dès que je peux !


Pour la réput par contre les factions sont à 50 l'une envers l'autre, donc même -50 devrait marcher, mais j'ai testé également avec -100, ça change rien non plus...

'testerait aussi SetIsTemporaryEnnemy ;)


:merci:

Par Skanzo Sylan le 15/1/2003 Ă  14:51:30 (#3027740)

Juste en passant, histoire de dire ma connerie mensuel :p

Pourquoi ne pas mettre le baldurien dans une zone d'attente, une area bidon? Comme ça, l'objet est bien réelle, la déclaration est vrai dès le début du script et poupouf un JumpToObject suffira à mettre nos deux compères l'un en face de l'autre...

J'ai dit une bétise? :bouffon:

Par Cassin le 15/1/2003 Ă  15:15:55 (#3027965)

Oui c'est vrai, ça pourrait marcher...

Enfin, tant qu'il n'y a pas plusieurs occurances du mĂŞme perso ;)


Je préfère éviter les bidouilles, mais j'y penserais la prochaine fois... :merci:

Par Cassin le 15/1/2003 Ă  23:02:30 (#3031432)

Bon, j'ai divers petits problèmes...

Voilà le script, les questions après ;)

object oPC = GetFirstPC();
object oAsh = GetObjectByTag("Ashareth");

location lSPBal = GetLocation(GetObjectByTag("SPW_Bal"));

vector vBal = GetPositionFromLocation(lSPBal);

void CreateBal()
{
object oBal = CreateObject(OBJECT_TYPE_CREATURE, "baldurien", lSPBal, TRUE);
}

void main()
{

// Deplacement, orientation et immobilisation du joueur
DelayCommand (0.5, AssignCommand (oPC, ActionForceMoveToObject (GetObjectByTag("WP_AnimPortes"), TRUE)));
DelayCommand (5.0, AssignCommand (oPC, SetFacing (DIRECTION_NORTH)));
DelayCommand (5.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectCutsceneDominated(), oPC));

// Apparition de Baldurien
DelayCommand (6.0, AssignCommand (oAsh, ActionSpeakString("Ca y est enfin ! Les Portes sont ouvertes !")));
DelayCommand (10.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3), lSPBal));
DelayCommand (10.0, CreateBal());

// Dialogue
DelayCommand (11.0, AssignCommand (oAsh, SetFacingPoint(vBal)));
DelayCommand (11.0, AssignCommand (oPC, SetFacingPoint(vBal)));
DelayCommand (16.0, AssignCommand (oBal, ActionSpeakString("xxxxxxx (censuré, voir plus bas) ")));
DelayCommand (20.0, AssignCommand (oAsh, ActionSpeakString("xxxxxxxx")));
DelayCommand (25.0, AssignCommand (oBal, ActionSpeakString("xxxxxxxxxxxx")));

// Baston
DelayCommand (27.0, SetIsTemporaryEnemy (oBal, oAsh, TRUE, 10.0));
DelayCommand (40.0, AssignCommand (oAsh, ClearAllActions(TRUE)));
DelayCommand (40.0, AssignCommand (oBal, (ClearAllActions(TRUE))));

// Là je censure un bout du script -qui marche- car c'est crucial pour le scénario et je ne voudrais pas qu'un membre de la Biblio de NwN tombe malencontreusement dessus... :D

// Liberation du joueur
DelayCommand (45.0, RemoveEffect(oPC, EffectCutsceneDominated()));
}


Donc...

Pour faire apparaître Baldurien j'ai du faire un autre void, car comme je l'ai appris à mes dépend, CreateObject ne fonctionne pas dans un DelayCommand :(

J'ai fais plusieurs essais :
- juste CreateObject dans le void CreateBal() :
Là l'objet est créé mais je dois utiliser GetObjectByTag à chaque ligne devant se référer à l'objet

- object oBal = CreateObject blablabla, comme emRaistlin me l'ai indiqué (toujours dans le void CreateBal() ), et les références à oBal ailleurs dans le script.
Là le script ne se compile pas (oBal étant déclaré dans un autre void je pense), mais les commandes faisant référence à oBal marchent (par contre le EffectCutSceneDominated le fonctionne plus lui) (et de plus Baldurien est créé au tout début du script, pas après le temps définit dans le DelayCommand :doute: )


Donc, comment puis-je faire pour déclarer cet objet correctement ?
(et au passage si quelqu'un sait comment enlever le CutSceneDominated à la fin du script, ça m'arrangerait, le RemoveEffect ne fonctionne pas :D)

JOL Archives 1.0.1
@ JOL / JeuxOnLine