local RegionBossFormationCtrl = class("RegionBossFormationCtrl", BaseCtrl)
local CustomModelMaterialVariantComponent = CS.CustomModelMaterialVariantComponent
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local LocalData = require("GameCore.Data.LocalData")
local typeof = typeof
local GameCameraStackManager = CS.GameCameraStackManager
local ResType = GameResourceLoader.ResType
local Animator = CS.UnityEngine.Animator
RegionBossFormationCtrl._mapNodeConfig = {
	TopBar = {
		sNodeName = "TopBarPanel",
		sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
	},
	goNoneTeam = {sNodeName = "---None---"},
	txtNoneTeam = {
		sComponentName = "TMP_Text",
		sLanguageId = "RogueBoss_SelectTeam_NoneTeam"
	},
	txtSelectTeam = {
		sComponentName = "TMP_Text",
		sLanguageId = "RegionBoss_Manage_Title"
	},
	btnAddBuild = {
		sComponentName = "UIButton",
		callback = "OnBtnClick_AddBuild"
	},
	goHaveTeam = {sNodeName = "---Team---"},
	goChar = {
		nCount = 3,
		sCtrlName = "Game.UI.RegionBossFormationEx.RegionBossFormationCharCtrl"
	},
	btnStartBattle = {
		sComponentName = "UIButton",
		callback = "OnBtnClick_Start"
	},
	txtStartBattle = {
		sComponentName = "TMP_Text",
		sLanguageId = "RegionBoss_SelectTeam_GoWar"
	},
	aniBuildDetail = {
		sNodeName = "BuildDetail",
		sComponentName = "Animator"
	},
	btnChangeTeam = {
		sComponentName = "UIButton",
		callback = "OnBtnClick_ChangeTeam"
	},
	txtChangeTeam = {
		sComponentName = "TMP_Text",
		sLanguageId = "RegionBoss_SelectTeam_Change"
	},
	btnTeamDetails = {
		sComponentName = "UIButton",
		callback = "OnBtnClick_TeamDetails"
	},
	txtTeamDetails = {
		sComponentName = "TMP_Text",
		sLanguageId = "RegionBoss_SelectTeam_Details"
	},
	btnAttr = {
		sComponentName = "UIButton",
		callback = "OnBtnClick_Attr"
	},
	txtAttr = {sComponentName = "TMP_Text"},
	imgRareFrame = {sComponentName = "Image"},
	imgRareScore = {sComponentName = "Image"},
	txtScoreCn = {
		sComponentName = "TMP_Text",
		sLanguageId = "Build_Score"
	},
	txtBuildScore = {sComponentName = "TMP_Text"},
	txtBuildName = {sComponentName = "TMP_Text"},
	UIParallax3DStage = {
		sComponentName = "UIParallaxStageCameraController"
	},
	BGbackup = {
		sNodeName = "----BGbackup----"
	},
	goLoadMask = {},
	txtStoryModel = {
		sComponentName = "TMP_Text",
		sLanguageId = "Build_StoryModel"
	},
	txtBasicModel = {
		sComponentName = "TMP_Text",
		sLanguageId = "Build_BasicModel"
	},
	txtStoryTip = {
		sComponentName = "TMP_Text",
		sLanguageId = "Build_StoryTip"
	},
	btnSwitch = {
		sComponentName = "UIButton",
		callback = "OnBtnClick_StorySwitch"
	},
	imgStoryModel = {},
	imgBasicModel = {}
}
RegionBossFormationCtrl._mapEventConfig = {
	[EventId.UIBackConfirm] = "OnEvent_Back",
	[EventId.UIHomeConfirm] = "OnEvent_BackHome",
	[EventId.OpenMessageBox] = "OnEvent_OpenMessageBox"
}
function RegionBossFormationCtrl:Refresh()
	if self.isHaveTeam then
		local GetDataCallback = function(tbBuildData, mapAllBuild)
			self._mapAllBuild = mapAllBuild
			self._tbAllBuild = tbBuildData
			if self._mapAllBuild[self.mbuildId] then
				self._mapNode.goNoneTeam.transform.localScale = Vector3.zero
				self._mapNode.goHaveTeam.transform.localScale = Vector3.one
				self._mapNode.aniBuildDetail:Play("BuildDetail_in", 0, 0)
				self._mapNode.btnStartBattle.gameObject:SetActive(true)
				self:RefreshChar()
			else
				self.isHaveTeam = false
				self._mapNode.goHaveTeam.transform.localScale = Vector3.zero
				self._mapNode.goNoneTeam.transform.localScale = Vector3.one
				self._mapNode.btnStartBattle.gameObject:SetActive(false)
				local sTip = ConfigTable.GetUIText("RegionBoss_Team_Delete")
				EventManager.Hit(EventId.OpenMessageBox, sTip)
				self:UnbindAllChar()
			end
			self._mapNode.goLoadMask:SetActive(false)
		end
		if self.bTrial then
			local mapAllBuild = {}
			mapAllBuild[self.mapTrialBuild.nBuildId] = self.mapTrialBuild
			GetDataCallback({
				self.mapTrialBuild
			}, mapAllBuild)
		else
			self._mapNode.goLoadMask:SetActive(true)
			PlayerData.Build:GetAllBuildBriefData(GetDataCallback)
		end
	else
		self._mapNode.goHaveTeam.transform.localScale = Vector3.zero
		self._mapNode.goNoneTeam.transform.localScale = Vector3.one
		self._mapNode.btnStartBattle.gameObject:SetActive(false)
		self:UnbindAllChar()
	end
