Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Supprimer un effet
Supprimer un effet
Par Cassin le 28/11/2002 à 20:00:06 (#2666826)
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)
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)
Par Cassin le 28/11/2002 à 20:56:14 (#2667283)
#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)
Par Jedaï le 28/11/2002 à 21:36:17 (#2667608)
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)
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)
J'ai fait le test avec CA...//::///////////////////////////////////////////////
Et ça marche!! :D
//:: 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));
}
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à 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)
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)
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)
Bon, j'ai pas le toolset sous la main là, mais j'essaierais cet après-midi :DPS : 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)
Par Jedaï le 29/11/2002 à 16:33:42 (#2673216)
Par eMRaistlin le 29/11/2002 à 17:10:44 (#2673532)
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)
... 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)
:mdr:
Par Cassin le 30/11/2002 à 20:03:26 (#2681418)
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)
Par Jaha Effect le 30/11/2002 à 20:09:50 (#2681462)
Jaha Effect :D
Par Cassin le 30/11/2002 à 20:16:15 (#2681504)
Par coolstar le 30/11/2002 à 21:19:40 (#2681810)
Par Jaha Effect le 30/11/2002 à 21:23:29 (#2681839)
Par Jedaï le 1/12/2002 à 0:36:11 (#2682697)
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)
;)
Par Jedaï le 1/12/2002 à 1:10:04 (#2682898)
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)
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)
Et encore une question ... j'arrête pas
Par Aer'Dalys le 1/12/2002 à 10:46:14 (#2684051)
Merci
Par Ormus le 1/12/2002 à 10:57:46 (#2684091)
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)
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