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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Enchainement de taches pour 1 mage PNJ

Par daemogorgon le 12/12/2002 à 21:13:22 (#2773001)

QQ1 peux m'aider ?

Je veux qu'1 PNJ (mage), si il est agressé, envoye 1 sort d'arret du temps, qu'il bloque les PJ completement, qu'il lance une phrase après, et qu'il disparaisse définitivement ? Attention il fait parti de l'intrigue, il faut donc que j'ai 1 variable générale (et j'avoue que je n'ai pas encore tout saisi la dessus) pour le mage.
Et cela qu'il y ai 1 ou plusieurs PJ.
Il faut que les PJ ne puissent rien faire qqsoit leur niveau le temps que le mage fasse son cirque, et qu'ils soient libres après.

Par daemogorgon le 13/12/2002 à 7:37:02 (#2775084)

toujours personne pour m'aider ?

Par eMRaistlin le 13/12/2002 à 12:00:10 (#2776268)

euh... le mieux, c'est lui faire lancer arret du temps sans le temps de casting : immediatement.

(tu met le dernier element de ActionCastSpell a TRUE)

Par coolstar le 13/12/2002 à 16:22:18 (#2778332)

Just un truc pour une "piste"! ;)


/* A mettre pour lors dans les 'Actions conséquentes' d'un Dial.
Mais ce Script devrait pouvoir à la longue être utilisé pour lorsque le NPC est Agressé
(à mettre alors dans le OnPhysicalAttacked & dans le OnSpellCastAt)... */

void main()
{
object oNPC = OBJECT_SELF;
object oPC = GetPCSpeaker(); // GetLastAttacker();
object oTarget = GetWaypointByTag("disparition_theatrale");
string sVarName = "rencontre_mechant";
int nValue = 1; // Assignation de la Valeur à la Variable définie.
int nDurationType = DURATION_TYPE_INSTANT; // Temporiser les Effets pour contourner le "CLearAllActions" de la fin de conversation.
effect eTimeStop = EffectTimeStop(); // Application du sort d'Arret du Temps.
effect eVisualTimeStop = EffectVisualEffect(VFX_FNF_TIME_STOP);
effect eVisualDisparition = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN);
effect eVisualFog = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL);
effect eVisualDesenvoutement = EffectVisualEffect(VFX_IMP_DISPEL);

// Pcs et NPC doivent cesser toutes actions en cours
AssignCommand(oPC, ClearAllActions());
AssignCommand(oNPC, ClearAllActions());
// Une variable doit etre stokee pour la renconter avec le NPC principal
SetLocalInt(oNPC, sVarName, nValue);// Initialisation de la Variable sur le Cible désirée.
// Le NPC ne doit plus etre en danger (invulnerable)
// SetPlotFlag(oNPC, TRUE); /*Ca devrait rendre ton objet (donc le NPC) invulnerable.
Tu peut donc lui appliquer ce que tu veux (sauf Destroybject) sans rien craindre*/
// DelayCommand(18.0,SetPlotFlag(oNPC, FALSE));/*Ca remet le NPC vulnerable*/
// Envoie un sort d'arret du temps
// DelayCommand(0.1, ActionDoCommand(ApplyEffectToObject(nDurationType, eTimeStop, oPC)));
// Effet visuel de l'incantation (EFFECT_TYPE_TIMESTOP ?)
AssignCommand(oNPC, ActionCastFakeSpellAtObject(SPELL_TIME_STOP, oNPC)); // Animation du pretre lancant le sort.
// Effet visuel du sort Time Stop sur les PCs.
DelayCommand(0.1, ActionDoCommand(ApplyEffectToObject(nDurationType, eVisualTimeStop, oPC)));
// Les PCs doivent tous etre paralyes, quelque soit leur niveau
DelayCommand(3.0, SetCommandable(FALSE, oPC)); // AssignCommand(oPC,Action...);
// Le NPC fait son blabla
DelayCommand(3.0, SpeakString("Au revoir !")); // Ou ActionWait ?
DelayCommand(6.0, SpeakString("Cretin !")); // Ou ActionWait ?
// Effet visuel de l'incantation pour la teleportation
DelayCommand (9.0, ActionCastFakeSpellAtObject(SPELL_DISPEL_MAGIC, oNPC)); // Animation du pretre lancant le sort.
// Effet visuel de la disparition pour la teleportation
DelayCommand(9.0, ActionDoCommand(ApplyEffectToObject(nDurationType, eVisualDisparition, oNPC)));
// Disparition dans un nuage glauque
DelayCommand(11.0, ActionDoCommand(ApplyEffectToObject(nDurationType, eVisualFog, oNPC)));
// Rictus terrifiant lache dans le neant
DelayCommand (11.0, PlaySound("c_demon_dead"));
// Le NPC se teleporte a la fin (ou disparait)
DelayCommand(12.5, AssignCommand(oNPC, JumpToObject(oTarget))); // vers une autre Area
// Effet visuel du desenvoutement
DelayCommand(15.0, ActionDoCommand(ApplyEffectToObject(nDurationType, eVisualDesenvoutement, oPC)));
// Les PCs seront ensuite liberes
DelayCommand(15.0, SetCommandable(TRUE,oPC));
}



Le Hic c que ça marche impeccable seulement dans un Dial... Dans le OnPhysicalAttacked (avec GetLastAttacker!) ça ne donne pas l'effet voulu... Sigh! Le NPC n'en démord pas malgré les ClearAllActions!) et veut à tout pris attaquer, décalant du coup tous les effets (voir, en saute même!)... Reviendrais voir ça d'ici ce soir, chuis à la bourre!!! :D

