2025-06-04 05:02:57 +08:00

250 lines
7.2 KiB
Plaintext

MissionCommandVisitNpc = class("MissionCommandVisitNpc", MissionCommand)
MissionCommandVisitNpc.TRIGGER_RANGE = 3
-- Args = {
-- targetMapID,
-- realTargetMapID,
-- teleportMapID,
-- targetBPID,
-- targetPos,
-- npcID,
-- npcUID,
-- distance,
-- custom,
-- customDeleter,
-- customType,
-- }
local tempVector3 = LuaVector3.zero
function MissionCommandVisitNpc: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>MissionCommandVisitNpc: </color>can't find npc by unique id, uID={0}, mapID={1}",
args.npcUID, currentMapID)
end
end
return args.targetPos
end
function MissionCommandVisitNpc:Log()
local args = self.args
LogUtility.InfoFormat("MissionCommandVisitNpc: {0}, {1}",
LogUtility.StringFormat("targetMapID={0}, realTargetMapID={1}, targetBPID={2}",
LogUtility.ToString(args.targetMapID),
LogUtility.ToString(args.realTargetMapID),
LogUtility.ToString(args.targetBPID)),
LogUtility.StringFormat("targetPos=({0}), npcID={1}, npcUID={2}",
targetPos,
LogUtility.ToString(args.npcID),
LogUtility.ToString(args.npcUID)))
end
function MissionCommandVisitNpc: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>MissionCommandVisitNpc: </color>teleport failed, {0}, {1}",
LogUtility.StringFormat("targetMapID={0}, realTargetMapID={1}, targetBPID={2}",
LogUtility.ToString(args.targetMapID),
LogUtility.ToString(args.realTargetMapID),
LogUtility.ToString(args.targetBPID)),
LogUtility.StringFormat("targetPos=({0}), npcID={1}, npcUID={2}",
targetPos,
LogUtility.ToString(args.npcID),
LogUtility.ToString(args.npcUID)))
if nil ~= args.callback then
args.callback(self, MissionCommandMove.CallbackEvent.TeleportFailed)
end
else
LogUtility.InfoFormat("<color=green>MissionCommandVisitNpc: </color>{0}, {1}",
LogUtility.StringFormat("targetMapID={0}, realTargetMapID={1}, targetBPID={2}",
LogUtility.ToString(args.targetMapID),
LogUtility.ToString(args.realTargetMapID),
LogUtility.ToString(args.targetBPID)),
LogUtility.StringFormat("targetPos=({0}), npcID={1}, npcUID={2}",
targetPos,
LogUtility.ToString(args.npcID),
LogUtility.ToString(args.npcUID)))
end
end
function MissionCommandVisitNpc:DoShutdown()
self.teleport:Shutdown()
end
function MissionCommandVisitNpc:DoUpdate(time, deltaTime)
local moving = self.teleport.running
local args = self.args
if nil ~= args.realTargetMapID then
local currentMapID = Game.MapManager:GetMapID()
if currentMapID == args.realTargetMapID then
-- arrived real map
if moving then
self.teleport:Shutdown()
Game.Myself:Logic_PlayAction_Idle()
end
return false
end
end
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
self.teleport:Update()
-- self.teleport:Resume()
local currentMapID = Game.MapManager:GetMapID()
if currentMapID == args.targetMapID then
local targetPos = self:GetTargetPos()
if nil == targetPos then
-- wait
return true
end
local arrived = false
local myPosition = Game.Myself:GetPosition()
local distance = VectorUtility.DistanceXZ(myPosition, targetPos)
if MissionCommandVisitNpc.TRIGGER_RANGE > distance then
-- look for npc
local npc = nil
if nil ~= args.npcUID then
local npcs = NSceneNpcProxy.Instance:FindNpcByUniqueId(args.npcUID)
if nil ~= npcs and 0 < #npcs then
npc = npcs[1]
end
else
npc = NSceneNpcProxy.Instance:FindNearestNpc(myPosition, args.npcID)
end
if nil ~= npc then
-- completed
if AccessCustomType.Follow == args.customType then
Game.Myself:Client_AccessTarget(
npc,
args.teleportMapID,
nil,
args.customType)
if nil ~= args.custom and nil ~= args.customDeleter then
args.customDeleter(args.custom)
end
else
Game.Myself:Client_AccessTarget(
npc,
args.custom,
args.customDeleter,
args.customType)
end
args.custom = nil
args.customDeleter = nil
args.customType = nil
return false
end
if nil ~= args.distance then
arrived = args.distance > distance
else
arrived = 0.01 > distance
end
end
if arrived then
-- arrived and wait
if moving then
self.teleport:Shutdown()
Game.Myself:Logic_PlayAction_Idle()
end
else
if not self.teleport.running then
-- move to targetPos
if not self.teleport:Launch(
args.targetMapID,
args.targetBPID,
targetPos) then
LogUtility.InfoFormat("<color=red>MissionCommandVisitNpc: </color>teleport failed, {0}, {1}",
LogUtility.StringFormat("targetMapID={0}, realTargetMapID={1}, targetBPID={2}",
LogUtility.ToString(args.targetMapID),
LogUtility.ToString(args.realTargetMapID),
LogUtility.ToString(args.targetBPID)),
LogUtility.StringFormat("targetPos=({0}), npcID={1}, npcUID={2}",
targetPos,
LogUtility.ToString(args.npcID),
LogUtility.ToString(args.npcUID)))
return false
end
end
end
else
if not self.teleport.running then
-- can't arrive target map
Game.Myself:Logic_PlayAction_Idle()
LogUtility.InfoFormat("<color=red>MissionCommandVisitNpc: </color>teleport failed, {0}, {1}",
LogUtility.StringFormat("targetMapID={0}, realTargetMapID={1}, targetBPID={2}",
LogUtility.ToString(args.targetMapID),
LogUtility.ToString(args.realTargetMapID),
LogUtility.ToString(args.targetBPID)),
LogUtility.StringFormat("targetPos=({0}), npcID={1}, npcUID={2}",
targetPos,
LogUtility.ToString(args.npcID),
LogUtility.ToString(args.npcUID)))
return false
end
end
return true
end
function MissionCommandVisitNpc:DoConstruct(asArray, args)
MissionCommandVisitNpc.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.npcPoint = nil
end
function MissionCommandVisitNpc:DoDeconstruct(asArray)
local args = self.args
if nil ~= args.targetPos then
args.targetPos:Destroy()
end
MissionCommandVisitNpc.super.DoDeconstruct(self, asArray)
self.teleport = nil
self.npcPoint = nil
if nil ~= args.custom and nil ~= args.customDeleter then
args.customDeleter(args.custom)
end
args.custom = nil
args.customDeleter = nil
end