Bonjour à tous,
Je cherche à créer un comportement permettant à un pnj hostile d'une rencontre de donner un peu plus de fil à retordre aux PJs.
L'idée est qu'il se soignera lorsque ses HP <= 60%, qu'il lancera des buffs lorsqu'il n'aura pas/plus leurs effets sur lui.
J'ai des résultats mais ils ne semblent pas 100% fiables...
Il semble difficile de pouvoir faire en sorte que la créature check "en temps réel" son état et agisse en conséquence.
J'ai tenté l'astuce OnPerceived qui se déclenche assez souvent avec ses 4 stades, pour peu qu'il y ait plusieurs PJ. Mais là encore j'ai quelques bugs (probablement une erreur (ou plusieurs

) dans mon code) :
Dont le plus ennuyeux : Le pnj relance des buffs qu'il a déjà lancé auparavant et dont les effets ne sont pas encore estompés (définitivement, ça sent l'erreur dans le code).
Voici mon script OnPerceived:
void main()
{
object joueur = GetLastPerceived();
if(GetLastPerceptionSeen() == TRUE)
{
ClearAllActions(TRUE);
ActionSpeakString("Vu");//String test
ExecuteScript("cita_pretre_ia",OBJECT_SELF);
}
else if(GetLastPerceptionHeard() == TRUE)
{
ClearAllActions(TRUE);
ActionSpeakString("Entendu");//String test
// ExecuteScript("cita_pretre_ia",OBJECT_SELF);
}
else if(GetLastPerceptionInaudible() == TRUE)
{
ActionSpeakString("Inaudible");//String test
// ExecuteScript("cita_pretre_ia",OBJECT_SELF);
}
else if(GetLastPerceptionVanished() == TRUE)
{
ActionSpeakString("Disparu");//String test
ExecuteScript("cita_pretre_ia",OBJECT_SELF);
}
}
Puis le script "cita_pretre_ia" qui est appelé dans le OnPerceived :
#include "NW_I0_GENERIC"
void main()
{
object joueur = GetLastPerceived();
int HPpourcent;
int CurrentHP = GetCurrentHitPoints();
int MaxHP = GetMaxHitPoints();
if(CurrentHP<MaxHP)
{
HPpourcent = GetPercentageHP(OBJECT_SELF);
if (HPpourcent<=60)// Si pourcentage d'HP restant <= 60%
{
AssignCommand(OBJECT_SELF, ActionCastSpellAtObject(114, OBJECT_SELF, METAMAGIC_QUICKEN, TRUE, 20));
ActionSpeakString("Je dois me soigner!!");//String pour tests
}
else
{
ActionSpeakString("HP OK");//String pour tests
}
}
if (GetHasSpellEffect(1024, OBJECT_SELF)==FALSE)
//Endurance de l'ours de groupe
{
AssignCommand(OBJECT_SELF, ActionCastSpellAtObject(1024, OBJECT_SELF, METAMAGIC_QUICKEN, TRUE, 20));
//Un heal rapide pour enquiquiner le(s) joueur(s) ^^'
AssignCommand(OBJECT_SELF, ActionCastSpellAtObject(114, OBJECT_SELF, METAMAGIC_QUICKEN, TRUE, 20, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
}
if (GetHasSpellEffect(1018, OBJECT_SELF)==FALSE)
//Protection contre la mort de groupe
{
AssignCommand(OBJECT_SELF, ActionCastSpellAtObject(1018, OBJECT_SELF, METAMAGIC_QUICKEN, TRUE, 20));
}
if(GetHasSpellEffect(42, OBJECT_SELF)==FALSE)
//Puissance Divine
{
AssignCommand(OBJECT_SELF, ActionCastSpellAtObject(42, OBJECT_SELF, METAMAGIC_QUICKEN, TRUE, 20));
}
if(GetHasFeatEffect(414, OBJECT_SELF)==FALSE)
//Est-ce qu'on a bouclier divin ?
{
AssignCommand(OBJECT_SELF, ActionUseFeat(414, OBJECT_SELF));
}
if (GetHasSpellEffect(133, OBJECT_SELF)==FALSE)
//Prière
{
AssignCommand(OBJECT_SELF, ActionCastSpellAtObject(133, OBJECT_SELF, METAMAGIC_QUICKEN, TRUE, 20));
}
}
Sinon, j'ai fais quelques tests en utilisant le OnUserDefined, mais là encore ce n'est pas probant.
J'ai des résultats aléatoires, avec des rebuffs incohérents et des heals qui sont lancés bien trop tardivement.
J'aimerai avoir vos avis/remarques/commentaires/conseils pour que je puisse mener mon humble projet de novice à bien
Merci d'avance !