[AIDE] PNJ Lanceur de sort

Répondre
Partager Rechercher
Bonjours à tous , j'ai créé des PNJs lanceurs de sorts , magiciens et autres , mais ceux-ci ne se servent pas de leurs sorts à 100% .
Pour la plupart il lance 3 ou 4 de leurs sort a dispo. et ensuite ils se mettent au corps à corps . Savez-vous si il y a moyen de changez cela et de faire en sorte que les lanceurs de sorts controlés par l'Inteligence Artificiel soient plus rentable et utilisent tout leurs sorts
l'astuce c'est de bien choisir les sorts du pnj pour qu'il fasse des combos:
Ex: sorts diminuants les jets de sauvegarde+ sort de paralisie,
dispells+sorts de mort etc etc etc

Les sorts sont lancés aléatoirement, avec priorité sort de soin si le PNJ est blessé.
Non, ce n'est pas vraiment aléatoire, en fait le PNJ voit meme des chose qu'il ne devrait pas savoir.
Par exemple il voit le niveau de l'ennemi et adapte ses sorts en fonction. Il voit si le PJ a une detection de l'invisible active ou non (pour voir s'il lance invis sur lui meme pas ex) ou encore il voit si le PJ est immunisé aux sort mentaux.
Grace aux fonction d'IA tu peux régler ton PNJ pour qu'il fasse telle ou telle chose (si tu as HoU). Par ex il y a une fonction pour régler s'il sera 100% lanceur de sorts, ou juste 10% etc.
Regarde les script d'OnSpawn il me semble que tu as les premières indications dessus.
J'avais jamais remarqué tiens, mais oui, ça doit être depuis HotU je crois ça non?
Enfin, ceci dit, bien choisir les sorts du PNJ est super top efficace: Rien que en changeant les sorts des lanceurs dans un donjon, le donjon passe par exemple d'un "promenade pour niveau 14" à "lieu ou même un niveau 20 peut mourir comme une merde" ^^

Wen, tueur sadique de PJ depuis 1977.
Je trouve pas ou l'on peut régler le % de lanceur de sort ou combattant des créatures ( en + je suis pas très doué pour les scripts ... ) . Ce que je ne comprend pas par ailleurs c'est que une créature combattante ou une créature lanceur de sort utilise les mêmes scripts ( sur le On Spawn , etc ) et pourtant ils n'ont pas la même fonction .
Pour poser un problème équivalent ( au passage ... ) , J'ai créer des créatures immobiles ,autour d'un boss , qui possèdent uniquement des sorts de soins et quand le boss perd de la vie ( et même jusqu'à la mort ) elles ne le soignent pas , par contre elle se soigne si elles prennent des dégâts . Et pourtant un gobelin chaman soigne ses alliés quand ils prennent des coups , vous savez d'où cela peut venir ?
En espérant avoir encore des réponses de votre part , merci pour votre aide
Peut être que c'est le fait de ne pas activer de rencontre que les mobs ne ce soignent pas entre eux... Une créature posée directement sur la zone agirait indépendamment de ses alliés.
Rajoute une petite vérification dans l'évènement "OnDamaged" du boss, qui enverra un message à ses congénères, si sa vie baisse un peu trop. Une commande comme ci-dessous suffira :
Code PHP:

int nMaxHP GetMaxHitPoints();
int nCurrentHP GetCurrentHitPoints();
// Hop un petit pourcentage de points de vie perdus:
int nPercentHP = (nCurrentHP/nMaxHP)*100;

// Si le boss est a moins de 10% de sa vie
if(nPercentHP 10)
    
SpeakString("HEAL_10",TALKVOLUME_SILENT_SHOUT);
    
// Tu peux enlever "TALKVOLUME..." pour les tests

// ou, si le boss est a moins de 20% de sa vie
else if(nPercentHP 20)
    
SpeakString("HEAL_20",TALKVOLUME_SILENT_SHOUT);

// ou, si le boss est a moins de 50% de sa vie
else if(nPercentHP 50)
    
SpeakString("HEAL_50",TALKVOLUME_SILENT_SHOUT); 
Ensuite tu paramètre tes soigneurs.

Dans leur évènement "OnSpawn" tu fais en sorte qu'ils puissent "entendre", et qu'ils réagissent à l'appel du Boss, en fonction de cet appel. Ces deux lignes suffiront :
Code PHP:

SetListenPattern(OBJECT_SELF,"HEAL_**",26999);
SetListening(OBJECT_SELF,TRUE); 
Dans leur évènement "OnConversation", tu les fait réagir s'ils "entendent" l'appel de leur boss.
Code PHP:

if(GetListenPatternNumber()==26999)
{
    
object oBoss GetNearestObjectByTag("Tag_du_Boss");
    
string sPhrase GetMatchedSubstring(0);
    
int bCritical GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS) > 0;
    
int bSerious GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS) > 0;
    
int bModerate GetHasSpell(SPELL_CURE_MODERATE_WOUNDS) > 0;
    
int bLight GetHasSpell(SPELL_CURE_LIGHT_WOUNDS) > 0;
    
int bMinor GetHasSpell(SPELL_CURE_MINOR_WOUNDS) > 0;

    if(
sPhrase == "HEAL_10")
    {
        if(
bCritical)
            
ActionCastSpell(SPELL_CURE_CRITICAL_WOUNDS,oBoss);

        else if(
bSerious)
            
ActionCastSpell(SPELL_CURE_SERIOUS_WOUNDS,oBoss);

        else if(
bModerate)
            
ActionCastSpell(SPELL_CURE_MODERATE_WOUNDS,oBoss);

        else if(
bLight)
            
ActionCastSpell(SPELL_CURE_LIGHT_WOUNDS,oBoss);

        else if(
bMinor)
            
ActionCastSpell(SPELL_CURE_MINOR_WOUNDS,oBoss);
    }
    else if(
sPhrase == "HEAL_20")
    {
        if(
bSerious)
            
ActionCastSpell(SPELL_CURE_SERIOUS_WOUNDS,oBoss);

        else if(
bModerate)
            
ActionCastSpell(SPELL_CURE_MODERATE_WOUNDS,oBoss);

        else if(
bLight)
            
ActionCastSpell(SPELL_CURE_LIGHT_WOUNDS,oBoss);

        else if(
bMinor)
            
ActionCastSpell(SPELL_CURE_MINOR_WOUNDS,oBoss);
    }
    else if(
sPhrase == "HEAL_50")
    {
        if(
bModerate)
            
ActionCastSpell(SPELL_CURE_MODERATE_WOUNDS,oBoss);

        else if(
bLight)
            
ActionCastSpell(SPELL_CURE_LIGHT_WOUNDS,oBoss);

        else if(
bMinor)
            
ActionCastSpell(SPELL_CURE_MINOR_WOUNDS,oBoss);
    }

Regarde le script : x2_ai_demo et x2_inc_switch, tu trouvera quelques trucs comme :

Code PHP:

//------------------------------------------------------------------------------
// * Setting this variable on a spellcaster creature will make its spelluse a
// * bit more random, but their spell selection may not always be appropriate
// * to the situation anymore.
//------------------------------------------------------------------------------
const string CREATURE_VAR_RANDOMIZE_SPELLUSE "X2_SPELL_RANDOM"
ou encore
Code PHP:

-----------------------------------------------------------------------
// * The value of this variable (int) is added to the chance that a creature
// * will use magic in combat. Set to 100 for always, 0 for never
//------------------------------------------------------------------------------
const string CREATURE_AI_MODIFIED_MAGIC_RATE "X2_L_BEH_MAGIC"
Merci pour ton aide Deyonara , ça va bien m'aider et ça répond parfaitement a ce que j'attendais .
Par contre Morethil , je vais encore t'ennuyer un peu avec mes questions . J'ai trouvée les variables que tu m'as montrées mais je ne sais pas à partir d'où est déclenché ce script , de façon a ce que je puisse le personalisé pour chaque type de classe ?
J'ai pas regardé avec précision ces token là, je ne pourrais pas te dire comment s'en servir. Basiquement, je crois que si tu mets le premier token (Je sais plus lequel c'est) au lieu d'exécuter la fonction DetermineCombatRound() il execute ton script d'AI.

Je te dirais ca plus précisément quand je ferais mes scripts d'AI

D'ici là, si tu trouve, dis nous
Donc j'ai regardé un des exemples d'HotU. C'est bien ce que je te disais.

Il faut placer sur le monstre la variable suivante :
X2_SPECIAL_COMBAT_AI_SCRIPT - string - nom_du_AI_script

A partir de là, au lieu d'utiliser la fonction normale "DetermineCombatRound" la créature va utiliser le script désigné.

Note que DetermineCombatRound ne se lance QUE si la créature est en situation de combat (ennemi detecté, ou pas visible mais déja vu, etc). Donc ce n'est pas possible par exemple avec ca de faire fuir une créature si les personnes detectées ne sont pas hostile.

Si tu veux avoir une idée plus précise, regarde le Tyrannoeil qui a un script d'AI (x2_ai_behold) la variable qui le déclare, et aussi une autre variable pour l'inciter a n'attaquer que via magie.

J'ajoute en exemple cette ligne :
const string CREATURE_VAR_CUSTOM_AISCRIPT = "X2_SPECIAL_COMBAT_AI_SCRIPT";

Dans cette variable là, le nom de la variable est la partie entre guillemet.
Pour utiliser X2_L_BEH_MAGIC, il suffit de creer une variable sur ton blueprint
non : X2_L_BEH_MAGIC
type : int
pourcentage : de 1 a 100 ^^

voila a 100, ils jettent tous ce qu'il ont .

j
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés