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() If self == PlayerREF GoToState("RealPlayer") RegisterForActions() EndIf EndEvent Event OnPlayerLoadGame() If self == PlayerREF ; A check just in case. Most likely this condition is always True RegisterForActions() 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.GetValue() != 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 ;===================================================================================== ; 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