MissionCommandSkill = class("MissionCommandSkill", MissionCommand) -- Args = { -- targetMapID, -- targetBPID, -- targetPos, -- groupID, -- npcID, -- skillID, -- } local FindNPCRange = 15 local MovingSwitchTargetInterval = 2 local tempVector3 = LuaVector3.zero function MissionCommandSkill:ctor() MissionCommandSkill.super.ctor(self) self.autoBattle = AutoBattle.new() self.targetFilter = function (target) if nil ~= target and not target:IsDead() and not target.data:NoAccessable() then local distance = VectorUtility.DistanceXZ( Game.Myself:GetPosition(), target:GetPosition()) return FindNPCRange > distance end return false end self.nextSwitchTargetTime = 0 end function MissionCommandSkill:Log() local args = self.args LogUtility.InfoFormat("MissionCommandSkill: {0}, {1}", LogUtility.StringFormat("targetMapID={0}, targetBPID={1}, targetPos=({2})", LogUtility.ToString(args.targetMapID), LogUtility.ToString(args.targetBPID), targetPos), LogUtility.StringFormat("npcID={0}, npcUID={1}, groupID={2}", LogUtility.ToString(args.npcID), LogUtility.ToString(args.npcUID), LogUtility.ToString(args.groupID))) end function MissionCommandSkill:AutoBattleOn() end function MissionCommandSkill:AutoBattleOff() if not self.ignoreAutoBattle then self:Shutdown() end end function MissionCommandSkill:AutoBattleLost() self:AutoBattleOff() end function MissionCommandSkill:CurrentTargetValid() return self.targetFilter(self:GetWeakData(1)) end function MissionCommandSkill:SwitchTarget(time, deltaTime) local args = self.args local oldTarget = self:GetWeakData(1) local newTarget = nil if nil ~= args.groupID then newTarget = NSceneNpcProxy.Instance:FindNearestNpcByGroupID( Game.Myself:GetPosition(), args.groupID, self.targetFilter) else newTarget = NSceneNpcProxy.Instance:FindNearestNpc( Game.Myself:GetPosition(), args.npcID, self.targetFilter) end LogUtility.InfoFormat("MissionCommandSkill SwitchTarget: {0} --> {1}", (oldTarget and oldTarget.data:GetName() or "nil"), (newTarget and newTarget.data:GetName() or "nil")) if oldTarget ~= newTarget then self:SetWeakData(1, newTarget) if nil ~= newTarget then Game.Myself:Client_LockTarget(newTarget) -- else -- print(string.format("MissionCommandSkill: target not found, groupID=%s, npcID=%s", -- tostring(args.groupID), tostring(args.npcID))) end end end function MissionCommandSkill:GetTargetPos() local args = self.args local currentMapID = SceneProxy.Instance:GetCurMapID() if currentMapID == args.targetMapID then if nil ~= self.npcPoint then local pos = self.npcPoint.position tempVector3:Set(pos[1],pos[2],pos[3]) return tempVector3 end if nil ~= args.npcUID then local npcPointMap = Game.MapManager:GetNPCPointMap() if nil ~= npcPointMap then self.npcPoint = npcPointMap[args.npcUID] if nil ~= self.npcPoint then local pos = self.npcPoint.position tempVector3:Set(pos[1],pos[2],pos[3]) return tempVector3 end end LogUtility.InfoFormat("MissionCommandSkill: can't find npc by unique id, uID={0}, mapID={1}", args.npcUID, currentMapID) end end return args.targetPos end function MissionCommandSkill:DoLaunch() -- local args = self.args -- local targetPos = self:GetTargetPos() -- self.teleport:Pause() -- if not self.teleport:Launch( -- args.targetMapID, -- args.targetBPID, -- targetPos) then -- LogUtility.InfoFormat("MissionCommandSkill: teleport failed, {0}, {1}", -- LogUtility.StringFormat("targetMapID={0}, targetBPID={1}, targetPos=({2})", -- LogUtility.ToString(args.targetMapID), -- LogUtility.ToString(args.targetBPID), -- targetPos), -- LogUtility.StringFormat("npcID={0}, npcUID={1}, groupID={2}", -- LogUtility.ToString(args.npcID), -- LogUtility.ToString(args.npcUID), -- LogUtility.ToString(args.groupID))) -- if nil ~= args.callback then -- args.callback(self, MissionCommandMove.CallbackEvent.TeleportFailed) -- end -- end self.ignoreAutoBattle = true Game.AutoBattleManager:SetController(self) Game.AutoBattleManager:AutoBattleOff() self.ignoreAutoBattle = false end function MissionCommandSkill:DoShutdown() self.teleport:Shutdown() end function MissionCommandSkill:DoUpdate(time, deltaTime) if Game.Myself.data:NoMove() then if not self.teleport.pausing then self.teleport:Pause() Game.Myself:Logic_StopMove() Game.Myself:Logic_PlayAction_Idle() end return true elseif self.teleport.pausing then self.teleport:Resume() end if self.teleport.running then self.teleport:Update() if not self.teleport.running then Game.Myself:Logic_PlayAction_Idle() end end if not self:CurrentTargetValid() then if self.teleport.running and not self.teleport.pausing then if time > self.nextSwitchTargetTime then self.nextSwitchTargetTime = time + MovingSwitchTargetInterval self:SwitchTarget() end else self:SwitchTarget() end end local args = self.args if self:CurrentTargetValid() then if nil ~= args.skillID then LogUtility.InfoFormat("MissionCommandSkill:UseSkill: {0}", args.skillID) Game.Myself:Client_UseSkill(args.skillID) else self.autoBattle:Update(Game.Myself) Game.AutoBattleManager:AutoBattleOn() end self.teleport:Pause() return true else -- onlyNoTargetAutoCast if nil == args.skillID and self.autoBattle:Attack(Game.Myself, nil, nil, true) then Game.AutoBattleManager:AutoBattleOn() self.teleport:Pause() return true end end if nil ~= self.autoBattle then self.ignoreAutoBattle = true Game.AutoBattleManager:AutoBattleOff() self.ignoreAutoBattle = false end if self.teleport.running then self.teleport:Resume() else local args = self.args local targetPos = self:GetTargetPos() local currentMapID = Game.MapManager:GetMapID() if nil == args.targetMapID or args.targetMapID == currentMapID then if nil ~= targetPos then local myPosition = Game.Myself:GetPosition() local distance = VectorUtility.DistanceXZ(myPosition, targetPos) if 0.01 >= distance then return true end end end if not self.teleport:Launch( args.targetMapID, args.targetBPID, targetPos) then LogUtility.InfoFormat("MissionCommandSkill: teleport failed, {0}, {1}", LogUtility.StringFormat("targetMapID={0}, targetBPID={1}, targetPos=({2})", LogUtility.ToString(args.targetMapID), LogUtility.ToString(args.targetBPID), targetPos), LogUtility.StringFormat("npcID={0}, npcUID={1}, groupID={2}", LogUtility.ToString(args.npcID), LogUtility.ToString(args.npcUID), LogUtility.ToString(args.groupID))) return false end end return true end function MissionCommandSkill:DoConstruct(asArray, args) MissionCommandSkill.super.DoConstruct(self, asArray, args) if nil == self.args.targetMapID then self.args.targetMapID = Game.MapManager:GetMapID() end if nil ~= self.args.targetPos then self.args.targetPos = self.args.targetPos:Clone() end self.teleport = Game.WorldTeleport self:CreateWeakData() end function MissionCommandSkill:DoDeconstruct(asArray) if nil ~= self.args.targetPos then self.args.targetPos:Destroy() end MissionCommandSkill.super.DoDeconstruct(self, asArray) self.teleport = nil self.autoBattle:Reset() Game.AutoBattleManager:ClearController(self, true) end