Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Mes scripts ne sont pas parfaits. Help !
Mes scripts ne sont pas parfaits. Help !
Par TheRack le 6/11/2002 à 12:16:07 (#2494110)
Voilà, j'ai trois scripts qui sont censés rendre une créature invulnérable à toute attaque ou tout dégat, sauf si on l'attaque avec une certaine arme. La subtilité, c'est que si on ne l'attaque pas avec cette arme, les dégats qu'on ferait à la créature sont renvoyés sur l'attaquant (attaques physiques, sorts, etc.). Les voicis:
// à mettre sur le OnDamaged de la créature:
void main()
{
object oPC = GetLastDamager();
int nNbDmg = GetTotalDamageDealt();
int Ndamage = nNbDmg*4;
effect eHeal = EffectHeal(nNbDmg);
effect eDamage = EffectDamage(nNbDmg);
effect eDamage2 = EffectDamage(Ndamage);
ClearAllActions();
if (GetLastWeaponUsed(oPC) == OBJECT_INVALID)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
}
else if (GetLastWeaponUsed(oPC) == GetObjectByTag("arme"))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage2, OBJECT_SELF);
}
else
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
}
}
// à mettre sur le OnSpellCastAt :
void main()
{
object oCaster = GetLastSpellCaster();
ClearAllActions();
ActionCastSpellAtObject(GetLastSpell(), oCaster, METAMAGIC_ANY, TRUE,
0, PROJECTILE_PATH_TYPE_HOMING, TRUE);
ActionDoCommand(DetermineCombatRound(oCaster));
}
// et enfin, sur le OnSpawn :
void main()
{
ClearAllActions();
effect eImmunity1 = EffectSpellImmunity(SPELL_ALL_SPELLS);
effect eImmunity2 = EffectImmunity(IMMUNITY_TYPE_DEATH);
object oSelf = OBJECT_SELF;
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImmunity1, oSelf);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImmunity2, oSelf);
}
Donc, je résume : 2 possibilités:
A) j'attaque avec l'arme, le combat se déroule normalement
B) je n'attaque pas avec cette arme, ou je lance un sort, ou autre, je me prends les dégats mais pas la créature.
Voilà, mon problème, c'est que les monstres genre Balor ou Dragon arrivent parfois à tuer la créature. Ou est le bug dans ces scripts ?
Je sais que c'est un peu fouilli. Merci à qui pourra m'aider.
Par Tynril le 6/11/2002 à 12:28:52 (#2494206)
Essaye de faire un truc du genre en plus du soin :if(GetCurrentHitPoint(OBJECT_SELF) <= 0)
J'ai pas testé, la fonction de l'effet de resurection c'est certainement pas ça mais quelque chose du genre :)
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurection(), OBJECT_SELF);
Par Jedaï le 6/11/2002 à 14:02:52 (#2495225)
Mais si ça marche pas (essaie quand même) tu peux toujours rajouter au OnDeath les lignes suivantes :
object oPC = GetLastKiller();
if (GetLastWeaponUsed(oPC) != GetObjectByTag("arme"))
{
int nHP = GetMaxHitPoints(OBJECT_SELF);
effect eRez = EffectResurrection();
effect eHeal = EffectHeal(nHP);
effect eDamage = EffectDamage(nHP);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eRez, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
}
A la fin du script par défaut du NPC.
Par ailleurs, pour ton OnDamaged :
void main()
{
object oPC = GetLastDamager();
if (GetLastWeaponUsed(oPC) != GetObjectByTag("arme"))
{
int nNbDmg = GetTotalDamageDealt();
effect eHeal = EffectHeal(nNbDmg);
effect eDamage = EffectDamage(nNbDmg);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
}
else
{
int nRealDmg = 4 * GetTotalDamageDealt();
effect eDamage = EffectDamage(nRealDmg);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
}
}
Ca serait un peu meilleur, non ? Y a-t-il une raison particulière pour que tu aies utilisé ClearAllActions() ici ?
Par eMRaistlin le 6/11/2002 à 14:23:45 (#2495476)
Par Jedaï le 6/11/2002 à 14:42:37 (#2495676)
Par TheRack le 6/11/2002 à 15:15:23 (#2495984)
- En ce qui concerne le script du OnDamaged, tu avais oublié que certains PC peuvent se battre sans armes, à mains nues (moines). Voilà pourquoi je l'ai modifié, et ça, ça marche. Pour le ClearAllActions, je crois que c'est toi qui l'avait mis. Effectivement, je ne sais pas si c'est utile.
- Pour l'arme en question, rassurez-vous, ce sera une arme utilisable par tout le monde, et il suffira de deux ou trois coups pour tuer la créature (même pour un mago).
Mais maintenant, j'ai toujours deux problèmes.
1) Ces monstres qui tuent d'un seul coup...?!?!
2) La créature n'est pas immunisé contre les effets magiques ne venants pas d'une créature (Quand le Balor meurt, il se produit une explosion. Ma créature se la prend en pleine tronche). Pourtant, j'ai bien mis le script dans OnSpawn, comme on me l'avait dit...
Merci les chefs de votre peine. Mais ça vaut la peine de chercher je crois.
Par Jedaï le 6/11/2002 à 15:41:21 (#2496229)
Je n'avais pas mis de ClearAllActions() sauf dans le OnSpellCastAt.
Tu peux utiliser le script :
void main()
{
object oPC = GetLastDamager();
if (GetLastWeaponUsed(oPC) != GetObjectByTag("arme") ||
GetLastWeaponUsed(oPC) == OBJECT_INVALID)
{
int nNbDmg = GetTotalDamageDealt();
effect eHeal = EffectHeal(nNbDmg);
effect eDamage = EffectDamage(nNbDmg);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
}
else
{
int nRealDmg = 4 * GetTotalDamageDealt();
effect eDamage = EffectDamage(nRealDmg);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
}
}
Je ne comprend pas pourquoi le OnDeath marche pas... Quant aux effets des "sorts" des créatures, je ne sais pas, théoriquement il est immunisé à tous les sorts mais peut-être qu'il aurait besoin d'une immunité supplémentaire... J'ai pas trouvé d'immunité contre les sorts des monstre mais...
Par LeProctophantasmiste le 6/11/2002 à 15:58:33 (#2496399)
GetTag(GetLastWeaponUsed(oPC)) != "arme"
à:
GetLastWeaponUsed(oPC) != GetObjectByTag("arme")
Cela a le même effet s'il existe un unique objet ayant ce tag et ça ne bug pas au cas ou il y en a plusieurs., l'expression est aussi plus simple.
Par Jedaï le 6/11/2002 à 16:03:08 (#2496441)
Par TheRack le 6/11/2002 à 16:22:52 (#2496612)
Dans le OnDeath, peut-être mettre un script qui recrée la même créature au même endroit, mais seulement si la mort a été engendré par autre chose que l'arme en question (pfff, ça devient compliqué !!!)
Pourquoi les Balors et autres Dragons peuvent-ils tuer d'un seul coup même des créatures avec 10000 PV ? :enerve:
:merci:
Hors script
Par Aziphael le 6/11/2002 à 16:43:09 (#2496813)
De cette manière, les Balors ne devraient plus être un problème...
:maboule:
Par eMRaistlin le 6/11/2002 à 16:46:53 (#2496856)
Donc, tu demande a ta creature d'avoir un cadavre (avec le truc de la croix pour la mort definitive) et tu teste le OnDeath... je pense que ca ira mieux...
Par TheRack le 6/11/2002 à 17:47:15 (#2497625)
Je m'incline devant tant de science :merci: :merci:
Par coolstar le 22/12/2002 à 18:03:41 (#2854709)
[ModUP]J'ai testé cela et dans le OnDeath et dans le OnDamaged... :confus:
void main()
{
if (GetCurrentHitPoints(OBJECT_SELF) <= 0)
{
// AssignCommand(OBJECT_SELF, SetIsDestroyable(FALSE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF);
}
}
Et j'ai aussi tenu compte de ceci... :DProvient du message de eMRaistlin
Vi, et fais aussi attention a la case a cocher 'Definitive Death' paske si ton objet est detruit immediatement a sa mort, alors le OnDeath ne recupere pas d'object_self (enfin, je crois...)
Donc, tu demande a ta creature d'avoir un cadavre (avec le truc de la croix pour la mort definitive) et tu teste le OnDeath... je pense que ca ira mieux...
Mais rien n'y fait pour ramener un NPC décédé... comment cela se fait-il??? :enerve:
...[/ModUP]
EDIT
-----------------------
/me s'empresse d'Editer la connerie qu'il avait inséré dans son Post... :o
-----------------------
Par Jedaï le 22/12/2002 à 20:06:16 (#2855671)
J'ai testé cela et dans le OnHeartBeat et dans le OnDamaged...
Ben si ça marche pas c'est peut-être parce qu'il faut le mettre dans le OnDeath, non ?
Sinon tu peux aussi essayer ce script (à toi de le modifier) :void main()
{
int nHP = GetMaxHitPoints(OBJECT_SELF);
effect eRez = EffectResurrection();
effect eHeal = EffectHeal(nHP);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eRez, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
}
Le OnDamaged ne se déclenche pas à la mort du monstre (à vérifier) et je ne suis pas sûr que les NPCs puissent avoir moins de 0 pv.
Par Jaha Effect le 22/12/2002 à 20:15:32 (#2855720)
Provient du message de TheRack
Pourquoi les Balors et autres Dragons peuvent-ils tuer d'un seul coup même des créatures avec 10000 PV ? :enerve:
:merci:
C'est le problème quand on rate un jet de sauvegarde contre mort magique (explication typique de master AD&D).
En mettant des immunité à ce genre de magie ça devrait aller je pense. Ca comprends les sort du style doigt de mort et autres dans le même genre qui implique un jet de sauvegarde sinon mort :D
Jaha Effect :D
Par eMRaistlin le 22/12/2002 à 20:53:59 (#2855907)
Seule solution : sur le OnDeath, tu envoi une demande de creation d'un Objet identique si le tag est bien celui qui fait l'arme est sans effet( avec en plus, effet de dmg pour rammener le nouvel objet a l'etat de l'ancien avant sa mort... dur dur !!)
Par Jedaï le 22/12/2002 à 21:02:56 (#2855979)
En mettant des immunité à ce genre de magie ça devrait aller je pense. Ca comprends les sort du style doigt de mort et autres dans le même genre qui implique un jet de sauvegarde sinon mort
Oui, il suffit d'utiliser
EffectImmunity(IMMUNITY_TYPE_DEATH);
puis un ApplyEffect...() :)
Mais dans ce cas cela avait été fait (cf le OnSpawn du 1er post de ce topic).
Par coolstar le 23/12/2002 à 0:23:43 (#2857454)
Provient du message de Jedaï
Ben si ça marche pas c'est peut-être parce qu'il faut le mettre dans le OnDeath, non ?
Sinon tu peux aussi essayer ce script (à toi de le modifier) :void main()
{
int nHP = GetMaxHitPoints(OBJECT_SELF);
effect eRez = EffectResurrection();
effect eHeal = EffectHeal(nHP);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eRez, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
}
Le OnDamaged ne se déclenche pas à la mort du monstre (à vérifier) et je ne suis pas sûr que les NPCs puissent avoir moins de 0 pv.
1) Je suis un vrai Noc, vu que j'ai voulu en fait écrire OnDeath que j'ai effectivement testé et non OnHeartBeat (lapsus!)... et ça ne change absolument rien au prob... :doute:
2) Je veux bien Jedaï, mais c'est pas déjà l'idée là??? :doute:
void main()
{
if (GetCurrentHitPoints(OBJECT_SELF) <= 0)
{
// AssignCommand(OBJECT_SELF, SetIsDestroyable(FALSE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF);
}
}
Alors, que reste-t-il pour relever un NPC 'Mort', sans passer par un "Respawn"??? Quelqu'un y a-t-il déjà effectivement pourvu??? :confus:
:maboule:
Par Jedaï le 23/12/2002 à 11:49:09 (#2859911)
2) Je veux bien Jedaï, mais c'est pas déjà l'idée là???
void main()
{
if (GetCurrentHitPoints(OBJECT_SELF) <= 0)
{
// AssignCommand(OBJECT_SELF, SetIsDestroyable(FALSE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF);
}
}
Pas exactement : le problème doit venir du GetCurrentHitPoints(), totalement inutile sur un OnDeath (si cet évènement s'est déclenché, c'est que le NPC est mort...:D ), cette fonction renvoie visiblement un truc du type OBJECT_INVALID ou quelque chose comme ça qui fait merder le test. Donc la résurrection ne s'effectue pas, ce qu'elle fait probablement sur mon script !:)
Si toutefois ça ne marchait pas, essaie de rajouter cette ligne au début :
SetIsDestroyable(FALSE, TRUE);
Par coolstar le 23/12/2002 à 12:20:26 (#2860178)
SetIsDestroyable(FALSE, TRUE);... mais rien!!! :confus:
Et ceci ne représente pas la garantie de cela... :DProvient du message de Jedaï
Donc la résurrection ne s'effectue pas, ce qu'elle fait probablement sur mon script !:)
Y'a-t-il un Résultat Avéré!!! :rasta: :rasta: :rasta:
JOL Archives 1.0.1
@ JOL / JeuxOnLine