...



EDIT
---------------------
Prise en compte de la Remarque de eMR! :D
---------------------

Par Jedaï le 13/12/2002 à 16:40:50 (#2778488)

Suffit d'utiliser le nouveau paramètre de ClearAllActions(), il est apparu avec la 1.27 et est censé permettre d'éliminer les pulsions agressives de nos chers NPCs, mais je dois avouer que je ne l'ai pas encore essayé.:confus:

Par daemogorgon le 13/12/2002 à 19:23:40 (#2779787)

Ca marche pas.
Meme avec la 1.27, le ClearAllActions(TRUE) n'empeche pas que les perso continuent a ce battre (dans mon cas ).
L'arret du temps ne se fait pas.
Et mon perso de test arrive a descendre le mage.

Je comprend pas.

Par coolstar le 13/12/2002 à 19:51:03 (#2780025)

Heeuuu... daemogorgon, t'es gentil, tu veux pas faire un effort! Tout ce que tu rapportes là c'était déjà couru, vu que je l'avais signifier là!! :doute:

Provient du message de coolstar
Just un truc pour une "piste"! ;)

Le Hic c que ça marche impeccable seulement dans un Dial... Dans le OnPhysicalAttacked (avec GetLastAttacker!) ça ne donne pas l'effet voulu... Sigh! Le NPC n'en démord pas malgré les ClearAllActions!) et veut à tout pris attaquer, décalant du coup tous les effets (voir, en saute même!)... Reviendrais voir ça d'ici ce soir, chuis à la bourre!!! :D

...



C'est un premier travail... ce qui veut dire qu'il faut encore travailler dessus... et tu peux toi aussi sûrement le faire si tu t'y mets un peu! Donc Acte!! :enerve:


;)

