local Base = require("Battle/Logic/AI/Decision/Decision_Base") local Decision_ChaseUseSkill = class("Decision_ChaseUseSkill", Base) --[[ 初始化 --]] function Decision_ChaseUseSkill:initialize(entity) --类型 self.Type = LuaConst.DecisionType.ChaseUseSkill --瞬时 self.IsOnce = false end --[[ 能否进入 执行条件:有目标,且能释放技能 --]] function Decision_ChaseUseSkill:CanEnter(entity, decisionData, command) if entity.components.target.Target then -- ↓ new 访问统一接口 Decision_Base:CanAiUseSkill local skillBaseComponent = entity.components.skillBase local index = decisionData.IntParam1 local skillData = skillBaseComponent:GetSkillDataBySkillIndex(index) if skillData then return self:CanAiUseSkill(entity, skillBaseComponent, skillData, ConditionManager.GetConditionDataTree(skillData.AutoBattleCondition)) else return false end -- ↑ new -- ↓ old 现在改为了访问统一接口 Decision_Base:CanAiUseSkill -- local skillBaseComponent = entity.components.skillBase -- local index = decisionData.IntParam1 -- local buffComponent = entity.components.buff -- if buffComponent.CurrentBuffStates:Get(LuaConst.SpecialBuffs.CanSkill) then -- -- old↓ -- --local skillData = skillBaseComponent.CurSkillDataList[index] -- CurSkillDataList 只记录了大部分的skillid,小部分由于scenetype删除了 ,所以存在问题:index不一定是excel配置技能index -- -- old↑ -- -- new↓ 已经修复了上面的问题 -- local skillData = skillBaseComponent:GetSkillDataBySkillIndex(index) -- -- new↑ -- if skillData then -- return skillBaseComponent:CanUseSkill(skillData) -- end -- end -- old↑ end return false end --[[ 能否退出 完成条件:技能后摇时间到,或者失去目标 --]] function Decision_ChaseUseSkill:CanExit(entity, decisionData, command) if not entity.components.target.Target then return true end local skillBaseComponent = entity.components.skillBase -- new↓ 增加判断,如果从未使用过技能,则不退出Decision。(之前没用过技能,也会退出decision,比如处于虚弱状态时) local decisionRecordDic = entity.components.aiBase:GetDecisionRecordDic(decisionData) local skillData = decisionRecordDic.skillData if skillData ~= nil then if not decisionRecordDic.skillUsed then if skillBaseComponent.CurSkillData then decisionRecordDic.skillUsed = skillData.BelongTo == skillBaseComponent.CurSkillData.BelongTo end end if not decisionRecordDic.skillUsed then return false end else logging.error(LTAG.ERROR, "HYW : skillData nil Error Id : ", decisionData.IntParam1) return true end -- new↑ if skillBaseComponent.CanSwitchAll then if skillBaseComponent.CurSkillData then if skillBaseComponent.CurSkillData.AutoNextID > 0 then return false else return skillData.BelongTo == skillBaseComponent.CurSkillData.BelongTo end else return true end end return false end --[[ 进入该Decision --]] function Decision_ChaseUseSkill:DecisionIn(entity, decisionData) local skillData = entity.components.skillBase:GetSkillDataBySkillIndex(decisionData.IntParam1) --logging.error(LTAG.ERROR, "HYW : UseSkill : ", skillData.KeyPosition, " entityId : ", entity._logicInitData.EntityID) local decisionRecordDic = entity.components.aiBase:GetDecisionRecordDic(decisionData) decisionRecordDic.skillUsed = false decisionRecordDic.skillData = skillData local findPathInterval = tonumber(decisionData.StringParam1) if findPathInterval then decisionRecordDic.findPathInterval = findPathInterval end Base.DecisionIn(self,entity, decisionData) if decisionData.IntParam2 == 0 then return end local pos = FP.newV2(decisionData.IntParam3 / 10,decisionData.IntParam4 / 10) SystemManager.OnSetSkillAimPos(entity, pos) SystemManager.SetSkillMissilePos(entity, pos) end --[[ 退出该Decision --]] function Decision_ChaseUseSkill:DecisionOut(entity, decisionData) Base.DecisionOut(self,entity, decisionData) if decisionData.IntParam2 == 0 then return end SystemManager.OnSetSkillAimPos(entity, nil) SystemManager.SetSkillMissilePos(entity, nil) entity.components.aiBase:ClearDecisionRecord(decisionData) end --[[ 输出指令 --]] function Decision_ChaseUseSkill:SetCommand(entity, decisionData, command) local skillData = entity.components.skillBase:GetSkillDataBySkillIndex(decisionData.IntParam1) local castRadiusNum = FP.tonumberV1(skillData.CastRadius) if Decision_ChaseUseSkill:IsToTargetDisSqrLess(entity,decisionData,castRadiusNum * castRadiusNum) then command.SkillIndex = decisionData.IntParam1 else --每隔decisionRecordDic.findPathInterval重新寻一次路并跑向目标 local decisionRecordDic = entity.components.aiBase:GetDecisionRecordDic(decisionData) self:IntervalFindPath(entity, decisionData, command,decisionRecordDic.findPathInterval,entity.components.target.Target) return self:RunToPathPoint(entity, command,decisionData) end return command end return Decision_ChaseUseSkill