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;