local XUiInstructionMonster = require("XUi/XUiSet/XUiInstructionMonster") local XUiCombatTask = require("XUi/XUiSet/XUiCombatTask") local XUiInstruction = require("XUi/XUiSet/XUiInstruction") local XUiPanelGraphicsSetPc = require("XUi/XUiSet/XUiPanelGraphicsSetPc") local XUiPanelAccountSetPc = require("XUi/XUiSet/XUiPanelAccountSetPc") local XUiPanelOtherSetPc = require("XUi/XUiSet/XUiPanelOtherSetPc") local XUiPanelFightSetPc = require("XUi/XUiSet/XUiPanelFightSetPc") local XUiSet = XLuaUiManager.Register(XLuaUi, "UiSet") local PANEL_INDEX = { CombatTask = 1, Instruction = 2, Sound = 3, Graphics = 4, Fight = 5, Push = 6, Account = 7, Other = 8, Download = 9, SpecialTrain = 10, } local CLICK_INTERVAL = 0.3 -- 点击间隔 local MULTI_CLICK_COUNT_LIMIT = 5 -- 最大点击数 function XUiSet:OnAwake() XTool.InitUiObject(self) self.BtnRestart.CallBack = function() self:OnBtnRestart() end self.BtnDefault.CallBack = function() self:OnBtnDefaultClick() end self.BtnSave.CallBack = function() self:OnBtnSaveClick() end self.BtnRetreat.CallBack = function() self:OnBtnRetreat() end self.BtnInfoTip.CallBack = function() self:OnBtnInfoTip() end self.BtnBack.CallBack = function() self:OnBtnBackClick() end self.BtnMainUi.CallBack = function() self:OnBtnMainUiClick() end local multiClickHelper = require("XUi/XUiCommon/XUiMultClickHelper").New(self, CLICK_INTERVAL, MULTI_CLICK_COUNT_LIMIT) self.MultiClickHelper = multiClickHelper self.LastOperationType = CS.XInputManager.CurOperationType end function XUiSet:OnNotify(evt, ...) if evt == XEventId.EVENT_FIGHT_FINISH then self:Close() elseif self.CurShowIndex == PANEL_INDEX.Fight and evt == CS.XEventId.EVENT_CUSTOM_UI_SCHEME_CHANGED then -- 由于C#派发的事件无法触发红点系统绑定的监听,因此需要作出转换 XEventManager.DispatchEvent(XEventId.EVENT_CUSTOM_UI_SCHEME_CHANGED) elseif evt == XEventId.EVENT_SETTING_KEYBOARD_KEY_CHANGED then if self.SubPanels[PANEL_INDEX.Fight] then self.SubPanels[PANEL_INDEX.Fight]:RefreshGridList(..., true) end end end function XUiSet:OnGetEvents() return { XEventId.EVENT_FIGHT_FINISH, CS.XEventId.EVENT_CUSTOM_UI_SCHEME_CHANGED, XEventId.EVENT_SETTING_KEYBOARD_KEY_CHANGED } end function XUiSet:OnStart(isFight, panelIndex) self.IsFight = isFight local stageType local beginData = XDataCenter.FubenManager.GetFightBeginData() if beginData and beginData.StageId then local stageInfo = XDataCenter.FubenManager.GetStageInfo(beginData.StageId) if stageInfo then stageType = stageInfo.Type end end --区分战斗中设置和主页面设置内容 if self.IsFight then self.BtnMainUi.gameObject:SetActiveEx(false) self.PanelAsset.gameObject:SetActiveEx(false) self.BtnGraphics.gameObject:SetActiveEx(false) self.BtnInfoTip.gameObject:SetActiveEx(false) self.BtnCombatTask.gameObject:SetActiveEx(CS.XFight.IsCombatTaskActivate) self.BtnDownload.gameObject:SetActiveEx(false) self.BtnInstruction.gameObject:SetActiveEx(stageType ~= XDataCenter.FubenManager.StageType.Maverick) self.BtnAccount.gameObject:SetActiveEx(false) if XFubenConfigs.HasStageGamePlayDesc(stageType) then self.BtnSpecialTrain.gameObject:SetActiveEx(true) self.BtnSpecialTrain:SetNameByGroup(0, XFubenConfigs.GetStageGamePlayTitle(stageType)) self.BtnInstruction.gameObject:SetActiveEx(false) else self.BtnSpecialTrain.gameObject:SetActiveEx(false) end else self.BtnMainUi.gameObject:SetActiveEx(true) self.PanelAsset.gameObject:SetActiveEx(true) self.BtnGraphics.gameObject:SetActiveEx(true) self.BtnInstruction.gameObject:SetActiveEx(false) self.BtnRetreat.gameObject:SetActiveEx(false) self.BtnInfoTip.gameObject:SetActiveEx(true) self.BtnCombatTask.gameObject:SetActiveEx(false) self.BtnDownload.gameObject:SetActiveEx(CS.XInfo.IsDlcBuild and XDataCenter.DlcManager.HasDlcList()) self.BtnSpecialTrain.gameObject:SetActiveEx(false) self.BtnAccount.gameObject:SetActiveEx(true) end if self.IsFight then if CS.XFight.IsRunning then CS.XFight.Instance:Pause() XDataCenter.FightWordsManager.Pause() end -- int index = CS.XFight.GetClientRole().Npc.Index; -- Portraits[index].Select(); -- XUiAnimationManager.PlayUi(Ui, ANIM_BEGIN, null, null); -- TxtScheme.text = XCustomUi.Instance.SchemeName; end self.IsStartAnimCommon = true self.IsStartAnimOther = true self.SubPanels = {} if not self.IsFight then self.AssetPanel = XUiPanelAsset.New(self, self.PanelAsset, XDataCenter.ItemManager.ItemId.FreeGem, XDataCenter.ItemManager.ItemId.ActionPoint, XDataCenter.ItemManager.ItemId.Coin) end local tabGroup = { [PANEL_INDEX.CombatTask] = self.BtnCombatTask, [PANEL_INDEX.Instruction] = self.BtnInstruction, [PANEL_INDEX.Sound] = self.BtnVoice, [PANEL_INDEX.Graphics] = self.BtnGraphics, [PANEL_INDEX.Fight] = self.BtnFight, [PANEL_INDEX.Push] = self.BtnPush, [PANEL_INDEX.Other] = self.BtnOther, [PANEL_INDEX.Download] = self.BtnDownload, [PANEL_INDEX.SpecialTrain] = self.BtnSpecialTrain, [PANEL_INDEX.Account] = self.BtnAccount } self.PanelTabToggles:Init(tabGroup, function(index) self:SwitchSubPanel(index) end) local defaultIndex if self.IsFight then if CS.XFight.IsCombatTaskActivate then defaultIndex = panelIndex or PANEL_INDEX.CombatTask elseif stageType == XDataCenter.FubenManager.StageType.Maverick then defaultIndex = panelIndex or PANEL_INDEX.Sound elseif XFubenConfigs.HasStageGamePlayDesc(stageType) then defaultIndex = panelIndex or PANEL_INDEX.SpecialTrain else defaultIndex = panelIndex or PANEL_INDEX.Instruction end else defaultIndex = panelIndex or PANEL_INDEX.Sound end self.PanelTabToggles:SelectIndex(defaultIndex) self.TipTitle = CS.XTextManager.GetText("TipTitle") self.TipContent = CS.XTextManager.GetText("SettingCheckSave") XRedPointManager.AddRedPointEvent(self.BtnFight, self.OnCheckFightSetNews, self, { XRedPointConditions.Types.CONDITION_MAIN_SET }) CS.XInputManager.SetCurOperationType(CS.XOperationType.System) CS.XPc.XCursorHelper.ForceResponse = true end --战斗页签红点(自定义按键冲突) function XUiSet:OnCheckFightSetNews(count) self.BtnFight:ShowReddot(count >= 0) end function XUiSet:OnDestroy() if self.SubPanels[PANEL_INDEX.Fight] then self.SubPanels[PANEL_INDEX.Fight]:OnDestroy() end if self.Timer ~= nil then XScheduleManager.UnSchedule(self.Timer) self.Timer = nil end if self.MultiClickHelper then self.MultiClickHelper:OnDestroy() end --子panel中如果有event事件,不清除会有问题 --每次打开Account,都会重新生成子panel if self.SubPanels[PANEL_INDEX.Account] then self.SubPanels[PANEL_INDEX.Account]:OnDestroy() end CS.XInputManager.SetCurOperationType(self.LastOperationType) CS.XPc.XCursorHelper.ForceResponse = false end function XUiSet:OnDisable() if self.CurShowIndex and self.SubPanels[self.CurShowIndex] then self.SubPanels[self.CurShowIndex]:HidePanel() end if self.IsFight then if CS.XFight.IsRunning then CS.XFight.Instance:Resume() XDataCenter.FightWordsManager.Resume() end end if self.Timer ~= nil then XScheduleManager.UnSchedule(self.Timer) self.Timer = nil end if self.MultiClickHelper then self.MultiClickHelper:OnDisable() end end function XUiSet:OnEnable() if self.MultiClickHelper then self.MultiClickHelper:OnEnable() end if self.Timer then XScheduleManager.UnSchedule(self.Timer) self.Timer = nil end self.Timer = XScheduleManager.ScheduleForever(function() if self.MultiClickHelper then local dt = CS.UnityEngine.Time.deltaTime self.MultiClickHelper:Update(dt) end end, 0) if self.CurShowIndex and self.SubPanels[self.CurShowIndex] then self.SubPanels[self.CurShowIndex]:ShowPanel() end end function XUiSet:OnBtnSaveClick() self:Save() XUiManager.TipText("SettingSave") end function XUiSet:OnBtnRetreat() local title = CS.XTextManager.GetText("TipTitle") local content = CS.XTextManager.GetText("FightExitMsg") local confirmCb = function() if CS.XFight.IsRunning then CS.XFight.Instance.AutoExitFight = true CS.XFight.Instance:Exit(true) end self:Close() end XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, nil, confirmCb) end function XUiSet:OnBtnRestart() local restartData = self:GetReStartData() if not restartData.IsCanRestart then XUiManager.TipErrorWithKey("TheatreNotRestartTips") return end local title = CS.XTextManager.GetText("TipTitle") local content = CS.XTextManager.GetText("FightRestartMsg") local cb = function() self:Close() XLuaUiManager.Open("UiLoading", LoadingType.Fight) end local confirmCb = function() if CS.XFight.IsRunning then CS.XFight.Instance:Restart(cb) XDataCenter.FightWordsManager.Stop(true) end end XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, nil, confirmCb) end function XUiSet:OnBtnDefaultClick() self.SubPanels[self.SelectedIndex]:ResetToDefault() end function XUiSet:OnBtnBackClick() self:CheckSave(function() self:Close() end) end function XUiSet:OnBtnMainUiClick() self:CheckSave(function() XLuaUiManager.RunMain() end) end function XUiSet:OnBtnInfoTip() self.MultiClickHelper:Click() end function XUiSet:OnBtnUserAgreement() XUiManager.OpenPopWebview(CS.XGame.ClientConfig:GetString("UserAgreementUrl")) end function XUiSet:OnBtnPrivacyPolicy() XUiManager.OpenPopWebview(CS.XGame.ClientConfig:GetString("PrivacyPolicyUrl")) end --多点回调 function XUiSet:OnMultClick(clickTimes) if clickTimes >= MULTI_CLICK_COUNT_LIMIT then local content = CS.XInfo.Identifier XUiManager.UiFubenDialogTip("信息提示", content); end end function XUiSet:InitSubPanel(index) if index == PANEL_INDEX.CombatTask then if self.PanelCombatTaskObj == nil then self.PanelCombatTaskObj = self.PanelCombatTask:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetCombatTask")) end self.SubPanels[PANEL_INDEX.CombatTask] = XUiCombatTask.New(self.PanelCombatTaskObj) elseif index == PANEL_INDEX.Instruction then --口袋妖怪怪物类型战中设置特殊处理 local role = CS.XFight.GetActivateClientRole() local isMonsterFight = role and role.RoleData.CustomNpc ~= nil if isMonsterFight then local monsterUi = self.PanelInstruction:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelInstructionMonster")) self.SubPanels[PANEL_INDEX.Instruction] = XUiInstructionMonster.New(monsterUi) else if self.PanelInstructionObj == nil then self.PanelInstructionObj = self.PanelInstruction:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelInstruction")) end self.SubPanels[PANEL_INDEX.Instruction] = XUiInstruction.New(self.PanelInstructionObj) end elseif index == PANEL_INDEX.Sound then if self.PanelVoiceSetObj == nil then self.PanelVoiceSetObj = self.PanelVoiceSet:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelVoiceSet")) end self.SubPanels[PANEL_INDEX.Sound] = XUiPanelVoiceSet.New(self.PanelVoiceSetObj, self) elseif index == PANEL_INDEX.Graphics then if self.PanelGraphicsSetObj == nil then if XDataCenter.UiPcManager.IsPc() then self.PanelGraphicsSetObj = self.PanelGraphicsSet:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelGraphicsSetPC")) else self.PanelGraphicsSetObj = self.PanelGraphicsSet:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelGraphicsSet")) end end if XDataCenter.UiPcManager.IsPc() then self.SubPanels[PANEL_INDEX.Graphics] = XUiPanelGraphicsSetPc.New(self.PanelGraphicsSetObj, self) else self.SubPanels[PANEL_INDEX.Graphics] = XUiPanelGraphicsSet.New(self.PanelGraphicsSetObj, self) end elseif index == PANEL_INDEX.Fight then if self.PanelFightSetObj == nil then -- if XDataCenter.UiPcManager.IsPc() then self.PanelFightSetObj = self.PanelFightSet:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelFightSetPC")) -- else -- self.PanelFightSetObj = self.PanelFightSet:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelFightSet")) -- end end -- if XDataCenter.UiPcManager.IsPc() then self.SubPanels[PANEL_INDEX.Fight] = XUiPanelFightSetPc.New(self.PanelFightSetObj, self) -- else -- self.SubPanels[PANEL_INDEX.Fight] = XUiPanelFightSet.New(self.PanelFightSetObj, self) -- end elseif index == PANEL_INDEX.Push then if self.PanelPushSetObj == nil then self.PanelPushSetObj = self.PanelPushSet:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelPushSet")) end self.SubPanels[PANEL_INDEX.Push] = XUiPanelPushSet.New(self.PanelPushSetObj, self) elseif index == PANEL_INDEX.Other then if self.PanelOtherObj == nil then if XDataCenter.UiPcManager.IsPc() then self.PanelOtherObj = self.PanelOther:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelOtherPC")) else self.PanelOtherObj = self.PanelOther:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelOther")) end end if XDataCenter.UiPcManager.IsPc() then self.SubPanels[PANEL_INDEX.Other] = XUiPanelOtherSetPc.New(self.PanelOtherObj, self) else self.SubPanels[PANEL_INDEX.Other] = XUiPanelOtherSet.New(self.PanelOtherObj, self) end elseif index == PANEL_INDEX.Download then if self.PanelDownloadObj == nil then self.PanelDownloadObj = self.PanelDownload:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelDownload")) end local XUiPanelDownloadSet = require("XUi/XUiSet/XUiPanelDownloadSet") self.SubPanels[PANEL_INDEX.Download] = XUiPanelDownloadSet.New(self.PanelDownloadObj, self) elseif index == PANEL_INDEX.SpecialTrain then if self.PanelSpecialTrainObj == nil then self.PanelSpecialTrainObj = self.PanelSpecialTrain:LoadPrefab(XUiConfigs.GetComponentUrl("PanelSpecialTrain")) end local XUiPanelSpecialTrain = require("XUi/XUiSet/XUiPanelSpecialTrain") self.SubPanels[PANEL_INDEX.SpecialTrain] = XUiPanelSpecialTrain.New(self.PanelSpecialTrainObj, self) elseif index == PANEL_INDEX.Account then if self.PanelAccountObj == nil then if XDataCenter.UiPcManager.IsPc() then self.PanelAccountObj = self.PanelAccountSet:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelAccountPC")) else self.PanelAccountObj = self.PanelAccountSet:LoadPrefab(XUiConfigs.GetComponentUrl("UiSetPanelAccount")) end end if XDataCenter.UiPcManager.IsPc() then self.SubPanels[PANEL_INDEX.Account] = XUiPanelAccountSetPc.New(self.PanelAccountObj, self) else self.SubPanels[PANEL_INDEX.Account] = XUiPanelAccountSet.New(self.PanelAccountObj, self) end end end function XUiSet:SwitchSubPanel(index) if not self.SubPanels[index] then self:InitSubPanel(index) end self:CheckSave(function() self:ShowSubPanel(index) end) self:PlayAnimation("AnimQieHuanEnable") end function XUiSet:ShowSubPanel(index) if index == PANEL_INDEX.Instruction or index == PANEL_INDEX.CombatTask or index == PANEL_INDEX.Download or index == PANEL_INDEX.Account then self.BtnSave.gameObject:SetActiveEx(false) self.BtnDefault.gameObject:SetActiveEx(false) elseif index ~= PANEL_INDEX.SpecialTrain then -- 特殊显示玩法, 不由此控制按钮, 否则按钮显示异常 self.BtnSave.gameObject:SetActive(true) self.BtnDefault.gameObject:SetActive(true) if self.IsStartAnimCommon then self.IsStartAnimCommon = false self.BtnDefaultAnmation:EnableAnim(XUiButtonState.Normal) self.BtnSaveAnmation:EnableAnim(XUiButtonState.Normal) end end self.SelectedIndex = index for i, panel in pairs(self.SubPanels) do if (i == index) then self.CurShowIndex = index panel:ShowPanel() else panel:HidePanel() end end self.BtnRetreat.gameObject:SetActiveEx(self.IsFight) local restartData = self:GetReStartData() local showRestartIndex = (index == PANEL_INDEX.Instruction) or (index == PANEL_INDEX.CombatTask) self.BtnRestart:SetNameByGroup(0, restartData.BtnName) self.BtnRestart.gameObject:SetActiveEx(showRestartIndex and CS.XFight.Restartable and not CS.XFight.AlreadySettled) if index == PANEL_INDEX.SpecialTrain then local stageType = XDataCenter.FubenManager.GetCurrentStageType() local btnVisible = XFubenConfigs.GetStageGamePlayBtnVisible(stageType) self:SetBtnVisibleByCfg(self.BtnDefault, btnVisible.BtnDefault) self:SetBtnVisibleByCfg(self.BtnRetreat, btnVisible.BtnRetreat) self:SetBtnVisibleByCfg(self.BtnRestart, btnVisible.BtnRestart) self:SetBtnVisibleByCfg(self.BtnSave, btnVisible.BtnSave) if btnVisible.BtnRestart == 1 and not CS.XFight.Restartable then XLog.Warning("[XUiSet] StageGamePlayDesc配置显示了\"重新开始\",但关卡表没配置可重新开始,请检查") end end end function XUiSet:Save() self.SubPanels[self.SelectedIndex]:SaveChange() end function XUiSet:Cancel() self.SubPanels[self.SelectedIndex]:CancelChange() end function XUiSet:CheckUnSaveData() if self.SelectedIndex and self.SubPanels[self.SelectedIndex]:CheckDataIsChange() then return true else return false end end function XUiSet:UpdateSpecialScreenOff() if self.SafeAreaContentPane then self.SafeAreaContentPane:UpdateSpecialScreenOff() end end function XUiSet:CheckSave(cb) local isUnSave = self:CheckUnSaveData() if isUnSave then local cancelCb = function() self:Cancel() if cb then cb() end end local confirmCb = function() self:Save() if cb then cb() end end self:TipDialog(cancelCb, confirmCb) else if cb then cb() end end end function XUiSet:TipDialog(cancelCb, confirmCb) XLuaUiManager.Open("UiDialog", self.TipTitle, self.TipContent, XUiManager.DialogType.Normal, cancelCb, confirmCb) end -- 获取重开数据 function XUiSet:GetReStartData() local result = { BtnName = XUiHelper.GetText("CommonRestartBtnName"), IsCanRestart = true, NotRestartTips = "" } if not CS.XFight.IsRunning then return result end local stageId = CS.XFight.Instance.FightData.StageId local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) if stageInfo == nil then return result end if stageInfo.Type == XDataCenter.FubenManager.StageType.Theatre then local playableCount = XDataCenter.TheatreManager.GetCurrentAdventureManager():GetPlayableCount() result.BtnName = XUiHelper.GetText("TheatreRestartBtnName", playableCount) result.IsCanRestart = playableCount > 0 result.NotRestartTips = XUiHelper.GetText("TheatreNotRestartTips") end return result end function XUiSet:SetBtnVisibleByCfg(btn, value) btn.gameObject:SetActiveEx(value == 1) end