しばらく遊んでいたら、一部のModが動作しなくなりました。自作の自動頭装備脱着や、Wet and Coldの水滴効果、iNeedの水汲みなどです。ニューゲームすると問題がないので、なんとなくですがSpellがおかしくなったのかなぁと思い、自動頭装備脱着のSpellをコンソールからremovespell、addspellとして再習得させてみたところ、動作するようになりました。どうやらAbilityで持たせているMagic Effectがなんかの拍子に動作しなくなってしまうようです。
Actorでスクリプトを実行する方法は、QuestのReference Aliasにぶち込んで動かすか、Spellを配布してMagic Effectとして動かすかになります。Actor自身に持たせる方法もありますが、これは本当にActor決め打ちです。
Magic Effectの場合、SpellをAbilityとして恒久的な効果として常時発動させたり、SpellのConditionで条件を指定して特定状況下で発動させたりします。不特定多数のActorにスクリプトを配布できるのが利点です。ただ、これをプレイヤーやフォロワーに持たせても、なんかの拍子に発動しなくなってしまうらしい、というのが今回の問題です。
Reference Aliasの方は効果という概念がないので切れる心配がなく、動作しなくなるなんてことはおそらくないでしょう。プレイヤーやフォロワーなど、対象がだいたい決まっている場合は、こちらの方がよさそうです。
さて、なぜ動かなくなるのかは不明ですが、動かなくなったSpellをなんとかするために、Modを作ってみました。
776 (papyrus)
Scriptname eqEffectRefreshSpellsScript Extends ActiveMagicEffect
Event OnEffectStart(Actor akTarget, Actor akCaster)
Actor TargetRef = Game.GetCurrentCrosshairRef() as Actor
Actor PlayerRef = Game.GetPlayer()
if !TargetRef
TargetRef = PlayerRef
endif
Int iLength = TargetRef.GetSpellCount()
Int iIndex
while iIndex < iLength
; get spell
Spell kSpell = TargetRef.GetNthSpell(iIndex)
Debug.Trace(iIndex + "/" + iLength + " " + kSpell + " " + kSpell.GetName())
; remove
TargetRef.RemoveSpell(kSpell)
Utility.Wait(0.5)
; add
TargetRef.AddSpell(kSpell, abVerbose = false)
; abort check
if PlayerRef.IsSneaking()
Debug.Notification("Aborted")
return
endif
Utility.Wait(0.5)
iIndex += 1
endwhile
Debug.Notification("Done")
EndEvent
アクターが習得しているSpellの一覧を取得するの応用になります。これを実行したところ、無事にWet and Coldの水滴が出るようになりました。