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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Mes scripts ne sont pas parfaits. Help !

Par TheRack le 6/11/2002 à 12:16:07 (#2494110)

Salut à tous,

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)

Si la créature meurt en un coup...

Essaye de faire un truc du genre en plus du soin :

if(GetCurrentHitPoint(OBJECT_SELF) <= 0)
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurection(), OBJECT_SELF);
J'ai pas testé, la fonction de l'effet de resurection c'est certainement pas ça mais quelque chose du genre :)

Par Jedaï le 6/11/2002 à 14:02:52 (#2495225)

Ah oui effectivement, dans ces scripts je n'avais pas envisagé la possibilité qu'un gros monstre tue le NPC d'un seul coup. Par contre, Tynril, je ne suis pas sûr que OnDamage soit appelé si le NPC meurt, mais ça vaut le coup d'essayer ! :confus:

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)

Encore une fois, c'est nos amis les mago qui vont pyer... ( a moin que GetObjectByTag("arme") rammene une dague...

Par Jedaï le 6/11/2002 à 14:42:37 (#2495676)

Pas de problème, on peut faire un NPC très facile à toucher pour éviter de défavoriser les magos, de toutes façon si le PC n'a pas la bonne arme, ça ne fera que le tuer plus vite ! :mdr:

Par TheRack le 6/11/2002 à 15:15:23 (#2495984)

- Alors, pour ce qui est du OnDeath, le script ne semble pas répondre, ou alors c'est le Resurrection qui marche pas !

- 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)

Tu es sûr que ça ne marchait pas pour le OnDamaged ? Parce que ça signifierait que il ne considère pas OBJECT_INVALID comme différent de l'objet obtenu par le tag... :eek:
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)

Juste une petite remarque, pour dire que personnellement je préfère:


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)

Effectivement, c'est beaucoup mieux ! :merci:

Par TheRack le 6/11/2002 à 16:22:52 (#2496612)

J'ai pratiquement résolu tous ces problèmes. Sauf pour ces "one-death-shots". Apparement, losque le monstre tue la créature d'un seul coup, le OnDamaged est ignoré (ça me parait logique) et le OnDeath n'arrive pas à réssuciter la créature.

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)

Pourquoi ne pas, tout simplement fixer le bonus au jet de vigueur de ta créature à +100...
De cette manière, les Balors ne devraient plus être un problème...
:maboule:

Par eMRaistlin le 6/11/2002 à 16:46:53 (#2496856)

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...

Par TheRack le 6/11/2002 à 17:47:15 (#2497625)

Super, les gars, je crois que maintenant, c'est bon. Il ne vous reste plus qu'à me dire comment on fait pour que les scripts restent actifs quand je rentre dans la créature en tant que MD.

Je m'incline devant tant de science :merci: :merci:

Par coolstar le 22/12/2002 à 18:03:41 (#2854709)

Hi!


[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... :D

Provient 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)

j'ignorais, mais a priori, il remplace le cadavre du monstre par un objet cadavre... donc plsu le meme script ni rien...


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)

Ben justement, j'avais bien commencé déjà sans mettre de Conditions et même en essayant avec
SetIsDestroyable(FALSE, TRUE);... mais rien!!! :confus:


Et ceci ne représente pas la garantie de cela... :D

Provient 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