end
function RegionBossFormationCtrl:UnbindAllChar()
	for i, mapModel in pairs(self.mapCurModel) do
		if mapModel.model ~= nil then
			NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, i - 1)
			destroy(mapModel.model)
		end
	end
	self.mapCurModel = {}
end
function RegionBossFormationCtrl:RefreshChar()
	if self.nType == AllEnum.RegionBossFormationType.RegionBoss or self.nType == AllEnum.RegionBossFormationType.WeeklyCopies then
		PlayerData.RogueBoss:SetSelBuildId(self.mbuildId)
	end
	local mapData = self._mapAllBuild[self.mbuildId]
	for i = 1, 3 do
		self._mapNode.goChar[i]:OnRender(mapData.tbChar, i)
		if mapData.tbChar[i] and mapData.tbChar[i] ~= 0 then
			if self.mapCurModel[i] == nil or self.mapCurModel[i].nCharId ~= mapData.tbChar[i] then
				self:LoadCharacter(mapData.tbChar[i].nTid, i)
			end
		elseif self.mapCurModel[i] ~= nil then
			NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, i - 1)
			destroy(self.mapCurModel[i].model)
			self.mapCurModel[i] = nil
		end
	end
	NovaAPI.SetTMPText(self._mapNode.txtBuildScore, mapData.nScore)
	if mapData.sName == "" or mapData.sName == nil then
		NovaAPI.SetTMPText(self._mapNode.txtBuildName, ConfigTable.GetUIText("RoguelikeBuild_EmptyBuildName"))
	else
		NovaAPI.SetTMPText(self._mapNode.txtBuildName, mapData.sName)
	end
	local sScore = "Icon/BuildRank/BuildRank_" .. mapData.mapRank.Id
	local sFrame = AllEnum.FrameType_New.BuildFormation .. AllEnum.FrameColor_New[mapData.mapRank.Rarity]
	self:SetPngSprite(self._mapNode.imgRareScore, sScore)
	self:SetAtlasSprite(self._mapNode.imgRareFrame, "12_rare", sFrame)
	NovaAPI.SetTMPText(self._mapNode.txtAttr, UTILS.ParseParamDesc(ConfigTable.GetUIText(mapData.mapRank.Desc), mapData.mapRank))
	if PlayerData.Guide:GetGuideState() then
		local wait = function()
			coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
			coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
			EventManager.Hit("Guide_RegionBossFormationCtrl_RefreshChar")
		end
		cs_coroutine.start(wait)
	end
