ActorのおかしくなったSpellをなおす

Modを作ろう

しばらく遊んでいたら、一部のModが動作しなくなりました。自作の自動頭装備脱着や、Wet and Coldの水滴効果、iNeedの水汲みなどです。ニューゲームすると問題がないので、なんとなくですがSpellがおかしくなっ […]

しばらく遊んでいたら、一部の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の水滴が出るようになりました。

タイトルとURLをコピーしました