251 lines
8.6 KiB
Lua
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
|