end
function RegionBossFormationCtrl:LoadCharacter(nCharId, idx)
	local mapSkin = ConfigTable.GetData_CharacterSkin(PlayerData.Char:GetCharSkinId(nCharId))
	if not mapSkin then
		printLog("没有找到皮肤配置" .. nCharId)
		return
	end
	local sFullPath = string.format("%s.prefab", mapSkin.Model_Show)
	local LoadModelCallback = function(obj)
		if self._mapNode == nil then
			return
		end
		if 0 < idx then
			if self.mapCurModel[idx] ~= nil then
				NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, idx - 1)
				destroy(self.mapCurModel[idx].model)
				self.mapCurModel[idx] = nil
			end
			local go = instantiate(obj, self.rtSceneOriginPos)
			self.mapCurModel[idx] = {nCharId = nCharId, model = go}
			NovaAPI.BindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, idx - 1, go)
			if self.rtSceneOriginPos ~= nil then
				go.transform.position = self.rtSceneOriginPos.position
				go.transform.localEulerAngles = Vector3(0, 180, 0)
				go.transform.localScale = Vector3.one * (mapSkin.ModelShowScale / 10000)
				local animator = go:GetComponent(typeof(Animator))
				if animator ~= nil and animator:IsNull() == false then
					animator:SetBool("standby", true)
				end
				GameUIUtils.SetCustomModelMaterialVariant(go, CS.CustomModelMaterialVariantComponent.VariantNames.FormationView)
			end
			if PlayerData.Guide:GetGuideState() and not self.bSendGuide then
				self.bSendGuide = true
				EventManager.Hit("Guide_LoadCharacterSuccess")
			end
		end
	end
	self:LoadAssetAsync(sFullPath, typeof(GameObject), LoadModelCallback)
end
function RegionBossFormationCtrl:SetModelPos(nCharId, objModel, nPos)
	local mapSkin = ConfigTable.GetData_CharacterSkin(PlayerData.Char:GetCharSkinId(nCharId))
	if not mapSkin then
		printLog("没有找到皮肤配置" .. nCharId)
		return
	end
	if self.mapCurModel[nPos] ~= nil then
		NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, nPos - 1)
		destroy(self.mapCurModel[nPos].model)
		self.mapCurModel[nPos] = nil
	end
	self.mapCurModel[nPos] = {nCharId = nCharId, model = objModel}
	if self.rtSceneOriginPos ~= nil then
		objModel.transform.position = self.rtSceneOriginPos.position
		objModel.transform.localScale = Vector3.one * (mapSkin.ModelShowScale / 10000)
		local animator = objModel:GetComponent(typeof(Animator))
		if animator ~= nil then
			animator:SetBool("standby", true)
		end
		local matVariantComp = objModel:GetComponent(typeof(CustomModelMaterialVariantComponent))
		if matVariantComp ~= nil then
			matVariantComp:SetVariant(CS.CustomModelMaterialVariantComponent.VariantNames.FormationView)
		end
	end
end
function RegionBossFormationCtrl:OpenRegionBoss()
	if self.isHaveTeam then
		local islock = true
		local worldClass = PlayerData.Base:GetWorldClass()
		local tempData = ConfigTable.GetData("RegionBossLevel", self.selLvId)
		if worldClass >= tempData.NeedWorldClass then
			if tempData.PreLevelId ~= 0 then
				local cachePreData = PlayerData.RogueBoss:GetCacheBossLevelMsg(tempData.PreLevelId)
				if cachePreData and cachePreData.maxStar and cachePreData.maxStar >= tempData.PreLevelStar then
					islock = false
				end
			else
				islock = false
			end
		else
			islock = true
		end
		if islock then
			return
		end
		local CheckItemCountExceededLimitCb = function(isExceeded)
			if not isExceeded then
				local func_cbRegionBossLevelApplyAck = function(_, msgChangeInfo)
					local mapDecodedChangeInfo = UTILS.DecodeChangeInfo(msgChangeInfo)
					HttpNetHandler.ProcChangeInfo(mapDecodedChangeInfo)
				end
				local mapSendMsg = {}
				mapSendMsg.Id = self.selLvId
				mapSendMsg.BuildId = self.mbuildId
				HttpNetHandler.SendMsg(NetMsgId.Id.region_boss_level_apply_req, mapSendMsg, nil, func_cbRegionBossLevelApplyAck)
			end
		end
		PlayerData.Item:CheckItemCountExceededLimit(CheckItemCountExceededLimitCb)
	else
		local sTip = ConfigTable.GetUIText("RegionBoss_NoneTeam")
		EventManager.Hit(EventId.OpenMessageBox, sTip)
	end
