ようやくというかいまさら発見したのでメモしておきます。
アビリティ(効果時間永続のスペル)を用意します。
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が発火します。