Scriptname _00E_Game_TalentControlSC extends Actor {Controls animation behaviour for all talents} ;===================================================================================== ; FUNCTIONS ;===================================================================================== Function RegisterForActions() RegisterForActorAction(3) RegisterForActorAction(4) EndFunction ; Called by the magic effect (_00E_Game_TalentCooldownSC) Function RegisterCooldownMagicEffect(_00E_Game_TalentCooldownSC newCooldownMagicEffect) CooldownMagicEffect = newCooldownMagicEffect EndFunction Function RefreshCooldownSpell() ; The order of operation below is probably the most race-condition-safe one (see the comment in OnUpdate) RegisterForSingleUpdate(2) RemoveSpell(_00E_Game_AbTalentCooldown) _00E_Game_TalentControl_CooldownResetDesired.SetValue(1) CooldownMagicEffect = None EndFunction Function SetTalentRecoveryTime(Shout talent, Float newRecoveryTime) If CooldownMagicEffect CooldownMagicEffect.SetShoutRecoveryTime(talent, newRecoveryTime) Else SetVoiceRecoveryTime(newRecoveryTime) EndIf EndFunction ;===================================================================================== ; EVENTS ;===================================================================================== Event OnInit() OnPlayerLoadGame() EndEvent Event OnPlayerLoadGame() If SKSE.GetVersion() if self == PlayerREF if GetState() != "RealPlayer" GoToState("RealPlayer") endif RegisterForActions() if CooldownMagicEffect == None || CooldownMagicEffect as String == "[_00E_Game_TalentCooldownSC ]" RefreshCooldownSpell() endif endif else Debug.Trace("NO SKSE: individual shout cooldowns are disabled") if GetState() != "Disabled" GoToState("Disabled") endif EndIf EndEvent State RealPlayer Event OnUpdate() ; This OnUpdate is triggered by RegisterForUpdates in other scripts attached to the player, e.g. in _00E_EPUpdateFunctions. ; So we must be cautious here. If (CooldownMagicEffect == None && _00E_Game_TalentControl_CooldownResetDesired.GetValueInt() != 0) _00E_Game_TalentControl_CooldownResetDesired.SetValue(0) AddSpell(_00E_Game_AbTalentCooldown, False) EndIf EndEvent Event OnActorAction(int actionType, Actor akActor, Form source, int slot) Shout shoutUsed = source as Shout if(!shoutUsed) return EndIf If actionType == 3 LastShoutUsed = shoutUsed EndIf EndEvent Event OnSpellCast(Form maybeSpell) If(!LastShoutUsed) return EndIf Spell castSpell = maybeSpell as Spell If castSpell If (castSpell == LastShoutUsed.GetNthSpell(0) || castSpell == LastShoutUsed.GetNthSpell(1) || castSpell == LastShoutUsed.GetNthSpell(2)) LastShoutUsed = None CooldownMagicEffect.OnShoutCast() EndIf EndIf EndEvent EndState state Disabled ; Do nothing endstate ;===================================================================================== ; PROPERTIES ;===================================================================================== Actor Property PlayerREF Auto Spell Property _00E_Game_AbTalentCooldown Auto GlobalVariable Property _00E_Game_TalentControl_CooldownResetDesired Auto _00E_Game_TalentCooldownSC CooldownMagicEffect = None Shout LastShoutUsed = None