end
function RegionBossFormationCtrl:OpenWeeklyCopies()
	if self.isHaveTeam then
		local islock = true
		local worldClass = PlayerData.Base:GetWorldClass()
		local tempData = ConfigTable.GetData("WeekBossLevel", self.selLvId)
		if worldClass >= tempData.NeedWorldClass then
			if tempData.PreLevelId ~= 0 then
				local cachePreData = PlayerData.RogueBoss:GetCacheWeeklyBossMsg(tempData.PreLevelId)
				if cachePreData ~= nil then
					islock = false
				end
			else
				islock = false
			end
		else
			islock = true
		end
		if islock then
			print("未解锁")
			return
		end
		local CheckItemCountExceededLimitCb = function(isExceeded)
			if not isExceeded then
				local func_cbRegionBossLevelApplyAck = function(_, msgChangeInfo)
				end
				local mapSendMsg = {}
				mapSendMsg.Id = self.selLvId
				mapSendMsg.BuildId = self.mbuildId
				HttpNetHandler.SendMsg(NetMsgId.Id.week_boss_apply_req, mapSendMsg, nil, func_cbRegionBossLevelApplyAck)
			end
		end
		PlayerData.Item:CheckItemCountExceededLimit(CheckItemCountExceededLimitCb)
	else
		local sTip = ConfigTable.GetUIText("RegionBoss_NoneTeam")
		EventManager.Hit(EventId.OpenMessageBox, sTip)
	end
end
function RegionBossFormationCtrl:OpenDailyInstance()
	PlayerData.DailyInstance:SetSelBuildId(0)
	if self.isHaveTeam then
		local CheckItemCountExceededLimitCb = function(isExceeded)
			if not isExceeded then
				PlayerData.DailyInstance:MsgEnterDailyInstance(self.selLvId, self.mbuildId)
			end
		end
		PlayerData.Item:CheckItemCountExceededLimit(CheckItemCountExceededLimitCb)
	end
end
function RegionBossFormationCtrl:OpenTravelerDuel()
	if self.isHaveTeam then
		local CheckItemCountExceededLimitCb = function(isExceeded)
			if not isExceeded then
				PlayerData.TravelerDuel:SetSelBuildId(0)
				PlayerData.TravelerDuel:SendMsg_EnterTravelerDuel(self.selLvId, self.mbuildId, self.Other)
			end
		end
		PlayerData.Item:CheckItemCountExceededLimit(CheckItemCountExceededLimitCb)
	end
end
function RegionBossFormationCtrl:OpenInfinityTower()
	if self.isHaveTeam then
		local mapData = self._mapAllBuild[self.mbuildId]
		local tbC = mapData.tbChar
		local tmpTab = {}
		for i, v in pairs(tbC) do
			table.insert(tmpTab, v.nTid)
		end
		if not PlayerData.InfinityTower:JudgeInfinityTowerBuildCanUse(tmpTab, self.selLvId) then
			local strTips = ConfigTable.GetUIText("InfinityTower_Build_NotMeetingCond")
			EventManager.Hit(EventId.OpenMessageBox, strTips)
			return
		end
		local CheckItemCountExceededLimitCb = function(isExceeded)
			if not isExceeded then
				PlayerData.InfinityTower:EnterITApplyReq(self.selLvId, self.mbuildId, true)
			end
		end
		PlayerData.Item:CheckItemCountExceededLimit(CheckItemCountExceededLimitCb)
	end
end
function RegionBossFormationCtrl:OpenEquipmentInstance()
	PlayerData.EquipmentInstance:SetSelBuildId(0)
	if self.isHaveTeam then
		local CheckItemCountExceededLimitCb = function(isExceeded)
			if not isExceeded then
				PlayerData.EquipmentInstance:MsgEnterEquipmentInstance(self.selLvId, self.mbuildId)
			end
		end
		PlayerData.Item:CheckItemCountExceededLimit(CheckItemCountExceededLimitCb)
	end
end
function RegionBossFormationCtrl:OpenSkillInstance()
	PlayerData.SkillInstance:SetSelBuildId(0)
	if self.isHaveTeam then
		local CheckItemCountExceededLimitCb = function(isExceeded)
			if not isExceeded then
				PlayerData.SkillInstance:MsgEnterSkillInstance(self.selLvId, self.mbuildId)
			end
		end
		PlayerData.Item:CheckItemCountExceededLimit(CheckItemCountExceededLimitCb)
	end
end
function RegionBossFormationCtrl:OpenStoryBattle()
	if self.isHaveTeam then
		local nBuildId = self.bTrial and 0 or self.mbuildId
		PlayerData.Avg:SendMsg_STORY_ENTER(self.Other, nBuildId)
	end
