2025-06-04 05:12:01 +08:00

270 lines
7.4 KiB
Plaintext

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("<color=green>MissionCommandSkill SwitchTarget: </color>{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("<color=yellow>MissionCommandSkill: target not found, </color>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("<color=red>MissionCommandSkill: </color>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("<color=red>MissionCommandSkill: </color>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("<color=yellow>MissionCommandSkill:UseSkill: </color>{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("<color=red>MissionCommandSkill: </color>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