UGCProjects/GZJ/Script/Manager/NewPlayerGuideManager.lua
2025-01-08 22:46:12 +08:00

251 lines
8.6 KiB
Lua

---新手引导管理器
NewPlayerGuideManager = LuaClass("NewPlayerGuideManager")
NewPlayerGuideManager.bHasInit = false
NewPlayerGuideManager.CanTriggerGuide = false
---table<UIType, table<(index), ConfigID>>
NewPlayerGuideManager.UITriggerMap = {}
---table<ConfigID>
NewPlayerGuideManager.CustomTriggerMap = {}
---table<ConfigID, TriggeredCount>
NewPlayerGuideManager.GuideTriggerCountMap = {}
---table<_, CongfigID>
NewPlayerGuideManager.TriggeredCountMap = {}
---table<ConfigID, TimerHandle>
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