end
function RegionBossFormationCtrl:OpenScoreBossBattle()
	if self.isHaveTeam then
		local nCurTime = CS.ClientManager.Instance.serverTimeStamp
		if nCurTime > PlayerData.ScoreBoss.EndTime then
			return
		end
		PlayerData.ScoreBoss:SendEnterScoreBossApplyReq(self.selLvId, self.mbuildId)
	end
end
function RegionBossFormationCtrl:OpenActivityLevelsBattle()
	if self.isHaveTeam then
		local nCurTime = CS.ClientManager.Instance.serverTimeStamp
		local activityLevelsData = PlayerData.Activity:GetActivityDataById(self.Other[1])
		if nCurTime > activityLevelsData.nEndTime then
			EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Activity_End_Notice"))
			return
		end
		activityLevelsData:SendEnterActivityLevelsApplyReq(self.Other[1], self.selLvId, self.mbuildId)
	end
end
function RegionBossFormationCtrl:SwitchStoryType(bTrial)
	self._mapNode.imgStoryModel:SetActive(bTrial)
	self._mapNode.imgBasicModel:SetActive(not bTrial)
	self._mapNode.txtStoryTip.gameObject:SetActive(bTrial)
	self._mapNode.btnChangeTeam.gameObject:SetActive(not bTrial)
	self._mapNode.btnTeamDetails.gameObject:SetActive(not bTrial)
	for i = 1, 3 do
		self._mapNode.goChar[i].gameObject.transform:Find("rtInfo/goInfo/btnDetail").gameObject:SetActive(not bTrial)
	end
