210 lines
4.9 KiB
Plaintext
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 |