enderalse/source/scripts/_00e_game_talentcontrolsc.psc

116 lines
3.2 KiB
Plaintext

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()
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.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
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