UGCProjects/GZJ/Script/SimpleSkill/SimpleSkill.lua
2025-01-08 22:46:12 +08:00

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;