178 lines
5.1 KiB
Lua
178 lines
5.1 KiB
Lua
|
local SimpleSkillTaskFactory = require("Script.SimpleSkill.Factory.SimpleSkillTaskFactory")
|
||
|
local SimpleSkillSelectorFactory = require("Script.SimpleSkill.Factory.SimpleSkillSelectorFactory")
|
||
|
local SimpleSkillCastConditionFactory = require("Script.SimpleSkill.Factory.SimpleSkillCastConditionFactory")
|
||
|
-- 简单技能类
|
||
|
local SimpleSkill = LuaClass("SimpleSkill")
|
||
|
|
||
|
SimpleSkill.SkillName = -1
|
||
|
SimpleSkill.CasterPawn = nil
|
||
|
SimpleSkill.OwnerSkillSystemComponent = nil
|
||
|
|
||
|
SimpleSkill.IsReady = true
|
||
|
SimpleSkill.SkillType = ESkillType.Active
|
||
|
SimpleSkill.EnergyCost = 0
|
||
|
SimpleSkill.CoolDownDuration = 0
|
||
|
SimpleSkill.CoolDownTimer = 0
|
||
|
SimpleSkill.bEndSkill = false
|
||
|
SimpleSkill.NeedCheckTargetBeforeCast = false
|
||
|
|
||
|
SimpleSkill.Task = nil
|
||
|
SimpleSkill.Selector = nil
|
||
|
|
||
|
--- 技能释放的目标
|
||
|
SimpleSkill.TargetPawns = {}
|
||
|
|
||
|
--- 用来设置额外的技能条件
|
||
|
SimpleSkill.CasterConditionList = {}
|
||
|
|
||
|
-- 技能等级
|
||
|
SimpleSkill.SkillLevel = 1
|
||
|
SimpleSkill.MaxSkillLevel = 4
|
||
|
|
||
|
|
||
|
function SimpleSkill:ctor(CasterPawn)
|
||
|
self.CasterPawn = CasterPawn
|
||
|
self.OwnerSkillSystemComponent = self.CasterPawn.SkillSystemComponent
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:SetSkillSystemComponent(SSC)
|
||
|
self.OwnerSkillSystemComponent = SSC;
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:GetSkillItemID()
|
||
|
if self.SkillName <= 0 then
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
return 20000 + self.SkillName * 100 + self.SkillLevel * 10
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:InitConfig(SkillData)
|
||
|
self.SkillType = SkillData.SkillType
|
||
|
self.CoolDownDuration = SkillData.CoolDownDuration
|
||
|
self.EnergyCost = SkillData.EnergyCost
|
||
|
self.NeedCheckTargetBeforeCast = SkillData.NeedCheckTargetBeforeCast
|
||
|
|
||
|
local TaskClass = SimpleSkillTaskFactory.GetTaskBySkillName(self.SkillName)
|
||
|
self.Task = TaskClass.New(self)
|
||
|
self.Task:InitTaskFromData(SkillData.TaskData, self.CasterPawn)
|
||
|
self.Task:UpdateSkillLevel(self.SkillLevel)
|
||
|
|
||
|
local SelectorClass = SimpleSkillSelectorFactory.GetSelectorByType(SkillData.SelectorData.SelectorType)
|
||
|
self.Selector = SelectorClass.New()
|
||
|
self.Selector:InitSelectorFromData(SkillData.SelectorData, self.CasterPawn)
|
||
|
|
||
|
self.CasterConditionList = {}
|
||
|
for k, ConditionType in pairs(UE.ToTable(SkillData.Conditions)) do
|
||
|
local Condition = SimpleSkillCastConditionFactory.GetConditionByType(ConditionType)
|
||
|
if Condition ~= nil then
|
||
|
table.insert(self.CasterConditionList, Condition)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if self.SkillType == ESkillType.Passive then --若是被动技能,初始化后直接运行
|
||
|
self:CastSkill()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:IsReadyToCastSkill()
|
||
|
-- 还在CD阶段就直接返回false
|
||
|
if not self.IsReady then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- 技能条件不满足返回false
|
||
|
for i, v in pairs(self.CasterConditionList) do
|
||
|
if v:Check(self.CasterPawn) == false then
|
||
|
UE.Log("[SimpleSkill:IsReadyToCastSkill] CastCondition failed")
|
||
|
NoticeTipsTools.ServerGeneralNoticeTips(self.CasterPawn.PlayerKey, "技能条件不满足")
|
||
|
return false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 能量值不够返回false
|
||
|
if self.CasterPawn:GetCurEnergy() < self.EnergyCost then
|
||
|
NoticeTipsTools.ServerGeneralNoticeTips(self.CasterPawn.PlayerKey, "能量值不足")
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- 没有可用目标则返回false
|
||
|
if self.NeedCheckTargetBeforeCast == true then
|
||
|
self.TargetPawns = self:GetTargetPawns()
|
||
|
if table.isEmpty(self.TargetPawns) then
|
||
|
NoticeTipsTools.ServerGeneralNoticeTips(self.CasterPawn.PlayerKey, "无可施法目标")
|
||
|
return false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:CastSkill()
|
||
|
UE.Log("[Skill][CastSkill] SkillName:%s, Begin", self.SkillName)
|
||
|
if self.SkillType == ESkillType.Active then
|
||
|
self.IsReady = false
|
||
|
self.bEndSkill = false
|
||
|
self.CoolDownTimer = self.CoolDownDuration
|
||
|
|
||
|
if self.EnergyCost > 0.001 then
|
||
|
self.CasterPawn:ConsumeEnergy(self.EnergyCost)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self:InternalCastSkill()
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:InternalCastSkill()
|
||
|
-- 执行任务
|
||
|
self.Task:ActivateTask()
|
||
|
end
|
||
|
|
||
|
-- 结束技能
|
||
|
function SimpleSkill:EndSkill()
|
||
|
self.Task:EndTask()
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:OnTick(DeltaTime)
|
||
|
if not self.IsReady then
|
||
|
self.CoolDownTimer = self.CoolDownTimer - DeltaTime
|
||
|
if self.CoolDownTimer <= 0 then
|
||
|
self.IsReady = true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:SetSkillLevel(NewSkillLevel)
|
||
|
UE.Log("[SimpleSkill] Set Skill Level: %s", NewSkillLevel);
|
||
|
|
||
|
NewSkillLevel = math.min(NewSkillLevel, self.MaxSkillLevel);
|
||
|
self.SkillLevel = NewSkillLevel;
|
||
|
|
||
|
self:OnSkillLevelChanged(NewSkillLevel);
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:GetSkillLevel()
|
||
|
return self.SkillLevel;
|
||
|
end
|
||
|
|
||
|
--- 技能等级变化引起的其他逻辑
|
||
|
--- 例如改变技能CD
|
||
|
function SimpleSkill:OnSkillLevelChanged(NewSkillLevel)
|
||
|
if self.Task ~= nil then
|
||
|
self.Task:UpdateSkillLevel(NewSkillLevel)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:ResetSkillCD()
|
||
|
self.CoolDownTimer = 0
|
||
|
end
|
||
|
|
||
|
function SimpleSkill:GetTargetPawns()
|
||
|
if self.Selector then
|
||
|
return self.Selector:GetTargetPawns()
|
||
|
end
|
||
|
|
||
|
return nil
|
||
|
end
|
||
|
|
||
|
return SimpleSkill;
|