Actions suite à la détection d'effet magique
Actions suite à la détection d'effet magique
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.
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.
Modifié en dernier par Fenrys le 22 nov. 2012, 11:40, modifié 2 fois.
Re: Détection d'effet magique et conséquences.
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

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.
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
Self.EquipSpell(Fireball, 1) etc pour chaque élément
Re: Détection d'effet magique et conséquences.
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.
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.
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
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.
if (akagressor as actor).HasMagicEffect(FireWeakness)
L'event oneffectstart ne sert à rien. Il ne déclenche que dans les scripts d'effets magiques.
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.
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?
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.
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).
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.
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.
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.
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.