FunctionChangeScene = class("FunctionChangeScene")
function FunctionChangeScene.Me()
if nil == FunctionChangeScene.me then
FunctionChangeScene.me = FunctionChangeScene.new()
end
return FunctionChangeScene.me
end
function FunctionChangeScene:ctor()
end
function FunctionChangeScene:Reset()
end
function FunctionChangeScene:TryPreLoadResources()
Game.GOLuaPoolManager:ClearAllPools()
-- 1.一轉、二轉身體和動畫
-- FunctionPreload.Me():PreloadJobs()
-- 2.NPC
FunctionPreload.Me():SceneNpcs(Game.Myself:GetPosition(),33)
end
function FunctionChangeScene:TryLoadScene(data)
self.sceneProxy = SceneProxy.Instance
EventManager.Me():DispatchEvent(ServiceEvent.PlayerMapChange,data.mapID)
local mapInfo = self:PrepareData(data)
local sameScene = self.sceneProxy:IsCurrentScene(data)
local currentSceneLoaded = self.sceneProxy.currentScene ~= nil and self.sceneProxy.currentScene.loaded or false
if(sameScene) then
--相同場景
if(currentSceneLoaded) then
self:LoadSameLoadedScene(data)
else
--載入場景的佇列永遠只存兩個,A正在載入,佇列后還有B,此時又要載入A,那麼只需要將B移除佇列即可
local lastNeedLoad = SceneProxy.Instance:GetLastNeedLoad()
if(lastNeedLoad) then
SceneProxy.Instance:RemoveNeedLoad(2)
end
return
end
else
--不同場景
self:WaitForLoad(data)
end
self:StartLoadScene()
end
function FunctionChangeScene:PrepareData(data)
LogUtility.InfoFormat("準備載入map: {0} ,raidID: {1}",data.mapID,data.dmapID)
local mapInfo = SceneProxy.Instance:GetMapInfo(data.mapID)
if(mapInfo==nil) then
error("未找到地圖id:"..data.mapID.."的資訊")
end
return mapInfo
end
function FunctionChangeScene:SetRaidID(raidID,playSceneAnim,mapInfo,isSameScene)
-- Player.Me.handleRaid = true
-- if(isSameScene==false) then
-- Player.Me.playSceneAnimation = (playSceneAnim == 1)
-- end
FunctionDungen.Me():Shutdown()
if(raidID>0) then
-- Player.Me.activeRaidID = raidID
-- Player.Me.playMode = Player.PlayMode.Raid
-- print(string.format("call FunctionDungen Launch %s", tostring(raidID) ) )
FunctionDungen.Me():Launch(raidID)
else
-- print(string.format("call FunctionDungen Shutdown"))
-- Player.Me.activeRaidID = SceneRaid.INVALID_ID
-- if(mapInfo.PVPmap==1) then
-- Player.Me.playMode = Player.PlayMode.PVP
-- else
-- Player.Me.playMode = Player.PlayMode.PVE
-- end
end
end
function FunctionChangeScene:LoadSameLoadedScene(data)
LogUtility.InfoFormat("已在地圖{0}中,請求重新載入(只重設位置,和重新新增對像)",data.mapID)
self:ClearScene()
local sceneInfo = SceneProxy.Instance.currentScene
if(sceneInfo) then
sceneInfo.mapNameZH = data.mapName
end
Game.MapManager:SetMapName(data)
ServicePlayerProxy.Instance:CallChangeMap("", 0, 0, 0, data.mapID)
-- self:ChangeSceneAddMode()
MyselfProxy.Instance:ResetMyPos(data.pos.x,data.pos.y,data.pos.z)
--處理地圖傳送點
Game.AreaTrigger_ExitPoint:Shutdown()
Game.AreaTrigger_ExitPoint:SetInvisibleEPs(data.invisiblexit)
Game.AreaTrigger_ExitPoint:Launch()
GameFacade.Instance:sendNotification(LoadSceneEvent.FinishLoad)
EventManager.Me():PassEvent(LoadSceneEvent.FinishLoadScene,sceneInfo)
GameFacade.Instance:sendNotification(MiniMapEvent.ExitPointReInit)
end
function FunctionChangeScene:StartLoadScene()
if(SceneProxy.Instance:CanLoad()) then
self:CacheReceiveNet(true)
--如果允許載入(判斷目前是否已經進入場景,以及剩餘佇列是否還有需要載入的場景)
FunctionBGMCmd.Me():Reset()
self:ClearScene(true)
SceneProxy.Instance:StartLoadFirst()
EventManager.Me():PassEvent(LoadSceneEvent.BeginLoadScene)
local data = SceneProxy.Instance.currentScene
Game.MapManager:SetCurrentMap(data.serverData, true)
local sameScene = self.sceneProxy:IsCurrentScene(data)
local currentSceneLoaded = self.sceneProxy.currentScene ~= nil and self.sceneProxy.currentScene.loaded or false
self:SetRaidID(data.dungeonMapId,data.preview,Table_Map[data.mapID],sameScene and currentSceneLoaded)
return true
end
return false
end
function FunctionChangeScene:WaitForLoad(data)
LogUtility.InfoFormat("新增地圖載入:{0} {1}",data.mapID,data.mapName)
FunctionCheck.Me():SetSyncMove(FunctionCheck.CannotSyncMoveReason.LoadingScene,false)
FunctionMapEnd.Me():Reset()
SceneProxy.Instance:AddLoadingScene(data)
MyselfProxy.Instance:ResetMyBornPos(data.pos.x,data.pos.y,data.pos.z)
end
function FunctionChangeScene:LoadedScene(data)
if(data) then
LogUtility.InfoFormat("{0} {1} 場景載入完畢",data.mapID,data.mapName)
self:TryPreLoadResources()
local sceneQueue = SceneProxy.Instance:FinishLoadScene(data)
self:EnterScene()
if(sceneQueue == nil or #sceneQueue ==0) then
self:AllFinishLoad(data)
else
GameFacade.Instance:sendNotification(LoadingSceneView.ServerReceiveLoaded)
self:StartLoadScene()
-- if(not self:LoadNext()) then
-- FunctionCheck.Me():SetSyncMove(FunctionCheck.CannotSyncMoveReason.LoadingScene,true)
-- Player.Me:TryPlaySceneAnimation()
-- end
end
end
end
function FunctionChangeScene:EnterScene()
SceneProxy.Instance:EnterScene()
SceneProxy.Instance.sceneLoader:SetAllowSceneActivation()
end
function FunctionChangeScene:AllFinishLoad(sceneInfo)
LogUtility.Info(string.format("send change map: %d", sceneInfo.mapID))
LogUtility.Info(string.format("TotalFinishLoad raid: %s", tostring(sceneInfo.dmapID)))
if nil ~= sceneInfo.dmapID and 0 < sceneInfo.dmapID then
local rotationOffsetY = Table_MapRaid[sceneInfo.dmapID].CameraAdj
LogUtility.Info(string.format("TotalFinishLoad rotationOffsetY: %s", tostring(rotationOffsetY)))
if nil ~= rotationOffsetY and 0 ~= rotationOffsetY then
local cameraController = CameraController.Instance
if nil ~= cameraController then
cameraController.cameraRotationEulerOffset = Vector3(0, rotationOffsetY, 0)
cameraController:ApplyCurrentInfo()
end
end
end
FunctionCheck.Me():SetSyncMove(FunctionCheck.CannotSyncMoveReason.LoadingScene,true)
ServicePlayerProxy.Instance:CallChangeMap("", 0, 0, 0, sceneInfo.mapID)
GameFacade.Instance:sendNotification(UIEvent.ShowUI,{viewname = "MainView"})
GameFacade.Instance:sendNotification(LoadSceneEvent.FinishLoad)
FunctionDungen.Me():HandleSceneLoaded()
FunctionMapEnd.Me():TempSetDurationToTimeLine()
-- 活動更新追蹤資訊
FunctionActivity.Me():UpdateNowMapTraceInfo()
-- 網路取消快取部分訊息 begin
self:CacheReceiveNet(false)
-- 網路取消快取部分訊息 end
EventManager.Me():PassEvent(LoadSceneEvent.FinishLoadScene,sceneInfo)
AssetManager.Me():TryUnLoadAllUnused()
Game.MapManager:Launch()
MyLuaSrv.ClearLuaMapAsset();
end
function FunctionChangeScene:CacheReceiveNet(v)
NetProtocol.CachingSomeReceives = v
if(not v) then
NetProtocol.CallCachedReceives()
end
end
function FunctionChangeScene:GC()
LuaGC.CallLuaGC()
ResourceManager.Instance:GC()
GameObjPool.Instance:ClearAll()
end
function FunctionChangeScene:ClearScene(loadOtherScene)
-- print("remove me.."..MyselfProxy.Instance.myself.id)
if(loadOtherScene)then
GameFacade.Instance:sendNotification(SceneUserEvent.SceneRemoveRoles,{MyselfProxy.Instance.myself})
FunctionCameraEffect.Me():Shutdown()
FunctionCameraAdditiveEffect.Me():Shutdown()
FunctionMapEnd.Me():BeginIgnoreAreaTrigger()
end
SceneObjectProxy.ClearAll()
-- 清除Gvg旗幟資訊
GvgProxy.Instance:ClearRuleGuildInfos()
end