533 lines
No EOL
17 KiB
Lua
533 lines
No EOL
17 KiB
Lua
XGuideManagerCreator = function()
|
||
|
||
local XGuideManager = {}
|
||
|
||
-- 引导组记录状态
|
||
XGuideManager.RecordState = {
|
||
None = 0, --
|
||
RequestRecord = 1, --请求记录中
|
||
Record = 2, --已记录
|
||
}
|
||
|
||
XGuideManager.GuideType = {
|
||
Default = 1,
|
||
Fight = 2,
|
||
}
|
||
|
||
local PROTOCOL_REQUEST_NAME = {
|
||
ReqOpenGuide = "GuideOpenRequest",
|
||
ReqCompleteGuide = "GuideCompleteRequest",
|
||
ReqCompleteGuideGroup = "GuideGroupFinishRequest",
|
||
}
|
||
|
||
-- 该事件类型包括了引导的触发、完成类型
|
||
XGuideManager.GuideEventType = {
|
||
TeamLevel = 1, --战队等级:等级
|
||
PassStage = 2, --副本相关:副本id, 是否通关
|
||
CompleteTask = 3, --完成任务:任务id
|
||
FunctionOpen = 4, --功能开启:功能id
|
||
GainCharacter = 5, --获得角色:角色id
|
||
GainEquip = 6, --获得装备:装备id
|
||
GainItem = 7, --获得道具:道具id,数量
|
||
CharacterUpgrade = 8, --角色培养:角色id,等级,改造阶段, 晋升等级
|
||
CharacterUpgradeSkill = 9, --角色技能:角色id, 技能id, 等级
|
||
EquipUpgrade = 10, --装备升级:装备id, 等级,突破次数,觉醒等级
|
||
CompleteGuide = 11, --完成引导:引导组id
|
||
CompleteGuideStep = 12, --完成步骤:步骤id
|
||
OpenPanel = 13, --打开界面:Ui名
|
||
ClosePanel = 14, --关闭界面:UI名
|
||
ClickSpecify = 15, --点击指定区域
|
||
}
|
||
|
||
XGuideManager.GroupOpenType = {
|
||
FightTeamLevel = 1, --战队等级:等级
|
||
PassStage = 2, --通过副本:副本id
|
||
FunctionOpen = 3, --功能开启:功能id
|
||
GainCharacter = 4, --获得角色:角色id
|
||
GainEquip = 5, --获得装备:装备id
|
||
GainItem = 6, --获得道具:道具id
|
||
CompleteGuide = 7, --完成引导:引导组id
|
||
CompleteTask = 8, --完成任务:任务id
|
||
}
|
||
|
||
XGuideManager.GroupCompleteType = {
|
||
CompleteStep = 1, --步骤结束:步骤id
|
||
Stage = 2, --副本相关:副本id, 是否通关
|
||
CompleteTask = 3, --完成任务:任务id
|
||
CharacterDevelop = 4, --角色培养:角色id,等级,改造阶段, 晋升等级
|
||
CharacterSkill = 5, --角色技能:角色id, 技能id, 等级
|
||
EquipUpgrade = 6, --装备升级:装备id, 等级,突破次数,觉醒等级
|
||
GainItem = 7, --获得道具:道具id, 数量
|
||
EquipPutOn = 8, --穿装备:装备id
|
||
UseItem = 9, --使用道具:道具id,数量
|
||
PartUpgrade = 10, --部件升级:角色id,部件id,部件等级
|
||
TeamChanged = 11, --战斗编队
|
||
CompleteCourse = 12, --完成历程:副本id
|
||
GainReward = 13, --领取奖励 :奖励ID
|
||
}
|
||
|
||
XGuideManager.StepOpenType = {
|
||
OpenPanel = 1, --打开界面:Ui名
|
||
ClosePanel = 2, --关闭界面:UI名
|
||
CompleteStep = 3, --完成步骤:步骤id
|
||
GainItem = 4, --获得道具:道具id
|
||
CompleteTask = 5, --完成任务:任务id
|
||
CustomEvent = 6, --自定义消息 :参数
|
||
GainReward = 7, --领取奖励 :奖励ID
|
||
}
|
||
|
||
XGuideManager.StepCompleteType = {
|
||
DefaultClick = 0, --默认:点击
|
||
OpenPanel = 1, --打开界面:UI名
|
||
ClosePanel = 2, --关闭界面:UI名
|
||
GainItem = 3, --获得道具:道具id
|
||
CompleteTask = 4, --完成任务:任务id
|
||
CustomEvent = 5, --自定义消息 :参数
|
||
GainReward = 6, --领取奖励 :奖励ID
|
||
}
|
||
|
||
local GuideAgent = nil --引导Agent
|
||
|
||
-- local WaitingGuide = nil --当前等激活的引导
|
||
local ActiveGuide = nil --当前引导
|
||
local GuideData = {} -- 玩家引导数据
|
||
local DisableFunction = false --功能屏蔽标记(调试模式时使用)
|
||
local IsGuiding = false
|
||
|
||
local WaitingGuideList = {}
|
||
|
||
function XGuideManager.Init()
|
||
XEventManager.AddEventListener(XEventId.EVENT_USER_LOGOUT, XGuideManager.HandleSignOut)
|
||
|
||
CsXGameEventManager.Instance:RegisterEvent(CS.XEventId.EVENT_UI_ALLOWOPERATE, function(evt, ui)
|
||
XGuideManager.HandleUiOpen(ui[0].UiData.UiName)
|
||
end)
|
||
|
||
--引导开启
|
||
CsXGameEventManager.Instance:RegisterEvent(XEventId.EVENT_GUIDE_START, XGuideManager.OnGuideStart)
|
||
--引导结束
|
||
CsXGameEventManager.Instance:RegisterEvent(XEventId.EVENT_GUIDE_END, XGuideManager.OnGuideEnd)
|
||
end
|
||
|
||
--初始化
|
||
function XGuideManager.InitGuideData(datas)
|
||
ActiveGuide = nil -- 当前引导
|
||
WaitingGuideList = {}
|
||
DisableFunction = XMain.IsDebug and XGuideManager.CheckFuncDisable()
|
||
for _, v in pairs(datas) do
|
||
GuideData[v] = v
|
||
end
|
||
end
|
||
|
||
function XGuideManager.OnGuideStart()
|
||
IsGuiding = true
|
||
end
|
||
|
||
function XGuideManager.OnGuideEnd()
|
||
IsGuiding = false
|
||
XGuideManager.ResetGuide()
|
||
|
||
XEventManager.DispatchEvent(XEventId.EVENT_FUNCTION_EVENT_COMPLETE)
|
||
end
|
||
|
||
--检测引导开启
|
||
function XGuideManager.CheckGuideOpen()
|
||
if DisableFunction then
|
||
return false
|
||
end
|
||
|
||
if ActiveGuide and IsGuiding then
|
||
return true
|
||
end
|
||
|
||
XGuideManager.FindActiveGuide()
|
||
|
||
local result = false
|
||
local removeIndex = -1
|
||
for i, v in ipairs(WaitingGuideList) do
|
||
local waitingGuide = v
|
||
if (waitingGuide and waitingGuide.GuideType == XGuideManager.GuideType.Default) then
|
||
if XGuideManager.TryActiveGuide(waitingGuide) then
|
||
removeIndex = i
|
||
result = true
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
if removeIndex > 0 then
|
||
table.remove(WaitingGuideList, removeIndex)
|
||
end
|
||
|
||
return result
|
||
end
|
||
|
||
--创建引导主体
|
||
function XGuideManager:CreateGuideAgent()
|
||
local guideAgent = CS.UnityEngine.GameObject("GuideAgent")
|
||
|
||
GuideAgent = guideAgent:AddComponent(typeof(CS.BehaviorTree.XAgent))
|
||
GuideAgent.ProxyType = "Guide"
|
||
GuideAgent:InitProxy()
|
||
end
|
||
|
||
--开始引导
|
||
function XGuideManager:PlayGuide(id)
|
||
if not GuideAgent or not GuideAgent:Exist() then
|
||
XGuideManager:CreateGuideAgent()
|
||
end
|
||
|
||
if id == 50000 then
|
||
--CheckPoint: APPEVENT_THIRD_BATTLE_END
|
||
XAppEventManager.AppLogEvent(XAppEventManager.CommonEventNameConfig.Third_Battle_End)
|
||
end
|
||
|
||
GuideAgent.gameObject:SetActive(true)
|
||
XLuaBehaviorManager.PlayId(id, GuideAgent)
|
||
end
|
||
|
||
--检测引导开关
|
||
function XGuideManager.CheckFuncDisable()
|
||
return XSaveTool.GetData(XPrefs.GuideTrigger)
|
||
end
|
||
|
||
function XGuideManager.ChangeFuncDisable(state)
|
||
DisableFunction = state
|
||
XSaveTool.SaveData(XPrefs.GuideTrigger, DisableFunction)
|
||
end
|
||
|
||
--重置引导
|
||
function XGuideManager.ResetGuide()
|
||
if GuideAgent and GuideAgent:Exist() then
|
||
GuideAgent.gameObject:SetActive(false)
|
||
|
||
if GuideAgent.Proxy.LuaAgentProxy then
|
||
GuideAgent.Proxy.LuaAgentProxy.UiGuide = nil
|
||
end
|
||
end
|
||
|
||
ActiveGuide = nil -- 当前引导
|
||
XLuaUiManager.Close("UiGuide")
|
||
end
|
||
|
||
function XGuideManager.HandleUiOpen(UiName)
|
||
if IsGuiding then
|
||
return
|
||
end
|
||
|
||
local bActive = false
|
||
|
||
local removeIndex = -1
|
||
for i, v in ipairs(WaitingGuideList) do
|
||
local activeUis = string.Split(v.ActiveUi, '|')
|
||
for _, v2 in ipairs(activeUis) do
|
||
if v2 == UiName then
|
||
bActive = true
|
||
break
|
||
end
|
||
end
|
||
|
||
if bActive then
|
||
if XGuideManager.TryActiveGuide(v) then
|
||
removeIndex = i
|
||
break
|
||
end
|
||
end
|
||
|
||
bActive = false
|
||
end
|
||
|
||
if removeIndex > 0 then
|
||
table.remove(WaitingGuideList, removeIndex)
|
||
end
|
||
end
|
||
|
||
--尝试开启引导
|
||
function XGuideManager.TryActiveGuide(guide)
|
||
if guide == nil then
|
||
return false
|
||
end
|
||
|
||
-- 远程配置屏蔽引导,除了新手关1、2、3(可以移到CheckGuideOpen方法中)
|
||
if XUiManager.IsHideFunc then
|
||
return
|
||
end
|
||
|
||
if not XLoginManager.IsStartGuide() then
|
||
return
|
||
end
|
||
|
||
if guide.GuideType ~= XGuideManager.GuideType.Default then
|
||
return false
|
||
end
|
||
|
||
local bActive = false
|
||
|
||
local activeUis = string.Split(guide.ActiveUi, '|')
|
||
for _, v in ipairs(activeUis) do
|
||
if CsXUiManager.Instance:IsUiShow(v) and CsXUiManager.Instance:FindTopUi(v) then
|
||
bActive = true
|
||
break
|
||
end
|
||
end
|
||
|
||
if not bActive then
|
||
return false
|
||
end
|
||
|
||
ActiveGuide = guide
|
||
XGuideManager:PlayGuide(ActiveGuide.Id)
|
||
return true
|
||
end
|
||
|
||
---查找激活的引导
|
||
function XGuideManager.FindActiveGuide()
|
||
local IsOpen = false
|
||
|
||
WaitingGuideList = {}
|
||
local guideGroupTemplates = XGuideConfig.GetGuideGroupTemplates()
|
||
for _, temp in pairs(guideGroupTemplates) do
|
||
if not XGuideManager.CheckIsGuide(temp.Id) and temp.Ignore == 0 then
|
||
for _, v in pairs(temp.ConditionId) do
|
||
if v and v ~= 0 then
|
||
IsOpen = XConditionManager.CheckCondition(v)
|
||
if not IsOpen then
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
if IsOpen then
|
||
XGuideManager.SetActiveGuide(temp)
|
||
IsOpen = false
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
--激活引导
|
||
function XGuideManager.SetActiveGuide(guide)
|
||
WaitingGuideList = WaitingGuideList or {}
|
||
local insetIndex = -1
|
||
if #WaitingGuideList <= 0 then
|
||
insetIndex = 1
|
||
end
|
||
|
||
for i, v in ipairs(WaitingGuideList) do
|
||
if guide.Priority < v.Priority then
|
||
insetIndex = i
|
||
break
|
||
end
|
||
end
|
||
|
||
if insetIndex <= 0 then
|
||
table.insert(WaitingGuideList, guide)
|
||
else
|
||
table.insert(WaitingGuideList, insetIndex, guide)
|
||
end
|
||
|
||
-- if (WaitingGuide == nil) then
|
||
-- WaitingGuide = guide
|
||
-- else
|
||
-- if (guide.Priority < WaitingGuide.Priority) then
|
||
-- WaitingGuide = guide
|
||
-- end
|
||
-- end
|
||
end
|
||
|
||
--完成引导
|
||
-- function XGuideManager.CompleteGuide()
|
||
-- if not ActiveGuide then
|
||
-- return
|
||
-- end
|
||
|
||
-- if (IsRecord == XGuideManager.RecordState.Record) then
|
||
-- local guideId = ActiveGuide.Id
|
||
-- ActiveGuide = nil
|
||
-- IsRecord = XGuideManager.RecordState.None
|
||
-- end
|
||
-- end
|
||
|
||
-- 外部调用接口end --
|
||
-- 查询相关begin --
|
||
function XGuideManager.CheckIsGuide(guideId)
|
||
if not GuideData then
|
||
return false
|
||
end
|
||
|
||
for _, value in pairs(GuideData) do
|
||
if value == guideId then
|
||
return true
|
||
end
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
-- 查询相关end --
|
||
-- 获取下一场新手战斗
|
||
function XGuideManager.GetNextGuideFight()
|
||
if DisableFunction then
|
||
return false
|
||
end
|
||
if ActiveGuide and IsGuiding then
|
||
return false
|
||
end
|
||
|
||
XGuideManager.FindActiveGuide()
|
||
|
||
local result = nil
|
||
local removeIndex = -1
|
||
for i, v in ipairs(WaitingGuideList) do
|
||
local waitingGuide = v
|
||
if (waitingGuide and waitingGuide.GuideType == XGuideManager.GuideType.Fight) then
|
||
local cfg = XGuideConfig.GetGuideFightTemplatesById(waitingGuide.Id)
|
||
if cfg then
|
||
removeIndex = i
|
||
result = cfg
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
if removeIndex > 0 then
|
||
ActiveGuide = table.remove(WaitingGuideList, removeIndex)
|
||
end
|
||
|
||
return result
|
||
end
|
||
|
||
function XGuideManager.IsPrologueFight()
|
||
local result = XGuideManager.GetNextGuideFight()
|
||
if not result then
|
||
return false
|
||
end
|
||
return result ~= nil
|
||
end
|
||
|
||
--是否是战斗引导
|
||
function XGuideManager.CheckIsFightGuide()
|
||
if ActiveGuide and ActiveGuide.GuideType == XGuideManager.GuideType.Fight then
|
||
return true
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
--是否正在引导
|
||
function XGuideManager.CheckIsInGuide()
|
||
return IsGuiding
|
||
end
|
||
|
||
---是否正在引导(升级版)该接口即使强跳也能判断
|
||
---原强跳引导在外服环境IsGuiding是不会恢复的
|
||
---对于某些业务可能出现卡流程现象
|
||
function XGuideManager.CheckIsInGuidePlus()
|
||
return IsGuiding and ActiveGuide ~= nil
|
||
end
|
||
|
||
--处理登出
|
||
function XGuideManager.HandleSignOut()
|
||
XGuideManager.ResetGuide()
|
||
if GuideAgent and GuideAgent:Exist() then
|
||
CS.UnityEngine.GameObject.Destroy(GuideAgent.gameObject)
|
||
GuideAgent = nil
|
||
end
|
||
end
|
||
|
||
-- 消息相关begin --
|
||
function XGuideManager.ReqGuideOpen(guideId, cb)
|
||
XNetwork.Call(PROTOCOL_REQUEST_NAME.ReqOpenGuide, { GuideGroupId = guideId }, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
end
|
||
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XGuideManager.ReqGuideComplete(guideId, cb)
|
||
XNetwork.Call(PROTOCOL_REQUEST_NAME.ReqCompleteGuide, { GuideGroupId = guideId }, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
else
|
||
if response.RewardGoodsList then
|
||
XUiManager.OpenUiObtain(response.RewardGoodsList, nil)
|
||
end
|
||
|
||
XGuideManager.OnSyncGuideData(guideId)
|
||
|
||
end
|
||
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XGuideManager.ReqCompleteGuideGroup(cb)
|
||
if not ActiveGuide then
|
||
if cb then
|
||
cb()
|
||
end
|
||
return
|
||
end
|
||
|
||
local groupId = XGuideConfig.GetGuideGroupTemplatesById(ActiveGuide.Id).GroupId
|
||
XNetwork.Call(PROTOCOL_REQUEST_NAME.ReqCompleteGuideGroup, { GroupId = groupId }, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
else
|
||
if response.RewardGoodsList then
|
||
XUiManager.OpenUiObtain(response.RewardGoodsList, nil)
|
||
end
|
||
XGuideManager.OnSyncGuideGroupData(groupId)
|
||
end
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XGuideManager.OnSyncGuideGroupData(groupId)
|
||
local configData = XGuideConfig.GetGuideGroupTemplates()
|
||
for k, v in pairs(configData) do
|
||
if v.GroupId == groupId then
|
||
GuideData[k] = k
|
||
end
|
||
end
|
||
if ActiveGuide then
|
||
local guideType = ActiveGuide.GuideType
|
||
if guideType ~= XGuideManager.GuideType.Default then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_FUNCTION_EVENT_COMPLETE)
|
||
end
|
||
end
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUIDE_COMPLETED_SUCCESS)
|
||
end
|
||
|
||
function XGuideManager.OnSyncGuideData(guideId)
|
||
if DisableFunction then
|
||
return
|
||
end
|
||
|
||
GuideData[guideId] = guideId
|
||
if ActiveGuide and (ActiveGuide.Id == guideId) then
|
||
local guideType = ActiveGuide.GuideType
|
||
if guideType ~= XGuideManager.GuideType.Default then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_FUNCTION_EVENT_COMPLETE)
|
||
end
|
||
end
|
||
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUIDE_COMPLETED_SUCCESS, guideId)
|
||
end
|
||
-- 消息相关end --
|
||
XGuideManager.Init()
|
||
|
||
return XGuideManager
|
||
end
|
||
|
||
XRpc.NotifyGuide = function(data)
|
||
XDataCenter.GuideManager.OnSyncGuideData(data.GuideGroupId)
|
||
end |