2025-06-04 05:02:57 +08:00

210 lines
4.9 KiB
Plaintext

SkillFreeCast = class("SkillFreeCast", ReusableObject)
SkillFreeCast.PoolSize = 5
local CreatureHideOpt = Asset_Effect.DeActiveOpt.CreatureHide
local Idle = Asset_Role.ActionName.Idle
local FindCreature = SceneCreatureProxy.FindCreature
local tempArgs = {
[1] = nil, -- skillid,
[2] = nil, -- castTime,
[3] = nil, -- targetCreatureGUID,
[4] = nil, -- skillPhaseData,
}
local tempEffectArray = {}
function SkillFreeCast.GetArgs(creature, skillInfo)
tempArgs[1] = skillInfo:GetSkillID()
tempArgs[2] = skillInfo:GetCastInfo(creature)
tempArgs[3] = creature.skill.targetCreatureGUID
tempArgs[4] = creature.skill.phaseData:Clone()
return tempArgs
end
function SkillFreeCast.Create(args)
return ReusableObject.Create(SkillFreeCast, true, args)
end
function SkillFreeCast:ctor()
self.effects = {}
self.ses = {}
end
function SkillFreeCast:Update(time, deltaTime, creature)
if not self.running then
return
end
if self.phaseData:GetSkillPhase() == SkillPhase.None then
self:_SwitchToFreeCast(creature)
end
if not self:Update_FreeCast(time, deltaTime, creature) then
return
end
self.castTimeElapsed = self.castTimeElapsed + deltaTime
if self.castTime < self.castTimeElapsed then
self:_SwitchToAttack(creature)
end
end
function SkillFreeCast:Update_FreeCast(time, deltaTime, creature)
if creature.assetRole:IsPlayingAction(Idle) then
self.info.LogicClass.CastPlayAction(self, creature)
if self.targetCreatureGUID ~= 0 then
local targetCreature = FindCreature(self.targetCreatureGUID)
if targetCreature ~= nil then
creature.logicTransform:LookAt(targetCreature:GetPosition())
end
else
creature.logicTransform:LookAt(self.phaseData:GetPosition())
end
end
return true
end
function SkillFreeCast:_SwitchToFreeCast(creature)
self.phaseData:SetSkillPhase(SkillPhase.FreeCast)
if self.info.LogicClass.FreeCast(self, creature) then
self:_OnPhaseChanged(creature)
else
self:_End(creature)
end
end
function SkillFreeCast:_SwitchToNone(creature)
self.phaseData:SetSkillPhase(SkillPhase.None)
self:_End(creature)
end
function SkillFreeCast:_SwitchToAttack(creature)
self.phaseData:SetSkillPhase(SkillPhase.Attack)
self:_End(creature)
end
function SkillFreeCast:InterruptCast(creature)
if self.running and self.phaseData:GetSkillPhase() == SkillPhase.FreeCast then
self.phaseData:SetSkillPhase(SkillPhase.None)
self:_End(creature)
end
end
function SkillFreeCast:AddEffect(effect)
if self.visible == false and effect ~= nil then
effect:SetActive(self.visible, CreatureHideOpt)
end
TableUtility.ArrayPushBack(self.effects, effect)
effect:RegisterWeakObserver(self)
end
function SkillFreeCast:AddSE(se)
TableUtility.ArrayPushBack(self.ses, se)
end
function SkillFreeCast:SetEffectVisible(visible)
if self.visible ~= visible then
self.visible = visible
local effect
for i=1,#self.effects do
effect = self.effects[i]
if effect ~= nil then
effect:SetActive(self.visible, CreatureHideOpt)
end
end
end
end
function SkillFreeCast:GetSkillID()
return self.info:GetSkillID()
end
function SkillFreeCast:_OnPhaseChanged(creature)
local newPhase = self.phaseData:GetSkillPhase()
if self.oldPhase == newPhase then
return
end
if SkillPhase.FreeCast == newPhase then
self:_OnLaunch(creature)
creature:Logic_FreeCastBegin()
else
if SkillPhase.FreeCast == self.oldPhase then
creature:Logic_FreeCastEnd()
end
end
self.oldPhase = newPhase
end
function SkillFreeCast:_OnLaunch(creature)
local skillName = self.info:GetSpeakName(creature)
if nil == skillName then
return
end
local sceneUI = creature:GetSceneUI()
if nil ~= sceneUI then
sceneUI.roleTopUI:Speak(skillName)
end
end
function SkillFreeCast:_End(creature)
self:_Clear(creature)
self.running = false
self:_OnPhaseChanged(creature)
end
function SkillFreeCast:_DestroyEffects(creature)
TableUtility.ArrayShallowCopy(tempEffectArray, self.effects)
TableUtility.ArrayClear(self.effects)
for i=#tempEffectArray, 1, -1 do
tempEffectArray[i]:Destroy()
tempEffectArray[i] = nil
end
end
function SkillFreeCast:_DestroySEs(creature)
for i=#self.ses, 1, -1 do
self.ses[i]:Stop()
self.ses[i] = nil
end
end
function SkillFreeCast:_Clear(creature)
self:_DestroyEffects(creature)
self:_DestroySEs(creature)
end
-- override begin
function SkillFreeCast:DoConstruct(asArray, args)
self.running = true
self.visible = true
self.castTimeElapsed = 0
self.oldPhase = SkillPhase.None
self.info = Game.LogicManager_Skill:GetSkillInfo(args[1])
self.castTime = args[2]
self.targetCreatureGUID = args[3]
self.phaseData = args[4]
self.phaseData:SetSkillPhase(self.oldPhase)
end
function SkillFreeCast:DoDeconstruct(asArray)
self.running = nil
self.visible = nil
self.castTimeElapsed = nil
self.oldPhase = nil
self.info = nil
self.castTime = nil
self.targetCreatureGUID = nil
if self.phaseData ~= nil then
self.phaseData:Destroy()
self.phaseData = nil
end
self:_Clear()
end
-- override end