Page 1 sur 2

Actions suite à la détection d'effet magique

Posté : 10 nov. 2012, 13:21
par Fenrys
Salut, je voudrais savoir comment utilisé la fonction hasmagiceffect parceque je comprend pas trop le truc le but de mon script est que le pnj qui y est associé détecte la vulnérabilité de l'ennemi ( vulnérabilité au feu par exemple et s'équipe d'un sort approprié à celle ci ).

J'ai testé de mettre des conditions sur les sorts mais le jeu s'en fous, j'ai essayer de scripter ça sur un actor, activemagiceffect sur l'event onhit (akaggressor) j'y arrive pas non plus etc. donc je comprend pas.

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 13:47
par Gerauld
Idée très intéressante qui rendrait les PNJ moins débiles. :)
Ce que tu veux, en clair, c'est détecter les éventuelles faiblesses d'un ennemi.

Peut-être dans les actor values listées ici :
https://www.creationkit.com/index.php?t ... Value_List
On y trouve :
DamageResist
PoisonResist
FireResist
ElectricResist
FrostResist
MagicResist
NormalWeaponsResist (Invalid? See Discussion) => (celui-ci ne marche peut-être pas)

Et en utilisant une de ces deux instructions :
GetActorValue ou GetBaseActorValue

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 15:07
par Fenrys
ouais pour l'instant je me concentre sur un mage donc faut utiliser HasMagicEffect genre if Ennemy.HasmagicEffect(AbWeaknessFireConstant) == 1 ou true ?
Self.EquipSpell(Fireball, 1) etc pour chaque élément

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 15:23
par Gerauld
juste :
if Ennemy.HasmagicEffect(AbWeaknessFireConstant)
Sans rien d'autre.

EDIT, j'aurai tenté, si placé sur le PNJ :

if (self as actor).GetCombatTarget().HasmagicEffect(AbWeaknessFireConstant)

Le script doit être de type extends actor pour compiler.

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 16:08
par Fenrys
Scriptname SmartMageAi extends Actor

SPELL Property NewProperty Auto
MagicEffect Property FireWeakness Auto


Event OnEffectStart(Actor akTarget, Actor akCaster)

ENDEVENT


Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)

if akAggressor.HasMagicEffect(FireWeakness)

ENDIF

ENDEVENT

ca me donne ça

Starting 1 compile threads for 1 files...
Compiling "SmartMageAi"...
C:\Program Files (x86)\Bethesda\Skyrim\Data\Scripts\Source\temp\SmartMageAi.psc(14,15): HasMagicEffect is not a function or does not exist
No output generated for SmartMageAi, compilation failed.

Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on SmartMageAi

si je fait comme t'a dis ça marche yeaaaah

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 16:32
par Gerauld
if (akagressor as actor).HasMagicEffect(FireWeakness)

L'event oneffectstart ne sert à rien. Il ne déclenche que dans les scripts d'effets magiques.

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 17:00
par Fenrys
je sais j'avais oublier de le delete, voila le script dans l'etat actuel je vais le tester de ce pas. Scriptname SmartMageAi extends Actor

SPELL Property Fireball Auto

SPELL Property FrostAttack Auto

SPELL Property ShockAttack Auto

MagicEffect Property FireWeakness Auto

MagicEffect Property FrostWeakness Auto

MagicEffect Property ShockWeakness Auto

MagicEffect Property VampireFireWeakness Auto

Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)

if self.GetCombatTarget().HasmagicEffect(FireWeakness)
self.EquipSpell(Fireball, 1)

elseif self.GetCombatTarget().HasmagicEffect(FrostWeakness)
self.EquipSpell(FrostAttack, 1)

elseif self.GetCombatTarget().HasmagicEffect(ShockWeakness)
self.EquipSpell(ShockAttack, 1)

elseif self.GetCombatTarget().HasmagicEffect(VampireFireWeakness)
self.EquipSpell(Fireball, 1)

ENDIF

ENDEVENT

Edit:Oui donc ca marche, mais il réequip tout de suite le sort qu'il à choisit par default donc faudrais que les valeurs soient constantes comment faire?

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 17:34
par Gerauld
Il faut donc shunter le fonctionnement normal pour obliger le tien comme je le craignais dans la shout box... ou lui faire directement lancer le sort.

EDIT : Tente avec un cast au lieu d'un equip :
http://www.creationkit.com/Cast_-_Spell

Par contre, il va peut-être falloir surveiller la réserve de magie (en utilisant l'actor value magicka - voir mon 1er post).

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 20:31
par Fenrys
non mais en fait c'est pas ça le probleme, le probleme c'est l'event, on est parti d'un onhit donc il equip son spell uniquement quand il recois un coup dans le nez

Re: Détection d'effet magique et conséquences.

Posté : 10 nov. 2012, 20:41
par Gerauld
S'il équipe le sort par défaut à chaque fois que tu en places un autre, ce n'est pas à cause du coup mais à cause de son AI. Le forcer à le lancer au lieu de l"équiper permet de shunter l'AI le temps de lancer le sort.

Il faut maintenant modifier l'event car il ne correspond pas à ce qu'il faut.

Tente un : Event OnCombatStateChanged(Actor akTarget, int aeCombatState)
http://www.creationkit.com/OnCombatStateChanged_-_Actor
Au moins, déjà, le premier sort qu'il lancera sera celui qui correspond à la vulnérabilité de l'adversaire.

Il faudra peut-être tester la line of sight (los) avec un haslos :
http://www.creationkit.com/HasLOS_-_Actor

En gros,
- Dès que je suis en combat (event oncombatstatechanged et test associé)
- J'attends d'avoir l'ennemi en vue (boucle while avec haslos ET AUSSI une condition sur le combatstate (si le combat est fini, la distance avec l'adversaire.. histoire que la boucle ne soit infinie dans aucun cas)
- Test de sa vulnérabilité et envoi du sort qui va bien.

Ce sera déjà un début...

AUTRE METHODE PLUS SIMPLE (VOIE DETOURNEE) :
Sinon, tu mets aucun sort à ton PNJ et tu ne lui ajoutes que celui correspondant à la vulnérabilité détectée (avec un addspell). Il ne pourra lancer que celui-ci du coup.
En l'absence de vulnérabilité, tu lui file un sort par défaut .
A chaque fois, il ne faut pas oublier de retirer ensuite les sorts.

Pour cette méthode, il faut utiliser l'event décrit ci-dessus sans le test de LOS qui est inutile.