---新手引导管理器 NewPlayerGuideManager = LuaClass("NewPlayerGuideManager") NewPlayerGuideManager.bHasInit = false NewPlayerGuideManager.CanTriggerGuide = false ---table> NewPlayerGuideManager.UITriggerMap = {} ---table NewPlayerGuideManager.CustomTriggerMap = {} ---table NewPlayerGuideManager.GuideTriggerCountMap = {} ---table<_, CongfigID> NewPlayerGuideManager.TriggeredCountMap = {} ---table NewPlayerGuideManager.RemoveGuideTimerHandles = {} function NewPlayerGuideManager.ctor() end function NewPlayerGuideManager:Init() if NewPlayerGuideManager.bHasInit then return end NewPlayerGuideManager.bHasInit = true self:LoadGuideConfigTable() self:BindEvents() self:OnGameStageChanged(UGCGameSystem.GameState.GameStage) if UGCGameSystem.GameState.GameStage < EGameStage.GameFight then EventSystem.SetTimer(UGCGameSystem.GameState, function() self:TriggerGuide(1) end, 1.0) end end function NewPlayerGuideManager:UnInit() self:RemoveAllGuide() self:UnBindEvents() NewPlayerGuideManager.UITriggerMap = nil NewPlayerGuideManager.CustomTriggerMap = nil NewPlayerGuideManager.GuideTriggerCountMap = nil NewPlayerGuideManager.RemoveGuideTimerHandles = nil NewPlayerGuideManager.TriggeredCountMap = nil end function NewPlayerGuideManager:BindEvents() EventSystem:AddListener(EventType.OnGameStageChanged, NewPlayerGuideManager.OnGameStageChanged, self) EventSystem:AddListener(EventType.OnWidgetShowed, NewPlayerGuideManager.OnWidgetPanelShowed, self) EventSystem:AddListener(EventType.OnWidgetClosed, NewPlayerGuideManager.OnWidgetPanelClosed, self) end function NewPlayerGuideManager:UnBindEvents() EventSystem:RemoveListener(EventType.OnGameStageChanged, NewPlayerGuideManager.OnGameStageChanged, self) EventSystem:RemoveListener(EventType.OnWidgetShowed, NewPlayerGuideManager.OnWidgetPanelShowed, self) EventSystem:RemoveListener(EventType.OnWidgetClosed, NewPlayerGuideManager.OnWidgetPanelClosed, self) end function NewPlayerGuideManager:LoadGuideConfigTable() require('Script.Global.NewPlayerGuideConfig') local ConfigTable = NewPlayerGuideConfig.GuideTable for i, v in pairs(ConfigTable) do if v.TriggerType == EGuideTriggerType.UIVisibile then if NewPlayerGuideManager.UITriggerMap[v.LinkedUIType] == nil then NewPlayerGuideManager.UITriggerMap[v.LinkedUIType] = {} end table.insert(NewPlayerGuideManager.UITriggerMap[v.LinkedUIType], i) elseif v.TriggerType == EGuideTriggerType.CustomCondition then table.insert(NewPlayerGuideManager.CustomTriggerMap, i) end end end function NewPlayerGuideManager:GetGuideDuration(ConfigID) local Config = NewPlayerGuideConfig.GuideTable[ConfigID] if Config ~= nil and Config.ExistType == EGuideExistType.Duration and Config.Duration > 0.1 then return Config.Duration end return 0 end function NewPlayerGuideManager:IsGuideExisted(ConfigID) return table.hasValue(NewPlayerGuideManager.TriggeredCountMap, ConfigID) end function NewPlayerGuideManager:HasGuideMaxTriggered(ConfigID) local Config = NewPlayerGuideConfig.GuideTable[ConfigID] if Config == nil then return false end if NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] == nil then return false end return NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] >= Config.MaxTriggerCount end function NewPlayerGuideManager:OnGameStageChanged(GameStage) if GameStage == EGameStage.GameFight then self.CanTriggerGuide = true else self.CanTriggerGuide = false end end function NewPlayerGuideManager:OnWidgetPanelShowed(InUIType) for UIType, ConfigIDs in pairs(NewPlayerGuideManager.UITriggerMap) do if UIType == InUIType then for _, ConfigID in pairs(ConfigIDs) do self:TriggerGuide(ConfigID) end break end end end function NewPlayerGuideManager:OnWidgetPanelClosed(InUIType) for UIType, ConfigIDs in pairs(NewPlayerGuideManager.UITriggerMap) do if UIType == InUIType then for _, ConfigID in pairs(ConfigIDs) do NewPlayerGuideManager:RemoveGuide(ConfigID) end break end end end function NewPlayerGuideManager:TriggerGuide(ConfigID) if NewPlayerGuideConfig == nil then NewPlayerGuideManager:Init() end if NewPlayerGuideManager.CanTriggerGuide == false then if ConfigID > 3 then --1~3都是准备阶段的引导 UE.Log("[NewPlayerGuideManager][TriggerGuide] Can't Trigger Guide Now! GameStage=%d, ConfigID=%d", UGCGameSystem.GameState.GameStage, ConfigID) return end end local Config = NewPlayerGuideConfig.GuideTable[ConfigID] if Config == nil then return false end if self:IsGuideExisted(ConfigID) then return false end if NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] == nil then NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] = 0 end if NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] >= Config.MaxTriggerCount then return false end local PS = GameDataManager.GetLocalPlayerState() if PS and PS:GetNeedTriggerForceGuide() then local ValidStepIndex = PS.ForceGuideInfo.ValidStepIndex if ValidStepIndex == nil then ValidStepIndex = -2 end -----------判断是否是强引导 local RelatedForceGuideID = { [10] = 1, --兑换 [15] = 2, --首领信息 [11] = 3, --开箱 [4] = 4, --武器进阶 [29] = 5, --锁定 [19] = 6, --一键拾取 [20] = 7, --背包 [13] = 8, --获取 } local ForceGuideID = RelatedForceGuideID[ConfigID] if ForceGuideID ~= nil and ForceGuideID >= ValidStepIndex then local ForceGuidePanel = UIManager:GetPanel(EUIType.ForceGuide) if ForceGuidePanel and UE.IsValid(ForceGuidePanel) and ForceGuidePanel.bHasTriggeredAllForceGuide == false then if ForceGuidePanel:TryTriggerForceGuide(ForceGuideID) then table.insert(NewPlayerGuideManager.TriggeredCountMap, ConfigID) NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] = NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] + 1 return end end end end local GuideData = { ID = ConfigID, LinkedUIType = Config.LinkedUIType, LinkedComponent = Config.LinkedComponent, GuideTextType = Config.GuideTextType, GuideText = Config.GuideText, } if type(Config.MutalExclusionIndex) == "number" then if Config.MutalExclusionIndex > 0 then NewPlayerGuideManager:RemoveGuide(Config.MutalExclusionIndex) end elseif type(Config.MutalExclusionIndex) == "table" then for _, ConfigID in pairs(Config.MutalExclusionIndex) do NewPlayerGuideManager:RemoveGuide(ConfigID) end end if Config.ExistType == EGuideExistType.Duration and Config.Duration > 0.1 then NewPlayerGuideManager.RemoveGuideTimerHandles[ConfigID] = EventSystem.SetTimer(UGCGameSystem.GameState, function() NewPlayerGuideManager:RemoveGuide(ConfigID) end, Config.Duration) end if UIManager:ShowPlayerGuide(Config.GuideType, GuideData, Config.Root) then NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] = NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] + 1 table.insert(NewPlayerGuideManager.TriggeredCountMap, ConfigID) return true end return false end function NewPlayerGuideManager:RemoveGuide(ConfigID) if NewPlayerGuideManager.RemoveGuideTimerHandles[ConfigID] ~= nil then EventSystem.StopTimer(NewPlayerGuideManager.RemoveGuideTimerHandles[ConfigID]) NewPlayerGuideManager.RemoveGuideTimerHandles[ConfigID] = nil end if self:IsGuideExisted(ConfigID) then UIManager:RemovePlayerGuide(ConfigID) table.removeValue(NewPlayerGuideManager.TriggeredCountMap, ConfigID) end end function NewPlayerGuideManager:RemoveAllGuide() for ID, Handle in pairs(NewPlayerGuideManager.RemoveGuideTimerHandles) do EventSystem.StopTimer(Handle) NewPlayerGuideManager.RemoveGuideTimerHandles[ID] = nil end NewPlayerGuideManager.TriggeredCountMap = {} UIManager:RemoveAllPlayerGuide() end return NewPlayerGuideManager