end
function RegionBossFormationCtrl:Awake()
end
function RegionBossFormationCtrl:OnEnable()
	self.bStartBattle = false
	local tbParam = self:GetPanelParam()
	self.nType = tbParam[1]
	self.selLvId = tbParam[2]
	self.Other = tbParam[3]
	self._mapNode.goLoadMask:SetActive(true)
	self._mapNode.btnSwitch.gameObject:SetActive(false)
	self:SwitchStoryType(false)
	if self.nType == AllEnum.RegionBossFormationType.RegionBoss then
		self.selLvId = PlayerData.RogueBoss:GetSelLvId()
		self.cacheData = PlayerData.RogueBoss:GetCacheBossLevelMsg(self.selLvId)
		self.isHaveTeam = false
		local tempBuildId = PlayerData.RogueBoss:GetSelBuildId()
		self.mbuildId = 0
		if tempBuildId ~= 0 then
			self.mbuildId = tempBuildId
		elseif self.cacheData then
			self.mbuildId = self.cacheData.BuildId
		elseif self.cacheData == nil then
			local tempTab = ConfigTable.GetData("RegionBossLevel", self.selLvId)
			if 1 < tempTab.Difficulty then
				local tempCacheData = PlayerData.RogueBoss:GetCacheBossLevelMsg(tempTab.PreLevelId)
				if tempCacheData then
					self.mbuildId = tempCacheData.BuildId
				end
			end
		end
		if self.cacheData or tempBuildId ~= 0 or self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
	elseif self.nType == AllEnum.RegionBossFormationType.TravelerDuel then
		self.mbuildId = PlayerData.TravelerDuel:GetCachedBuildId(self.selLvId)
		if self.mbuildId == 0 then
			local tempTab = ConfigTable.GetData("TravelerDuelBossLevel", self.selLvId)
			if 1 < tempTab.Difficulty then
				local tempId = PlayerData.TravelerDuel:GetCachedBuildId(tempTab.PreLevelId)
				if tempId then
					self.mbuildId = tempId
				end
			end
		end
		if self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
	elseif self.nType == AllEnum.RegionBossFormationType.DailyInstance then
		self.mbuildId = PlayerData.DailyInstance:GetCachedBuildId(self.selLvId)
		if self.mbuildId == 0 then
			local tempTab = ConfigTable.GetData("DailyInstance", self.selLvId)
			if 1 < tempTab.Difficulty then
				local tempId = PlayerData.DailyInstance:GetCachedBuildId(tempTab.PreLevelId)
				if tempId then
					self.mbuildId = tempId
				end
			end
		end
		if self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
		if not self.bSendGuideMsg then
			EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_OpenDailyInstanceFormation")
			self.bSendGuideMsg = true
		end
	elseif self.nType == AllEnum.RegionBossFormationType.InfinityTower then
		self.mbuildId = 0
		local tempBuildId = PlayerData.InfinityTower:GetCachedBuildId(self.selLvId)
		if tempBuildId ~= 0 then
			self.mbuildId = tempBuildId
		else
			self.mbuildId = PlayerData.InfinityTower:GetSaveBuildId(self.selLvId)
		end
		if self.mbuildId == 0 then
		end
		if self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
	elseif self.nType == AllEnum.RegionBossFormationType.EquipmentInstance then
		self.mbuildId = PlayerData.EquipmentInstance:GetCachedBuildId(self.selLvId)
		if self.mbuildId == 0 then
			local tempTab = ConfigTable.GetData("CharGemInstance", self.selLvId)
			if 1 < tempTab.Difficulty then
				local tempId = PlayerData.EquipmentInstance:GetCachedBuildId(tempTab.PreLevelId)
				if tempId then
					self.mbuildId = tempId
				end
			end
		end
		if self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
	elseif self.nType == AllEnum.RegionBossFormationType.Story then
		local mapStoryCfg = PlayerData.Avg:GetStoryCfgData(self.Other)
		local bHasTrial = 0 < mapStoryCfg.TrialBuild
		self.bTrial = LocalData.GetPlayerLocalData("StoryTrialModel")
		if self.bTrial == nil then
			self.bTrial = true
		end
		if bHasTrial == false then
			self.bTrial = false
		end
		LocalData.SetPlayerLocalData("StoryTrialModel", self.bTrial)
		self._mapNode.btnSwitch.gameObject:SetActive(bHasTrial)
		self:SwitchStoryType(self.bTrial)
		if bHasTrial then
			self.mapTrialBuild = PlayerData.Build:CreateTrialBuild(mapStoryCfg.TrialBuild)
		end
		if self.bTrial then
			self.mbuildId = self.mapTrialBuild.nBuildId
		else
			self.mbuildId = PlayerData.Avg:GetCachedBuildId()
		end
		if self.mbuildId and self.mbuildId ~= 0 then
			self.isHaveTeam = true
		else
			self.isHaveTeam = false
		end
	elseif self.nType == AllEnum.RegionBossFormationType.ScoreBoss then
		self.mbuildId = 0
		local tempBuildId = PlayerData.ScoreBoss:GetCachedBuild(self.selLvId)
		if tempBuildId ~= 0 then
			self.mbuildId = tempBuildId
		else
			self.mbuildId = PlayerData.ScoreBoss:GetLevelBuild(self.selLvId)
		end
		if self.mbuildId == 0 then
		end
		if self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
	elseif self.nType == AllEnum.RegionBossFormationType.SkillInstance then
		self.mbuildId = PlayerData.SkillInstance:GetCachedBuildId(self.selLvId)
		if self.mbuildId == 0 then
			local tempTab = ConfigTable.GetData("SkillInstance", self.selLvId)
			if 1 < tempTab.Difficulty then
				local tempId = PlayerData.SkillInstance:GetCachedBuildId(tempTab.PreLevelId)
				if tempId then
					self.mbuildId = tempId
				end
			end
		end
		if self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
	elseif self.nType == AllEnum.RegionBossFormationType.WeeklyCopies then
		self.selLvId = PlayerData.RogueBoss:GetSelLvId()
		self.cacheData = PlayerData.RogueBoss:GetCacheWeeklyBossMsg(self.selLvId)
		self.isHaveTeam = false
		local tempBuildId = PlayerData.RogueBoss:GetSelBuildId()
		self.mbuildId = 0
		if tempBuildId ~= 0 then
			self.mbuildId = tempBuildId
		elseif self.cacheData then
			self.mbuildId = self.cacheData.BuildId
		elseif self.cacheData == nil then
			local tempTab = ConfigTable.GetData("WeekBossLevel", self.selLvId)
			if 1 < tempTab.Difficulty then
				local tempCacheData = PlayerData.RogueBoss:GetCacheWeeklyBossMsg(tempTab.PreLevelId)
				if tempCacheData then
					self.mbuildId = tempCacheData.BuildId
				end
			end
		end
		if self.cacheData or tempBuildId ~= 0 or self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
	elseif self.nType == AllEnum.RegionBossFormationType.ActivityLevels then
		local activityLevelsData = PlayerData.Activity:GetActivityDataById(self.Other[1])
		self.mbuildId = 0
		local tempBuildId = activityLevelsData:GetCachedBuildId(self.selLvId)
		if tempBuildId ~= 0 then
			self.mbuildId = tempBuildId
		else
			self.mbuildId = activityLevelsData:GetLevelBuild(self.selLvId)
		end
		if self.mbuildId == 0 then
		end
		if self.mbuildId ~= 0 then
			self.isHaveTeam = true
		end
	end
	self.mapCurModel = {}
	local sSceneName = ConfigTable.GetConfigValue("SelectRole_Main")
	if self.nType == AllEnum.RegionBossFormationType.InfinityTower then
		local mapInfLevel = ConfigTable.GetData("InfinityTowerLevel", self.selLvId)
		if mapInfLevel ~= nil then
			local mapDifficuly = ConfigTable.GetData("InfinityTowerDifficulty", mapInfLevel.DifficultyId)
			if mapDifficuly ~= nil then
				local mapInfTower = ConfigTable.GetData("InfinityTower", mapDifficuly.TowerId)
				if mapInfTower ~= nil then
					sSceneName = mapInfTower.FormationSceneName
				end
			end
		end
	end
	local callbak = function(bSuccess)
		if bSuccess == true then
			local sceneRoot = CS.MainMenuModuleHelper.GetMainMenuSceneRoot(sSceneName)
			self.rtSceneOriginPos = sceneRoot.transform:Find("==== Scene ====")
			self.goSelectRolePrefab = self:CreatePrefabInstance("UI/MainlineFormationEx/SelectRolePrefab.prefab", self.rtSceneOriginPos)
			local goSelectRoleCam = self.goSelectRolePrefab.transform:Find("Camera"):GetComponent("Camera")
			NovaAPI.SetupUIParallaxStageCameraControllerForModelView(self._mapNode.UIParallax3DStage, goSelectRoleCam)
			self._mapNode.goLoadMask:SetActive(false)
			self:Refresh()
		else
			self._mapNode.goLoadMask:SetActive(false)
			self._mapNode.UIParallax3DStage.gameObject:SetActive(false)
			self._mapNode.BGbackup:SetActive(true)
		end
		EventManager.Hit(EventId.SetTransition)
	end
	CS.MainMenuModuleHelper.GetActiveScene(sSceneName, callbak)
