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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Supprimer un effet

Par Cassin le 28/11/2002 à 20:00:06 (#2666826)

J'aimerais modifier mon script de moine polymorphe dans mon module, et si j'arrive bien à le transformer en ce que je veux, avec

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectPolymorph(POLYMORPH_TYPE_XXXXX),OBJECT_SELF)

le problème c'est pour le faire revenir à sa forme humaine !

J'ai essayé pas mal de trucs, le
RemoveEffect(OBJECT_SELF,EffectPolymorph(POLYMORPH_TYPE_XXXXX)) (ou approchant, je sais plus la syntaxe exacte), le RemoveEffects (avec le include qui va avec), le ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectPolymorph(SPELL_POLYMORPH_SELF),OBJECT_SELF), etc... mais rien ne marche ! Mon moine reste un dragon tout le temps !

Je me suis aussi peut-être emmêlé avec les ActionWait ou DelayCommand, mais ça fait une heure que j'y suis à tout tourner dans tous les sens et je ne vois pas comment faire...

Une bonne âme pour me conseiller ?

Par Jedaï le 28/11/2002 à 20:19:57 (#2667011)

Bah tiens... :confus: c'est bizarre que RemoveEffects() ne marche pas. Tu dis que tu as peut-être d'autres problèmes ? Dans ce cas met donc le script sur ce post, un ClearAllActions() mal placé peut poser problème.

Syntaxe classique pour ce problème :


void main()
{
object oNPC = GetObjectByTag("Tag_du_Npc");
effect ePoly = GetFirstEffect(oNPC);

if (GetIsObjectValid(oNPC))
{
while (GetIsEffectValid(ePoly))
{
if (GetEffectType(ePoly) == EFFECT_TYPE_POLYMORPH)
RemoveEffect(oNPC, ePoly);
ePoly = GetNextEffect(oNPC);
}
}
}

Par shadoh le 28/11/2002 à 20:21:23 (#2667023)

ce que je pourrais te conseiller c'est de rattacher l'EffectPolymorph() à un item et de mettre la durée de l'effet sur 6 secondes. Dans le script tu mets une condition qui vérifie que le joueur à l'objet dans son inventaire. Et si il ne l'a pas, l'EffectPolymorph() n'est pas reconduit. Tu mets ce script sur le onHeartbeat du module qui lancera ton script toute les 6 secondes. En pratique, cela devrait avoir pour conséquence : le joueur à l'objet et donc l'EffectPolymorph() est appliqué pendant 6 secondes (c'est à dire jusqu'à la prochaine vérification du script). Si lors de la vérification le joueur a encore l'objet l'effet est encore reconduit 6 secondes. Si il ne l' a pas l'effet n'est pas reconduit donc le joueur devrait reprendre sa forme de base.

Par Cassin le 28/11/2002 à 20:56:14 (#2667283)

Voilà le script que j'ai sur le OnSpawn du PNJ :

#include "nw_i0_plot"

void main()
{
ClearAllActions();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectPolymorph(POLYMORPH_TYPE_RED_DRAGON),OBJECT_SELF);
ActionSpeakString("Voyons combien de temps je peux tenir cette forme...");
ActionWait(10.0);
RemoveEffects(OBJECT_SELF);
ActionSpeakString("Essayons de faire mieux...");

DelayCommand(20.0,ExecuteScript("moine_polymorph",OBJECT_SELF));
}


Lorsque j'apparais dans le module (le point de départ est juste en face du PNJ, pour tester), le moine est déjà transformé en dragon.
Les effets et les phrases s'affichent bien, mais il reste sous sa forme de dragon... :(

Où est l'erreur ?

Par eMRaistlin le 28/11/2002 à 21:24:59 (#2667506)

Euh, je suis pas sur, mais il est possible que le RemoveEffect merite un delay command... ce serait a bosser

Par Jedaï le 28/11/2002 à 21:36:17 (#2667608)

Je ne pense pas que le RemoveEffects() soit traité comme une action, il n'est donc pas affecté par ActionWait(). Logiquement, ton NPC ne devrait donc rester sous la forme d'un dragon qu'un milliardième de seconde !:o
Or au contraire il le reste tout le temps ! Pourquoi ? Parce que Bioware a affecté un nom trompeur à sa fonction : RemoveEffects() ne retire pas tous les effets mais uniquement les effets néfastes... Or polymorph n'est pas considéré comme néfaste (ce qui n'est guère étonnant :D ).

Pour corriger ces deux problèmes, je te propose ce script :


void AntiPolymorph(object oCreature)
{
effect ePoly = GetFirstEffect(oCreature);

if (GetIsObjectValid(oCreature))
{
while (GetIsEffectValid(ePoly))
{
if (GetEffectType(ePoly) == EFFECT_TYPE_POLYMORPH)
RemoveEffect(oCreature, ePoly);
ePoly = GetNextEffect(oCreature);
}
}
}

void main()
{
ClearAllActions();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectPolymorph(POLYMORPH_TYPE_RED_DRAGON),OBJECT_SELF);
ActionSpeakString("Voyons combien de temps je peux tenir cette forme...");
ActionWait(10.0);
DelayCommand(10.0, AntiPolymorph(OBJECT_SELF));
ActionSpeakString("Essayons de faire mieux...");

DelayCommand(20.0,ExecuteScript("moine_polymorph",OBJECT_SELF));
}


Voilà, ça devrait mieux marcher:cool:

Par Cassin le 28/11/2002 à 22:04:55 (#2667793)

Mmmmm, nan, ça fait toujours la même chose : le moine apparaît en dragon et y reste tout le temps...

Je ne vois pas ce qui se passe là... "POLYMORPH_TYPE_RED_DRAGON" est bien un effet polymorphique ! Donc ça devrait marcher...

Par coolstar le 28/11/2002 à 22:25:53 (#2667952)

Hi!


J'ai fait le test avec CA...

//::///////////////////////////////////////////////
//:: Moine Polymorphe : On Perception
//:: moine_polymorph.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Ce script a pour but de transformer un Moine
en Dragon à l'issu d'un événement (déclenché
selon le choix du scénariste). L'effet n'est
sensé durer que quelques secondes, pour être
relancé indéfiniment par le NPC qui ponctue
la scène de ses commentaires.
*/
//:://////////////////////////////////////////////
//:: Created By: Cassin & coolstar(pour la participation)
//:: Created On: Nov 29, 2002
//:://////////////////////////////////////////////
#include "nw_i0_plot"

void main()
{
ClearAllActions();

// Variables nécessaires à l'Effect.
int nDurationType = DURATION_TYPE_INSTANT;
int nPolymorphSelection = POLYMORPH_TYPE_RED_DRAGON;
effect eEffect = EffectPolymorph(nPolymorphSelection);
object oTarget = OBJECT_SELF;

// Transformation effectuée par l'intermédiaire des Variables.
ApplyEffectToObject(nDurationType, eEffect, oTarget);
// Delay de 3.0 sec sur le Speak qui suit,
// pour laisser le temps à la Transformation de s'effectuer.
DelayCommand (3.0, ActionSpeakString("Voyons combien de temps je peux tenir cette forme..."));

// Nouveaux Delay appliqués pour la suite de la scénette.
// Incrémentar les "décomptes de temps" au fil des Delay successifs,
// car ils sont tous "observés" & "déclenchés" dans le même temps au Déclenchement du Script.
DelayCommand (10.0, RemoveEffect(oTarget, eEffect));
// Rajout donc de 5.0 sec au Delay du Speak qui suit (soit : 10.0 + 5.0),
// pour laisser le temps à la Transformation de s'effectuer.
DelayCommand (15.0, ActionSpeakString("Essayons de faire mieux..."));

// Relance le même Script et le met donc "en boucle".
DelayCommand (20.0, ExecuteScript("moine_polymorph",OBJECT_SELF));
}
Et ça marche!! :D


Mes avis que tu avais oublié de signifier l'Effect du RemoveEffect... et comme l'avaient déjà dit Jedaï et shadoh
(EDIT: Et aussi eMRaistlin) il faut parfois assigner un DelayCommand plutôt qu'un ActionWait... ;)

:merci:

Par Cassin le 28/11/2002 à 23:49:08 (#2668530)

Voilà ça marche, merci à tous !

Voilà le script pour ceux que ça peut intéresser :

/* By coolstar */
#include "nw_i0_plot"

void main()
{
ClearAllActions();

int nDurationType = DURATION_TYPE_INSTANT;
int nPolymorphSelection = POLYMORPH_TYPE_RED_DRAGON;
effect eEffect = EffectPolymorph(nPolymorphSelection);
object oTarget = OBJECT_SELF;

DelayCommand (3.0, ActionCastFakeSpellAtObject(SPELL_SHAPECHANGE,OBJECT_SELF));
DelayCommand (5.0, ApplyEffectToObject(nDurationType, eEffect, oTarget));
DelayCommand (6.0, ActionSpeakString("Voyons voir combien de temps j'arrive a tenir cette forme..."));

DelayCommand (10.0, RemoveEffect(oTarget, eEffect));
DelayCommand (11.0, ActionSpeakString("Pas mal... mais je peux faire mieux que ca !"));

DelayCommand(20.0,ExecuteScript("moine_polymorph",OBJECT_SELF));
}



J'ai ajouté les petites phrases et un petit effet avant la métamorphose, mais cet effet n'est en fait qu'un moulinet des bras avec une incantation, il n'y a pas de zolies lumières partout et de grondement de tonnerre :D, le moine devient dragon sans pratiquement aucune transition...

Est-ce que vous ne connaîtriez pas un autre effet esthétiquement plus sympa ? ;)

Par coolstar le 28/11/2002 à 23:59:42 (#2668596)

Note...


1) Ravi que le nb que je suis ait pu t'aider ! :D

2) A titre indicatif j'ai Edité le Script que je t'avais arrangé, avec plus d'explications pour les nb's... :merci:

3) Au fait Cassin, j'ai eu la maladresse de signer le Script coolstar alors que je n'ai fait que reprendre TON Travail. Donc j'ai corrigé... ;)

...



PS : Merci pour ton Script Cassin! Il m'a permis de me mettre à l'épreuve et d'en apprendre beaucoup...
D'autant que c'est justement le genre de Script que je cherche ! Trop fier le nb! :blabla:

Par eMRaistlin le 29/11/2002 à 0:51:11 (#2668867)

Est-ce que vous ne connaîtriez pas un autre effet esthétiquement plus sympa ?


Essaye le VFX du polymorph, il est bien... (j'ai plus le nom en tete, mais ca doit etre facile a trouver sur le tolset ^^)

Par coolstar le 29/11/2002 à 1:09:08 (#2668982)

Genre ??

void main()
{
location lMoine = GetLocation(OBJECT_SELF);
effect eVisual = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVisual, lMoine, 6.0);
}
...

Par Cassin le 29/11/2002 à 8:36:27 (#2669883)

VFX_SUMMON_CELESTIAL ça fait plus un effet de portail si je me souviens bien, j'avais du essayer ça une fois déjà...

Bon, j'ai pas le toolset sous la main là, mais j'essaierais cet après-midi :D


PS : Merci pour ton Script Cassin! Il m'a permis de me mettre à l'épreuve et d'en apprendre beaucoup...
D'autant que c'est justement le genre de Script que je cherche ! Trop fier le nb!


Vi, je me suis également surpris moi-même, j'ai fais pas mal de progrès en scripting ces derniers temps :D
On va bientôt pouvoir rejoindre les rangs des Masters Of Scripting ? :mdr:

(maintenant faut que je prenne l'habitude de mettre un copyright sur mes scripts, des fois ça peut servir ;) )

Par coolstar le 29/11/2002 à 11:57:50 (#2670920)

De rien Cassin...

Par Jedaï le 29/11/2002 à 16:33:42 (#2673216)

En dehors du fait que la solution de Coolstar est bien meilleure :D, j'aimerais bien savoir si quelqu'un a une idée de pourquoi mon script ne marche pas, c'est EFECT_POLYMORPH qui déconne ou quoi ?:confus:

Par eMRaistlin le 29/11/2002 à 17:10:44 (#2673532)

Je ne sais pas trop.

Je te suggere de mettre un speakString(IntToString(Effect)) dans ta boucle.


void AntiPolymorph(object oCreature)
{
effect ePoly = GetFirstEffect(oCreature);

if (GetIsObjectValid(oCreature))
{
while (GetIsEffectValid(ePoly))
{
if (GetEffectType(ePoly) == EFFECT_TYPE_POLYMORPH)
{
RemoveEffect(oCreature, ePoly);
}
AssignCommand(oCreature,SpeakString(IntToString(GetEffectType(ePoly))));
ePoly = GetNextEffect(oCreature);
}
}
}


Et pis, a ta place, je mettrai une declaration de l'obet oCreature dans le main, vu que je suis pas un fan du DelayCommand melange avec les Object_Self.

Par coolstar le 30/11/2002 à 17:32:38 (#2680523)

Dis-moi Jedaï? J'ai tordu dans tous les sens ta proposition pour essayer de la comprendre... mais franchement ton truc m'échappe... il compile et même ne gène pas la Métamorphose appelée par le Script... alors quelle devait être sa fonction ??
... pourquoi avoir voulu à tout prix complexifier le RemoveEffect qui joue déjà bien son rôle ??? :confus:


... Et pourquoi les canards ont-il les dents jaunes ???


:merci:

Par Jaha Effect le 30/11/2002 à 17:41:07 (#2680574)

Provient du message de coolstar
RemoveEffect


Mouainnnnnnn on en veux à ma vie :(

Jaha Effect :D

Par coolstar le 30/11/2002 à 17:46:12 (#2680597)

Floodding? Spamming?? Trolling??? Pudding... :D

:mdr:

Par Cassin le 30/11/2002 à 20:03:26 (#2681418)

J'avais vu ici il y a pas mal de temps un module qui permettait de tester tous les effet du jeu, je ne sais pas si vous voyez de quoi je parle...
J'ai pas trouvé en faisant une recherche (je ne sais même pas comment il s'appelle...)
Enfin, si quelqu'un voit de quel module je veux parler, s'il avait encore un lien à me donner, ça serait sympa !

Par eMRaistlin le 30/11/2002 à 20:06:34 (#2681438)

je n'ai pas le lien, mais j'ai le module... il s'appele "TseramedsGallery.mod"

Par Jaha Effect le 30/11/2002 à 20:09:50 (#2681462)

C'est ICI

Jaha Effect :D

Par Cassin le 30/11/2002 à 20:16:15 (#2681504)

Merci ;)

Par coolstar le 30/11/2002 à 21:19:40 (#2681810)

[RestoreEffect]Thx! :D[/RestoreEffect]

Par Jaha Effect le 30/11/2002 à 21:23:29 (#2681839)

héhéhé j'aime bien le RestoreEffect :)

Par Jedaï le 1/12/2002 à 0:36:11 (#2682697)

Coolstar> C'est la procédure standard pour enlever un effet déterminé : passer dans une boucle tous les effets présent sur la créature et, si leur type correspond, les supprimer. Ici, ce n'était pas nécessaire parce qu'on pouvait récupérer directement l'effet concerné, mais la plupart du temps le script où l'on applique l'effet et celui où on le retire sont distinct. Or il n'existe pas de SetLocalEffect(), l'unique solution est donc la boucle.

Dans ce cas c'était une très bonne idée de le supprimer directement avec l'ID qu'on avait récupéré en le créant :). Mais normalement ma solution aurait dû marcher aussi .:confus:

Par coolstar le 1/12/2002 à 0:51:25 (#2682782)

Merci pour ces éclaircissements Jedaï... et c'est vrai que ta boucle ne semble pas fonctionner... :D

;)

Par Jedaï le 1/12/2002 à 1:10:04 (#2682898)

Oui, et c'est curieux, théoriquement et en pratique plusieurs fois (j'en suis quasiment sûr) cette technique devrait marcher :confus:
Peut-être que Polymorph pose problème...

(Je dois dire que je ne peux plus faire de test : je n'ai toujours pas changé mon lecteur de CD qui a grillé :D )

Par coolstar le 1/12/2002 à 1:29:26 (#2683012)

Tu me fais penser à un piti détail d'ailleurs... j'ai cru me rendre compte qu'à plusieurs reprises des trucs ne marchaient pas comme on l'attendait... comme si les gars de Bioware avait interprété certaines commandes du NWScript selon eux, ou comme si même ils avaient fait des bourdes... :D

Le fait est que le Polymorphisme semble être traité comme un cas à part, puisque le Mage peut arrêter l'effet quand il veut (contrairement aux autres effets dont on est la victime)... d'ailleurs, n'existe-t-il pas une commande qui donne au PNJ le moyen d'arrêter son Polymorphisme comme peut le faire le PJ ??? :confus:


...

Par Jedaï le 1/12/2002 à 1:49:41 (#2683118)

Good idea, mais je viens de chercher : la seule fonction comprenant "poly" dans son nom est EffectPolymorph()... :(

Et encore une question ... j'arrête pas

Par Aer'Dalys le 1/12/2002 à 10:46:14 (#2684051)

C'est toujours dans le thème du forum, si je veux un effet spécial, qui pourrait me dire où je peux trouver les noms de ces effets et leurs caractéristiques visuelles : apparition d'un PNJ avec l'effet d'une boule de Feu (mais il n'y aurait pas les dégâts qui s'accompagnent généralement avec .....
Merci

Par Ormus le 1/12/2002 à 10:57:46 (#2684091)

Eh bien peut-être en rajoutant ça dans le OnSpawn :

ActionCastFakeSpellAtObject(SPELL_FIREBALL, OBJECT_SELF, PROJECTILE_PATH_TYPE_DEFAULT);

Tiens tant que j'y suis quelqu'un sait si c'est possible de transformer un effet de sort en placeable ? :doute:

Par coolstar le 1/12/2002 à 12:41:45 (#2684685)

Hi!


1) L'idéal Aer'Dalys, c'est d'utiliser le mode de recherche automatique de l'Editeur de Script (à droite) en employant des termes comme SPELL ou VFX (en MAJUSCULE)... :D

2) Travail sur la 3D ? Huummm... faut relancer le sujet ailleurs Ormus, non ? y'a des réponses possibles pour ça et même toutes fraîches genre ! ;)

...

JOL Archives 1.0.1
@ JOL / JeuxOnLine