Papyrusで排他制御する方法

雑記

ようやくというかいまさら発見したのでメモしておきます。 アビリティ(効果時間永続のスペル)を用意します。 AddSpellは既に持っている場合は無視されるので、プレイヤーに連続でAddSpellしても、2回目以降はイベン […]

ようやくというかいまさら発見したのでメモしておきます。

アビリティ(効果時間永続のスペル)を用意します。

testEffectScript.psc (papyrus)

Scriptname testEffectScript Extends ActiveMagicEffect


Event OnEffectStart(Actor akTarget, Actor akCaster)
    Debug.Trace("OnEffectStart")
EndEvent


Event OnEffectFinish(Actor akTarget, Actor akCaster)
    Debug.Trace("OnEffectFinish")
EndEvent

AddSpellは既に持っている場合は無視されるので、プレイヤーに連続でAddSpellしても、2回目以降はイベントが発火しません。

testAliasPlayerScript.psc (papyrus)

Scriptname testAliasPlayerScript Extends ReferenceAlias

Spell Property aaaSpellTest Auto


Event OnInit()
    Setup()
EndEvent


Event OnPlayerLoadGame()
    Setup()
EndEvent


Function Setup()
    Actor PlayerRef = GetActorReference()

    Utility.Wait(1.0)
    PlayerRef.AddSpell(aaaSpellTest, abVerbose = true)

    Utility.Wait(1.0)
    PlayerRef.AddSpell(aaaSpellTest, abVerbose = true)

    Utility.Wait(1.0)
    PlayerRef.AddSpell(aaaSpellTest, abVerbose = true)

    Utility.Wait(1.0)
    PlayerRef.RemoveSpell(aaaSpellTest)
EndFunction

トレースログを確認すると、それぞれ1回ずつしか出てきません。

[08/13/2020 - 12:52:31AM] OnEffectStart
[08/13/2020 - 12:52:34AM] OnEffectFinish

1回目のAddSpellでOnEffectStartが発火します。2回目以降のAddSpellは無視されて、最後のRemoveSpellにて最初にAddSpellされたアビリティが取り除かれOnEffectFinishが発火します。

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