end
function RegionBossFormationCtrl:OnDisable()
	local sSceneName = ConfigTable.GetConfigValue("SelectRole_Main")
	if self.nType == AllEnum.RegionBossFormationType.InfinityTower then
		local mapInfLevel = ConfigTable.GetData("InfinityTowerLevel", self.selLvId)
		if mapInfLevel ~= nil then
			local mapDifficuly = ConfigTable.GetData("InfinityTowerDifficulty", mapInfLevel.DifficultyId)
			if mapDifficuly ~= nil then
				local mapInfTower = ConfigTable.GetData("InfinityTower", mapDifficuly.TowerId)
				if mapInfTower ~= nil then
					sSceneName = mapInfTower.FormationSceneName
				end
			end
		end
	end
	local callback = function()
		EventManager.Hit(EventId.SetTransition)
	end
	CS.MainMenuModuleHelper.DeActiveScene(sSceneName, callback)
	self:UnbindAllChar()
	if self.goSelectRolePrefab ~= nil then
		destroy(self.goSelectRolePrefab)
	end
end
function RegionBossFormationCtrl:OnDestroy()
end
function RegionBossFormationCtrl:OnBtnClick_AddBuild()
	EventManager.Hit(EventId.OpenPanel, PanelId.RogueBossBuildBrief, self.nType, self.selLvId)
end
function RegionBossFormationCtrl:OnBtnClick_ChangeTeam()
	EventManager.Hit(EventId.OpenPanel, PanelId.RogueBossBuildBrief, self.nType, self.selLvId)
end
function RegionBossFormationCtrl:OnBtnClick_TeamDetails()
	local callback = function(mapData)
		EventManager.Hit(EventId.OpenPanel, PanelId.StarTowerBuildDetail, mapData)
	end
	PlayerData.Build:GetBuildDetailData(callback, self.mbuildId)
