local Base = require("Battle/Logic/AI/Decision/Decision_Base") local Decision_RunToTarget = class("Decision_RunToTarget", Base) --[[ 初始化 --]] function Decision_RunToTarget:initialize(entity) --类型 self.Type = LuaConst.DecisionType.RunToTarget --瞬时 self.IsOnce = false end function Decision_RunToTarget:CanEnter(entity, decisionData, command) return entity.components.target.Target end --[[ 能否退出 完成条件:移动到距目标的 IntParam1米 内 --]] function Decision_RunToTarget:CanExit(entity, decisionData, command) -- local comp_Target = entity.components.target -- local target = comp_Target.Target -- if target then -- return FP.LessEquals(comp_Target.ToTargetDisSqr, decisionData.IntParam1 * decisionData.IntParam1) -- else -- return true -- end if decisionData.IntParam4 > 0 then local enterFrame = entity.components.aiBase:GetDecisionRecord(decisionData, "Decision_RunToTarget_EnterFrame") local timeEla = (LogicUpdateManager._clientHandleFrame - enterFrame) * LuaConst.TimeSpanMs if timeEla > decisionData.IntParam4 then return true end end if entity.components.target.Target then --decisionData.IntParam3是横向偏移 if decisionData.IntParam3 ~= 0 and entity.components.aiBase:GetDecisionRecord(decisionData, "Decision_RunToTarget_HasFindPath") and #entity.components.path.Path == 0 then --如果横向偏移不为0,且寻过路,且寻路结果为空(即找不到路径), 则直接退出该行为 return true else local targetPos = entity.components.aiBase:GetDecisionRecord(decisionData,"findPathTargetPos") if targetPos then return not FP.V2.IsDistanceSqrGreater(entity:GetLogicPos(), targetPos, decisionData.IntParam1 * decisionData.IntParam1) else return Decision_RunToTarget:IsToTargetDisSqrLess(entity,decisionData,decisionData.IntParam1 * decisionData.IntParam1) end end else return true end end function Decision_RunToTarget:DecisionIn(entity, decisionData) Base.DecisionIn(self, entity, decisionData) entity.components.aiBase:SetDecisionRecord(decisionData, "Decision_RunToTarget_EnterFrame", LogicUpdateManager._clientHandleFrame) end --[[ 输出指令 --]] function Decision_RunToTarget:SetCommand(entity, decisionData, command) if not self:CanExit(entity, decisionData, command) then -- old -- local lastFindPathFrame = entity.components.aiBase:GetDecisionRecord(decisionData,"lastFindPathFrame") or -99999 -- --每隔2s重新寻一次路 -- local passFrame = LogicUpdateManager._clientHandleFrame - lastFindPathFrame -- local passTime = passFrame * LuaConst.TimeSpanMs -- if passTime >= 2000 then -- entity.components.aiBase:SetDecisionRecord(decisionData,"lastFindPathFrame",LogicUpdateManager._clientHandleFrame) -- local target = entity.components.target.Target -- if target then -- SystemManager.FindPath(entity, target.components.move.LogicPos, true) -- end -- end -- return self:RunToPathPoint(entity, command,decisionData) --每隔decisionData.IntParam2毫秒重新寻一次路 self:IntervalFindPath(entity, decisionData, command, decisionData.IntParam2, entity.components.target.Target, nil, nil, decisionData.IntParam3) entity.components.aiBase:SetDecisionRecord(decisionData, "Decision_RunToTarget_HasFindPath", true) return self:RunToPathPoint(entity, command,decisionData) else return command end end return Decision_RunToTarget