autoImport ("EnviromentManager")
autoImport ("AreaTriggerManager")
autoImport ("DungeonManager")
autoImport ("LockTargetEffectManager")
autoImport ("FunctionScenicSpot")
autoImport ("ClickGroundEffectManager")
autoImport ("SkillWorkerManager")
autoImport ("DynamicObjectManager")
autoImport ("CullingObjectManager")
autoImport ("SceneSeatManager")
autoImport ("QuestMiniMapEffectManager")
autoImport ("PlotStoryManager")
autoImport ("HandUpManager");
autoImport ("PictureWallManager");
autoImport ("WeddingWallPicManager");
MapManager = class("MapManager")
MapManager.Mode = {
PVE = 1,
PVP = 2,
Raid = 3
}
-- MapInfo = {
-- [1] = ID, -- int
-- [2] = name, -- string or nil
-- [3] = bornPosition, -- LuaVector3
-- [4] = preview, -- bool or nil
-- [5] = creatureMaskDistanceLevel,
-- [6] = raidID,
-- }
function MapManager:ctor()
self.mapInfo = {0,nil,LuaVector3.zero,false,0}
self.enviromentManager = EnviromentManager.new()
self.areaTriggerManager = AreaTriggerManager.new()
self.dungeonManager = DungeonManager.new()
self.lockTargetEffectManager = LockTargetEffectManager.new()
self.clickGroundManager = ClickGroundEffectManager.new()
self.skillWorkerManager = SkillWorkerManager.new()
self.dynamicObjectManager = DynamicObjectManager.new()
self.cullingObjectManager = CullingObjectManager.new()
self.sceneSeatManager = SceneSeatManager.new()
self.questMiniMapEffectManager = QuestMiniMapEffectManager.new()
self.plotStoryManager = PlotStoryManager.new()
self.handUpManager = HandUpManager.new()
self.pictureWallManager = PictureWallManager.new()
self.weddingWallPicManager = WeddingWallPicManager.new()
self.scenicManager = FunctionScenicSpot.Me()
-- set global objects
Game.EnviromentManager = self.enviromentManager
Game.AreaTriggerManager = self.areaTriggerManager
Game.DungeonManager = self.dungeonManager
Game.LockTargetEffectManager = self.lockTargetEffectManager
Game.ClickGroundEffectManager = self.clickGroundManager
Game.SkillWorkerManager = self.skillWorkerManager
Game.DynamicObjectManager = self.dynamicObjectManager
Game.CullingObjectManager = self.cullingObjectManager
Game.SceneSeatManager = self.sceneSeatManager
Game.QuestMiniMapEffectManager = self.questMiniMapEffectManager
Game.PlotStoryManager = self.plotStoryManager
Game.HandUpManager = self.handUpManager
Game.PictureWallManager = self.pictureWallManager
Game.WeddingWallPicManager = self.weddingWallPicManager
self:_Reset()
end
function MapManager:_Reset()
self.sceneInfo = nil
self.mode = nil
self.sceneAnimation = nil
self.sceneAnimationAnimator = nil
self.sceneAnimationPlaying = false
self.running = false
self.diableInput = false
self.sceneAnimationShutdownTime = -1;
end
function MapManager:SetInputDisable(disable)
if self.diableInput == disable then
return
end
self.diableInput = disable
Game.InputManager.disable = disable
LogUtility.InfoFormat("SetInputDisable: {0}",
disable)
end
function MapManager:GetMapID()
return self.mapInfo[1]
end
function MapManager:GetRaidID()
return self.mapInfo[6]
end
function MapManager:GetMapName()
return self.mapInfo[2]
end
function MapManager:SetMapName(serverData)
self.mapInfo[2] = serverData.mapName
end
function MapManager:GetCreatureMaskRange()
return self.mapInfo[5]
end
function MapManager:GetSceneInfo()
return self.sceneInfo
end
function MapManager:GetMode()
return self.mode
end
function MapManager:IsPVEMode()
return MapManager.Mode.PVE == self.mode
end
function MapManager:IsPVPMode()
return MapManager.Mode.PVP == self.mode or self.dungeonManager:IsPVPRaidMode()
end
function MapManager:IsPVPMode_GVGDetailed()
return self.dungeonManager:IsGVG_Detailed()
end
function MapManager:IsPVPMode_PoringFight()
return self.dungeonManager:IsPVPMode_PoringFight();
end
function MapManager:IsPVPMode_MvpFight()
return self.dungeonManager:IsPVPMode_MvpFight();
end
function MapManager:IsPVPMode_TeamPws()
return self.dungeonManager:IsPVPMode_TeamPws();
end
function MapManager:IsPveMode_PveCard()
return self.dungeonManager:IsPveMode_PveCard();
end
function MapManager:IsPveMode_AltMan()
return self.dungeonManager:IsPveMode_AltMan();
end
function MapManager:IsGvgMode_Droiyan()
return self.dungeonManager:IsGvgMode_Droiyan();
end
function MapManager:IsRaidMode()
return MapManager.Mode.Raid == self.mode
end
function MapManager:IsNoSelectTarget()
return self.dungeonManager:IsNoSelectTarget()
end
function MapManager:IsEndlessTower()
if self:IsRaidMode() then
return self.dungeonManager:IsEndlessTower()
end
return false
end
function MapManager:GetBornPointArray()
return self.sceneInfo and self.sceneInfo.bps or nil
end
function MapManager:GetExitPointArray()
return self.sceneInfo and self.sceneInfo.eps or nil
end
function MapManager:GetNPCPointArray()
return self.sceneInfo and self.sceneInfo.nps or nil
end
function MapManager:GetBornPointMap()
return self.sceneInfo and self.sceneInfo.bpMap or nil
end
function MapManager:GetExitPointMap()
return self.sceneInfo and self.sceneInfo.epMap or nil
end
function MapManager:GetNPCPointMap()
return self.sceneInfo and self.sceneInfo.npMap or nil
end
function MapManager:FindBornPoint(ID)
local map = self:GetBornPointMap()
return map and map[ID] or nil
end
function MapManager:FindExitPoint(ID)
local map = self:GetExitPointMap()
return map and map[ID] or nil
end
function MapManager:FindNPCPoint(ID)
local map = self:GetNPCPointMap()
return map and map[ID] or nil
end
function MapManager:SetCurrentMap(serverData, force)
local currentMapID = self.mapInfo[1]
local currentRaidID = self.mapInfo[6]
local mapID = serverData.mapID
local raidID = serverData.dmapID
if not force
and currentMapID == mapID
and currentRaidID == raidID then
return
end
-- 1. shutdown
self:Shutdown()
-- 2. set
local staticData = Table_Map[mapID]
local mode = staticData.Mode
local sceneName = staticData.NameEn
local sceneInfo = autoImport("Scene_"..sceneName)
local scenePartInfo = nil
if MapManager.Mode.PVE == mode then
LogUtility.InfoFormat("Switch Map PVE: {0}",
mapID)
scenePartInfo = sceneInfo.PVE
elseif MapManager.Mode.PVP == mode then
LogUtility.InfoFormat("Switch Map PVP: {0}",
mapID)
scenePartInfo = sceneInfo.PVP
elseif MapManager.Mode.Raid == mode then
LogUtility.InfoFormat("Switch Map Raid: {0}, {1}",
mapID, raidID)
scenePartInfo = sceneInfo.Raids[raidID]
end
if nil ~= scenePartInfo then
Game.DoPreprocess_ScenePartInfo(scenePartInfo)
end
self.mapInfo[1] = mapID
self.mapInfo[2] = serverData.mapName
ProtolUtility.Better_S2C_Vector3(serverData.pos, self.mapInfo[3])
self.mapInfo[4] = (nil ~= serverData.preview and 0 ~= serverData.preview)
local creatureMaskRange = staticData.MapUi or 0
if 0 < creatureMaskRange then
self.mapInfo[5] = Game.CullingObjectManager:DistanceToLevel(creatureMaskRange)
else
self.mapInfo[5] = 99999
end
self.mapInfo[6] = raidID
LogUtility.InfoFormat("Creature Mask Range: {0}, {1}",
self.mapInfo[5], creatureMaskRange)
Game.AreaTrigger_ExitPoint:SetInvisibleEPs(serverData.invisiblexit)
self.mode = mode
self.sceneInfo = scenePartInfo
Game.Myself.data:ResetRandom()
end
function MapManager:SetEnviroment(enviromentID, duration)
self.enviromentManager:SetBaseInfo(enviromentID, duration)
end
function MapManager:SetSceneAnimation(a)
self.sceneAnimation = a
if nil ~= a then
self.sceneAnimationAnimator = a.animator
else
self.sceneAnimationAnimator = nil
end
end
function MapManager:Previewing()
return self.sceneAnimationPlaying
end
function MapManager:StartPreview()
if nil ~= self.sceneAnimation and self.sceneAnimationShutdownTime < 0 then
self.sceneAnimation:Play()
return true
end
return false
end
function MapManager:StopPreview()
if nil ~= self.sceneAnimation then
self.sceneAnimation:Stop()
end
end
function MapManager:SceneAnimationLaunch(animName, time)
if(self.sceneAnimationPlaying)then
return;
end
if(self.sceneAnimationAnimator == nil)then
return;
end
if(time > 0)then
self.sceneAnimationShutdownTime = Time.time + time;
else
self.sceneAnimationShutdownTime = 0;
end
local cameraController = CameraController.singletonInstance
if(cameraController ~= nil)then
GameObjectUtil.SetBehaviourEnabled(cameraController , false);
cameraController.updateCameras = true;
end
GameObjectUtil.SetBehaviourEnabled(self.sceneAnimationAnimator , true);
self.sceneAnimationAnimator:Play(animName)
end
function MapManager:SceneAnimationShutdown(noReset)
if(self.sceneAnimationShutdownTime < 0)then
return;
end
self.sceneAnimationShutdownTime = -1;
local cameraController = CameraController.singletonInstance
if(cameraController ~= nil)then
if(not noReset)then
GameObjectUtil.SetBehaviourEnabled(cameraController , true);
end
cameraController.updateCameras = false;
end
if(self.sceneAnimationAnimator)then
GameObjectUtil.SetBehaviourEnabled(self.sceneAnimationAnimator , false);
end
end
function MapManager:OnPreviewStart()
if self.sceneAnimationPlaying then
return
end
self.sceneAnimationPlaying = true
local cameraController = CameraController.singletonInstance
if nil ~= cameraController then
cameraController.updateCameras = true
end
GameFacade.Instance:sendNotification(UIEvent.ShowUI,{viewname = "SceneAnimationPanel"})
end
function MapManager:OnPreviewStop()
if not self.sceneAnimationPlaying then
return
end
self.sceneAnimationPlaying = false
local cameraController = CameraController.singletonInstance
if nil ~= cameraController then
cameraController.updateCameras = false
end
GameFacade.Instance:sendNotification(UIEvent.CloseUI,SceneAnimationPanel.ViewType)
end
function MapManager:_CameraFocusMyself()
local cameraController = CameraController.singletonInstance
if nil ~= cameraController then
local myselfTransform = Game.Myself.assetRole.completeTransform
local cameraInfo = cameraController.defaultInfo
if nil ~= cameraInfo then
cameraInfo.focus = myselfTransform
cameraController:RestoreDefault(0, nil)
end
cameraInfo = cameraController.photographInfo
if nil ~= cameraInfo then
cameraInfo.focus = myselfTransform
end
end
EventManager.Me():PassEvent(PlayerEvent.CapturedCamera)
end
function MapManager:_LaunchAfterPreview()
self:_CameraFocusMyself()
self:SetInputDisable(false)
self.areaTriggerManager:Launch()
if MapManager.Mode.Raid == self.mode then
self.dungeonManager:Launch()
end
self.handUpManager:Launch();
self.plotStoryManager:Launch();
self.cullingObjectManager:ReferenceToMyself(true)
-- 根據地圖限制重新整理道具狀態
GameFacade.Instance:sendNotification(ItemEvent.ItemUpdate);
GameFacade.Instance:sendNotification(LoadSceneEvent.SceneAnimEnd);
end
function MapManager:Launch()
if self.running then
return
end
self.running = true
Game.GameObjectManagers[Game.GameObjectType.Camera]:DeterminMainCamera()
local cameraInfo = self.sceneInfo.cameraInfo
if nil ~= cameraInfo then
local cameraController = CameraController.singletonInstance
if nil ~= cameraController then
local cameraDefaultInfo = cameraController.defaultInfo
cameraDefaultInfo.focusOffset = cameraInfo.focusOffset
cameraDefaultInfo.focusViewPort = cameraInfo.focusViewPort
cameraDefaultInfo.rotation = cameraInfo.rotation
cameraDefaultInfo.fieldOfView = cameraInfo.fieldOfView
end
end
Game.Myself:EnterScene()
Game.Myself:Client_PlaceTo(self.mapInfo[3])
self.cullingObjectManager:Launch()
self.sceneSeatManager:Launch()
self.enviromentManager:Launch()
self.skillWorkerManager:Launch()
self.dynamicObjectManager:Launch()
self.questMiniMapEffectManager:Launch()
self.pictureWallManager:Launch()
self.weddingWallPicManager:Launch()
if MapManager.Mode.Raid == self.mode then
self.dungeonManager:SetRaidID(self.mapInfo[1])
end
if self.mapInfo[4] and self:StartPreview() then
self:OnPreviewStart()
else
self:_LaunchAfterPreview()
end
self:ShowMapName();
if self:IsPVPMode() then
SkillInfo.SetMapMode(2)
else
SkillInfo.SetMapMode(1)
end
end
function MapManager:ShowMapName()
local nowMapId = self.mapInfo[1];
local mapdata = nowMapId and Table_Map[nowMapId];
if(mapdata~=nil and mapdata.MapTips == 1)then
FloatingPanel.Instance:ShowMapName(mapdata.NameZh, mapdata.Desc);
end
end
function MapManager:Shutdown()
if(Game.Myself) then
Game.Myself:RemoveObjsWhenLeaveScene()
end
if not self.running then
return
end
self.running = false
if(Game.Myself) then
Game.Myself:LeaveScene()
end
self.cullingObjectManager:ReferenceToMyself(false)
Game.GameObjectManagers[Game.GameObjectType.Camera]:ClearMainCamera()
if nil ~= Camera.main then
Camera.main.gameObject:SetActive(false)
end
self:SetInputDisable(true)
self.sceneSeatManager:Shutdown()
self.cullingObjectManager:Shutdown()
self.enviromentManager:Shutdown()
self.areaTriggerManager:Shutdown()
self.dungeonManager:Shutdown()
self.clickGroundManager:Shutdown()
self.lockTargetEffectManager:ClearLockedTarget()
self.skillWorkerManager:Shutdown()
self.dynamicObjectManager:Shutdown()
self.questMiniMapEffectManager:Shutdown()
self.plotStoryManager:Shutdown();
self.pictureWallManager:Shutdown();
self.weddingWallPicManager:Shutdown();
self:SceneAnimationShutdown();
self:OnPreviewStop()
self.sceneAnimation = nil
self.sceneAnimationAnimator = nil
self.sceneAnimationPlaying = false
end
function MapManager:Update(time, deltaTime)
if not self.running then
return
end
self.enviromentManager:Update(time, deltaTime)
if self.sceneAnimationPlaying then
if self.sceneAnimationAnimator.enabled then
return
else
self:OnPreviewStop()
self:_LaunchAfterPreview()
end
end
self.areaTriggerManager:Update(time, deltaTime)
self.dungeonManager:Update(time, deltaTime)
self.skillWorkerManager:Update(time, deltaTime)
self.dynamicObjectManager:Update(time, deltaTime)
self.sceneSeatManager:Update(time, deltaTime)
self.questMiniMapEffectManager:Update(time, deltaTime)
self.plotStoryManager:Update(time, deltaTime)
self.handUpManager:Update(time, deltaTime)
self.scenicManager:Update(time, deltaTime)
if(self.sceneAnimationShutdownTime > 0 and time >= self.sceneAnimationShutdownTime)then
self:SceneAnimationShutdown();
end
end
function MapManager:LateUpdate(time, deltaTime)
if not self.running then
return
end
self.cullingObjectManager:LateUpdate(time, deltaTime)
end