forked from endernon/PGRData
533 lines
17 KiB
Lua
533 lines
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
|