end
function RegionBossFormationCtrl:OnBtnClick_Attr()
	local mapBuild = self._mapAllBuild[self.mbuildId]
	EventManager.Hit(EventId.OpenPanel, PanelId.BuildAttrPreview, mapBuild.mapRank.Id, mapBuild.nScore)
end
function RegionBossFormationCtrl:OnBtnClick_StorySwitch()
	self.bTrial = not self.bTrial
	LocalData.SetPlayerLocalData("StoryTrialModel", self.bTrial)
	self:SwitchStoryType(self.bTrial)
	if self.bTrial then
		self.mbuildId = self.mapTrialBuild.nBuildId
	else
		self.mbuildId = PlayerData.Avg:GetCachedBuildId()
	end
	if self.mbuildId and self.mbuildId ~= 0 then
		self.isHaveTeam = true
	else
		self.isHaveTeam = false
	end
	self:Refresh()
end
function RegionBossFormationCtrl:OnBtnClick_Start(btn)
	if self.bStartBattle == true then
		return
	end
	self.bStartBattle = true
	if self.nType == AllEnum.RegionBossFormationType.RegionBoss then
		self:OpenRegionBoss()
	elseif self.nType == AllEnum.RegionBossFormationType.TravelerDuel then
		self:OpenTravelerDuel()
	elseif self.nType == AllEnum.RegionBossFormationType.DailyInstance then
		self:OpenDailyInstance()
	elseif self.nType == AllEnum.RegionBossFormationType.InfinityTower then
		self:OpenInfinityTower()
	elseif self.nType == AllEnum.RegionBossFormationType.EquipmentInstance then
		self:OpenEquipmentInstance()
	elseif self.nType == AllEnum.RegionBossFormationType.Story then
		self:OpenStoryBattle()
	elseif self.nType == AllEnum.RegionBossFormationType.ScoreBoss then
		local callBack = function(otherLevelId)
			if #otherLevelId == 0 then
				self:OpenScoreBossBattle()
				NovaAPI.SetEntryLevelFade(true)
			else
				local ConfirmCb = function()
					self:OpenScoreBossBattle()
					NovaAPI.SetEntryLevelFade(true)
				end
				local CancelCb = function()
				end
				EventManager.Hit(EventId.OpenPanel, PanelId.ScoreBossClearBD, otherLevelId, ConfirmCb, CancelCb)
				return
			end
		end
		PlayerData.ScoreBoss:JudgeOtherLevelHaveSameChar(self.selLvId, self.mbuildId, callBack)
	elseif self.nType == AllEnum.RegionBossFormationType.SkillInstance then
		self:OpenSkillInstance()
	elseif self.nType == AllEnum.RegionBossFormationType.WeeklyCopies then
		self:OpenWeeklyCopies()
	elseif self.nType == AllEnum.RegionBossFormationType.ActivityLevels then
		self:OpenActivityLevelsBattle()
	end
	NovaAPI.SetEntryLevelFade(true)
end
function RegionBossFormationCtrl:OnEvent_Back(nPanelId)
	if self._panel._nPanelId ~= nPanelId then
		return
	end
	PlayerData.TravelerDuel:SetSelBuildId(0)
	PlayerData.DailyInstance:SetSelBuildId(0)
	if self.mapTrialBuild then
		PlayerData.Build:DeleteTrialBuild()
	end
	local OpenCallback = function()
		EventManager.Hit(EventId.CloesCurPanel)
	end
	EventManager.Hit(EventId.SetTransition, 5, OpenCallback)
end
function RegionBossFormationCtrl:OnEvent_BackHome(nPanelId)
	if self._panel._nPanelId ~= nPanelId then
		return
	end
	if self.nType == AllEnum.RegionBossFormationType.InfinityTower then
		PlayerData.InfinityTower:SetPageState(1)
	end
	PlayerData.TravelerDuel:SetSelBuildId(0)
	PlayerData.DailyInstance:SetSelBuildId(0)
	if self.mapTrialBuild then
		PlayerData.Build:DeleteTrialBuild()
	end
	local OpenCallback = function()
		PanelManager.Home()
	end
	EventManager.Hit(EventId.SetTransition, 5, OpenCallback)
end
function RegionBossFormationCtrl:OnEvent_OpenMessageBox()
	self.bStartBattle = false
end
return RegionBossFormationCtrl
