PGRData/Script/matrix/xmanager/XGuideManager.lua

533 lines
No EOL
17 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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