Par daemogorgon le 13/12/2002 à 19:59:50 (#2780115)

eh, Coolstar, si je pose la question, c'est que je suis une quiche en script, et que c'est en voyant faire les autres qui sont meilleurs que nous que nous verront encore mieux pour pouvoir avancer...:aide:
Quand j'aurais compris comment faut faire, je redemanderais plus ce genre de truc.

Je suis un peu meilleur en 3D, et j'ai fait pour Templier un hak d'une licorne en 1 journée, c'est vrai que j'aurais pu uniquement m'enfermer sur mon mod et laisser ce pauvre Templier sans sa licorne...

Voilà, je pense que c'est le but d'un forum de faire avancer tout le monde avec les connaissances de tous.

Par eMRaistlin le 13/12/2002 à 20:05:19 (#2780161)

je suppose que personne n'oublie de decommenter le GetLastAttacker dans le OnPhyAtk ??:mdr:

Pourquoi vous faites des CastFakeSpell, au lieu de faire un ActionCastSpell, avec le bCheat sur TRUE et le InstantCast sur TRUE ??

C'est mieux que l'effet visuel, non ??


PS : Attention, coolstar, y'a une inconsistance entre oNPC et oPC dans tes commentaire, des fois, tu melange... (par exemple sur le SetCommandable sous commentaire...)

Par coolstar le 13/12/2002 à 21:22:25 (#2780744)

:mdr:

Par coolstar le 14/12/2002 à 1:37:11 (#2782775)

Provient du message de daemogorgon
eh, Coolstar, si je pose la question, c'est que je suis une quiche en script, et que c'est en voyant faire les autres qui sont meilleurs que nous que nous verront encore mieux pour pouvoir avancer...:aide:
Quand j'aurais compris comment faut faire, je redemanderais plus ce genre de truc.

Je suis un peu meilleur en 3D, et j'ai fait pour Templier un hak d'une licorne en 1 journée, c'est vrai que j'aurais pu uniquement m'enfermer sur mon mod et laisser ce pauvre Templier sans sa licorne...

Voilà, je pense que c'est le but d'un forum de faire avancer tout le monde avec les connaissances de tous.


Bon k! J'avais pas fait le lien avec ta généreuse contribution sur la Licorne... c vrai qu'à chacun son investissement communautaire! Merci d'ailleurs!! C juste que je pensais avoir été clair en disant que ce n'était rien qu'un peu d'essai, avec toutes ses limites, histoire de donner un début d'approche! Sorry Mister! ;)

:D





EDIT
------------------
C bon, j'ai trouvé où ça cloche pour les NPCs agressifs récalcitrants... je fais les derniers réglages et je te transmets ça! Juste que je sais pas encore comment appliquer les effets visant les PCs sur tous les PCs agressant le NPC justement... Alors faudra se contenter d'un résultat sur 1 seul PC pour lors... :lit:

Au fait sinon, ton NPC, tu le veux invulnérable ou pas? parce que dans le cas contraire, les paramètres sont beaucoup plus compliquer à gérer... mais c toi qui vois hein! :maboule:
-------------------

Par RAT le 14/12/2002 à 4:24:30 (#2783456)

perso, je n'ai pas encore essayer le nouveau paramètre de ClearAllAction() mais je ne pense pas que cela changera des masses non plus. Mais je peux me tromper :p:p.

Et pour éviter que les NPC attaquent, je vais peut être dire une stupidité lol, mais vu l'heure, je n'ai pas vu tous les codes proposés. Pourquoi tu ne lui ferais pas changer son Alignement temporairement???? mais je pense pas que cela marche, mais si par contre tu lui mets cette fonction la "SetIsTemporaryFriend" :

void SetIsTemporaryFriend(object oTarget, object oSource=OBJECT_SELF, int bDecays=FALSE, float fDurationInSeconds=180.0f)


Je pense qu'ils arrêteront de se battre.

Enfin bon voila :)

A demain tout le monde :)

Par coolstar le 14/12/2002 à 6:57:30 (#2783658)

Bon, j'y suis presque! Testé et Approuvé! un gros délire ok... mais je trouvais ça marrant à faire! juste que je sais pas encore faire sur plusieurs PCs... mais ça le fait déjà non? en tout cas, le mieux encore est de tester avant pour avoir la surprise du résultat!! L'unique chose à paramétrer c le WayPoint... et n'hésite pas s'il y a des Bugs! ;)

:D



void main() /* S'il le NPC principal est agresse Script a mettre dans le OnPhysicalAttacked & dans le OnSpellCastAt. */
{
// Declaration des variables (attention a bien parametrer le WayPoint.
object oNPC = OBJECT_SELF;
object oPC = GetLastAttacker();
object oTarget = GetWaypointByTag("disparition_theatrale");
string sVarName = "rencontre_mechant";
int nValue0 = FALSE;
int nValue1 = TRUE;
int nDurationType = DURATION_TYPE_INSTANT;
effect eVisualTimeStop = EffectVisualEffect(VFX_FNF_TIME_STOP);
effect eVisualDisparition = EffectVisualEffect(VFX_FNF_METEOR_SWARM);
effect eVisualDesenvoutement = EffectVisualEffect(VFX_IMP_DISPEL);

// PCs et NPC doivent cesser toutes actions de Conflit en cours (Reddition).
SurrenderToEnemies();
// Les PCs doivent tous etre paralyes et asservis, quelque soit leur niveau
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP,0.0,38.0));
DelayCommand(0.0, SetCommandable(nValue0, oPC));
if (GetLocalInt(oNPC, sVarName) != nValue1)
{
// Effet visuel de l'incantation (EFFECT_TYPE_TIMESTOP ?)
AssignCommand(oNPC, ActionCastFakeSpellAtObject(SPELL_TIME_STOP, oNPC));
// Effet visuel du sort Time Stop sur les PCs.
ActionDoCommand(ApplyEffectToObject(nDurationType, eVisualTimeStop, oPC));

// Debut du monologue et mise en scène du Grand Mechant NPC ou celui-ci fait son blabla tout en deambulant
SpeakString("A genoux chiens !");
DelayCommand(1.0, ActionRandomWalk());
DelayCommand(4.0, SpeakString("Pourceaux imbeciles !"));
DelayCommand(7.0, SpeakString("Regardez ce que vous m'obligez a faire !"));
DelayCommand(11.0, SpeakString("Je vous meprise !"));
DelayCommand(11.1, SetFacingPoint(GetPosition(oPC)));
DelayCommand(12.5, ActionRandomWalk());
DelayCommand(14.0, SpeakString("D'un simple claquement de doigt je peux vous arreter."));
DelayCommand(19.0, SpeakString("Il suffit que ce soit ma volonte et je peux vous asservir !"));
DelayCommand(21.0, SetFacingPoint(GetPosition(oPC)));
DelayCommand(24.0, SpeakString("Voyez comme le temps a peu d'importance pour moi."));
DelayCommand(28.0, ActionForceMoveToObject(oPC, nValue0, 0.5, 5.0));
DelayCommand(29.0, SpeakString("Voyez comment j'ai fige un instant votre realite pour vous garder desesperement serviles !"));
DelayCommand(35.0, SpeakString("Vous n'etes pas dignes, vermines !"));
DelayCommand(42.0, SpeakString("Vous m'obligez a vous punir !"));
DelayCommand(42.1, ActionMoveAwayFromObject(oPC, nValue0, 5.0));
DelayCommand(44.0, ActionRandomWalk());
DelayCommand(46.0, SpeakString("Vous croyez vraiment que c'est ce que je veux ?"));
DelayCommand(50.0, SetFacingPoint(GetPosition(oPC)));
DelayCommand(50.0, SpeakString("Vous croyez vraiment que c'est ce que j'attends de vous ?"));
DelayCommand(55.0, SpeakString("Non bien sur ! Vous ne pouvez ignorer ma toute grande magnificiance !"));
DelayCommand(61.0, SpeakString("J'ai de grands projets !"));
DelayCommand(63.0, ActionRandomWalk());
DelayCommand(64.0, SpeakString("Oui, sachez-le ! De grands projets meme !"));
DelayCommand(68.0, SpeakString("Ne suis-je pas le plus grand des mages, l'egal meme des Dieux ?"));
DelayCommand(73.0, SpeakString("C'est pourquoi j'ai decide que le sort en serait autrement aujourd'hui..."));
DelayCommand(82.0, SpeakString("Decidement, je suis vraiment trop parfait !"));
DelayCommand(86.4, SetFacingPoint(GetPosition(oPC)));
DelayCommand(87.0, SpeakString("Sombre cretin que vous êtes !"));
DelayCommand(88.0, ActionForceMoveToObject(oPC, nValue0, 1.5, 8.0));

DelayCommand(89.0, ClearAllActions());
// Effet visuel de l'incantation pour la teleportation
DelayCommand (89.0, ActionCastFakeSpellAtObject(SPELL_DISPEL_MAGIC, oNPC));
// Effet visuel de la disparition pour la teleportation
DelayCommand(89.0, ActionDoCommand(ApplyEffectToObject(nDurationType, eVisualDisparition, oNPC)));
// Le NPC se teleporte pour disparaitre vers une lointaine destination.
DelayCommand(92.25, AssignCommand(oNPC, JumpToObject(oTarget))); // vers une autre Area
// Rictus terrifiant lache dans le neant
DelayCommand (92.25, PlaySound("c_demon_dead"));

// Effet visuel du desenvoutement
DelayCommand(97.0, ActionDoCommand(ApplyEffectToObject(nDurationType, eVisualDesenvoutement, oPC)));
// Les PCs seront ensuite liberes
DelayCommand(100.0, SetCommandable(nValue1, oPC));

// Une variable doit etre stokee pour la confrontation avec le NPC principal
SetLocalInt(oNPC, sVarName, nValue1);// Initialisation de la Variable sur le Cible désirée.
}
}

Par Jedaï le 14/12/2002 à 14:22:03 (#2785653)

Pour récupérer tous les PCs, tu peux utiliser une structure comme celle-ci :


int nNo = 1;
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
//Mettre ici la distance max à laquelle récupérer les PCs
float fDist = 15.0;

while(GetIsObjectValid(oPC) && DistanceToObject(oPC) < fDist )
{

//Ici, on assigne les ordres aux PCs

nNo++;
oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, nNo);
}


Faut vérifier la syntaxe des fonctions, j'ai fait ça de mémoire :D

Par daemogorgon le 14/12/2002 à 14:26:57 (#2785686)

je vous remercie tous, je sais pas encore si ca marche, car je fini autre chose en meme temps.
Des que je peux tester tout ca, je vous tiens au courant.

A+

JOL Archives 1.0.1
@ JOL / JeuxOnLine