using UnityEngine; using System.Collections; using System.Collections.Generic; using System; using LitJson; public class NewBieCenter : GameSystemManager { int m_CurrentGuide = 0; public int currentGuide { get { return m_CurrentGuide; } set { m_CurrentGuide = value; } } int m_GuideStep = 0; public int guideStep { get { return m_GuideStep; } private set { m_GuideStep = value; } } public bool inGuiding { // 当前有引导,并且不是暂停状态,则在引导中 get { return currentGuide != 0 && IsNeedRecord(currentGuide); } } List allGuides = new List(); public List completeGuidesBuf = new List(); //因其他原因导致的等待显示的引导窗口,在OpenWindow时会触发复查,但时机太晚增加关闭界面时触发 List waitGuideWinNames = new List(); bool inited = false; public event Action guideStepChangeEvent; public event Action guideBeginEvent; public event Action guideCompletedEvent; public override void Init() { TaskManager.Instance.OnTaskUpdate += OnTaskUpdateEvent; TaskManager.Instance.OnTaskClick += OnTaskClickEvent; FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh; UIManager.Instance.OnOpenWindow += OnOpenWindow; UIManager.Instance.OnCloseWindow += OnCloseWindow; OfficialRankManager.Instance.OnOfficialCanLVUpEvent += OnOfficialCanLVUpEvent; } public override void Release() { TaskManager.Instance.OnTaskUpdate -= OnTaskUpdateEvent; TaskManager.Instance.OnTaskClick -= OnTaskClickEvent; FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh; UIManager.Instance.OnOpenWindow -= OnOpenWindow; UIManager.Instance.OnCloseWindow -= OnCloseWindow; OfficialRankManager.Instance.OnOfficialCanLVUpEvent -= OnOfficialCanLVUpEvent; } void OnOfficialCanLVUpEvent() { var guides = GuideConfig.GetGuideListByType((int)GuideTriggerType.Realm); if (guides != null) { TryStartNewBieGuides(guides, true); } } void OnOpenWindow(UIBase _ui) { var guides = GuideConfig.GetGuideListByWinName(_ui.name); if (guides != null) { TryStartNewBieGuides(guides); } } //关闭其他界面时复查有没需要等待的引导 void OnCloseWindow(UIBase _ui) { foreach (var winName in waitGuideWinNames) { var guides = GuideConfig.GetGuideListByWinName(winName); if (guides != null) { if (TryStartNewBieGuides(guides)) { break; } } } if (_ui.name == "StoryBossBattleWin") { var guides = GuideConfig.GetGuideListByType((int)GuideTriggerType.PassMainBoss); if (guides != null) { TryStartNewBieGuides(guides, true); } } } void OnTaskUpdateEvent() { var guides = GuideConfig.GetGuideListByType((int)GuideTriggerType.MainLineQuestCanDo); if (guides != null) { TryStartNewBieGuides(guides); } } void OnTaskClickEvent() { var guides = GuideConfig.GetGuideListByType((int)GuideTriggerType.MissionClick); if (guides != null) { TryStartNewBieGuides(guides, true); } } void OnFuncStateChangeEvent(int _funcId) { var guides = GuideConfig.GetGuideListByType((int)GuideTriggerType.FunctionOpen); if (guides != null) { TryStartNewBieGuides(guides); } } void PlayerDataRefresh(PlayerDataType type) { if (type == PlayerDataType.LV) { var guides = GuideConfig.GetGuideListByType((int)GuideTriggerType.Level); if (guides != null) { TryStartNewBieGuides(guides); } } else if (type == PlayerDataType.ExAttr1) { var guides = GuideConfig.GetGuideListByType((int)GuideTriggerType.Map); if (guides != null) { TryStartNewBieGuides(guides); } } } public bool IsGuideCompleted(int guideId) { return completeGuidesBuf.Contains(guideId); } // 服务器记录的引导进度 public void ResetGuideRecords(uint[] _guideRecords) { completeGuidesBuf.Clear(); if (_guideRecords == null || _guideRecords.Length == 0) { return; } for (int i = 0; i < _guideRecords.Length; i++) { var guideRecord = _guideRecords[i]; for (ushort j = 0; j < 31; j++) { if (MathUtility.GetBitValue(guideRecord, j)) { completeGuidesBuf.Add(i * 31 + j); } } } } //找出可进行的引导 //isOrgTrigger 是否是原生触发,如点击的只能是原生触发,其他的都不能 public bool TryStartNewBieGuides(List _guides, bool isOrgTrigger = false) { if (!inited) { var allGuideConfigs = GuideConfig.GetValues(); foreach (var config in allGuideConfigs) { allGuides.Add(config.ID); } inited = true; } if (_guides == null) { return false; } if (currentGuide != 0 && GuideConfig.Get(currentGuide).NoRecord == 0) { // 可重复触发的引导属于低优先级 会被新引导替换 return false; } for (int i = 0; i < _guides.Count; i++) { var guideId = _guides[i]; if (completeGuidesBuf.Contains(guideId)) { continue; } var config = GuideConfig.Get(guideId); if (config.PreGuideId != 0 && !completeGuidesBuf.Contains(config.PreGuideId)) { // 如果前置引导没有完成,则跳过 continue; } if (currentGuide != guideId && CheckGuideCondition(guideId, isOrgTrigger)) { return StartNewBieGuide(guideId); } } return false; } bool WaitGuide(int _id) { var config = GuideConfig.Get(_id); //要引导的界面上有其他界面盖住,加入队列等待其他界面关闭的时候再触发该界面引导 if (UIManager.Instance.ExistAnyFullScreenOrMaskWinAbove(config.WinName)) { //如果子界面是必须挂在该界面上切且没有蒙版盖住的可以增加判断 if (!waitGuideWinNames.Contains(config.WinName)) { waitGuideWinNames.Add(config.WinName); } return true; } return false; } public bool StartNewBieGuide(int _id) { if (_id == 0) { Debug.LogError("请检查引导id = 0 的情况"); return false; } _id = ReplaceGuideID(_id); var config = GuideConfig.Get(_id); if (config == null) { Debug.LogError($"没有该引导ID,请检查引导id = {_id} 的情况"); return false; } if (WaitGuide(_id)) { return false; } if (waitGuideWinNames.Contains(config.WinName)) { waitGuideWinNames.Remove(config.WinName); } currentGuide = _id; guideStep = config.Steps.Length > 0 ? config.Steps[0] : 0; var stepConfig = ScriptableObjectLoader.LoadSoNewBieGuideStep(guideStep); TryPauseStoryBattle(); if (guideBeginEvent != null) { guideBeginEvent(); } if (!UIManager.Instance.IsOpened()) { UIManager.Instance.OpenWindow(); } else { guideStepChangeEvent?.Invoke(); } UIManager.Instance.CloseWindow(); return true; } public void TryPauseStoryBattle() { var stepConfig = ScriptableObjectLoader.LoadSoNewBieGuideStep(guideStep); if (!(stepConfig.guideType == GuideType.NewBie && stepConfig.clickCompleteNoMask)) { // 非强制引导不暂停战斗,如有具体需要可以增加字段 BattleManager.Instance.storyBattleField.IsPause = true; } } //非0代表 可重复引导,且优先级低会被新引导替换,且不暂停主线战斗 public bool IsNeedRecord(int _id) { var config = GuideConfig.Get(_id); if (config == null) { return false; } return GuideConfig.Get(_id).NoRecord == 0; } public void FinishNewBieGuide(int _id) { var guideRecord = currentGuide; currentGuide = 0; UIManager.Instance.CloseWindow(); if (IsNeedRecord(_id)) { if (!completeGuidesBuf.Contains(guideRecord)) { completeGuidesBuf.Add(guideRecord); } var send = new CA222_tagCMSetGuideOK(); send.GuideIndex = (byte)_id; send.IsOK = 1; GameNetSystem.Instance.SendInfo(send); } if (guideCompletedEvent != null) { guideCompletedEvent(guideRecord); } BattleManager.Instance.storyBattleField.IsPause = false; } public void RemoveNewBieGuide(int _id) { if (IsNeedRecord(_id)) { if (!completeGuidesBuf.Contains(_id)) { completeGuidesBuf.Add(_id); } var send = new CA222_tagCMSetGuideOK(); send.GuideIndex = (byte)_id; send.IsOK = 1; GameNetSystem.Instance.SendInfo(send); } } public void FinishCurrentGuideWithoutCloseWin() { var guideRecord = currentGuide; currentGuide = 0; if (IsNeedRecord(guideRecord)) { if (!completeGuidesBuf.Contains(guideRecord)) { completeGuidesBuf.Add(guideRecord); } var send = new CA222_tagCMSetGuideOK(); send.GuideIndex = (byte)guideRecord; send.IsOK = 1; GameNetSystem.Instance.SendInfo(send); } if (guideCompletedEvent != null) { guideCompletedEvent(guideRecord); } BattleManager.Instance.storyBattleField.IsPause = false; } public void ReportGuideStepComplete(int _step) { if (_step == guideStep) { var config = GuideConfig.Get(currentGuide); if (config == null) { guideStep = 0; FinishNewBieGuide(currentGuide); return; } var stepIndex = Array.IndexOf(config.Steps, _step); if (stepIndex < config.Steps.Length - 1) { guideStep = config.Steps[stepIndex + 1]; if (guideStepChangeEvent != null) { guideStepChangeEvent(); } } else { guideStep = 0; FinishNewBieGuide(currentGuide); } } } //isOrgTrigger 是否是原生触发,如点击的只能是原生触发,其他的都不能 public bool CheckGuideCondition(int _guideId, bool isOrgTrigger) { var config = GuideConfig.Get(_guideId); if (config == null) { return false; } if (!UIManager.Instance.IsOpened(config.WinName)) { return false; } switch ((GuideTriggerType)config.TriggerType) { case GuideTriggerType.None: if (isOrgTrigger) return true; return false; case GuideTriggerType.FunctionOpen: return FuncOpen.Instance.IsFuncOpen(config.Condition); case GuideTriggerType.Level: return PlayerDatas.Instance.baseData.LV >= config.Condition; case GuideTriggerType.Realm: return PlayerDatas.Instance.baseData.realmLevel >= config.Condition && OfficialRankManager.Instance.CanOfficialLVUP(); case GuideTriggerType.OpenWindow: return UIManager.Instance.IsOpened(config.WinName); case GuideTriggerType.MainLineQuestCanDo: if (config.SupplementCondition == 2) { return TaskManager.Instance.mainTask.TaskID == config.Condition && TaskManager.Instance.GetMainTaskState() == 2; } return TaskManager.Instance.mainTask.TaskID == config.Condition; case GuideTriggerType.Map: return PlayerDatas.Instance.baseData.ExAttr1 >= config.Condition; case GuideTriggerType.MissionClick: //只有真正点击才可以触发 if (isOrgTrigger) { return TaskManager.Instance.GetMainTaskType() == config.Condition && TaskManager.Instance.GetMainTaskState() != 2; } return false; case GuideTriggerType.PassMainBoss: return PlayerDatas.Instance.baseData.ExAttr1/100 >= config.Condition; default: return false; } } public void CompleteAllGuides() { var send = new CA222_tagCMSetGuideOK(); send.GuideIndex = 255; send.IsOK = 1; GameNetSystem.Instance.SendInfo(send); currentGuide = 0; UIManager.Instance.CloseWindow(); completeGuidesBuf.Clear(); var allGuideKeys = GuideConfig.GetKeys(); for (int i = 0; i < allGuideKeys.Count; i++) { if (IsNeedRecord(allGuideKeys[i])) { completeGuidesBuf.Add(allGuideKeys[i]); } } } public void ResetAllGuides() { var send = new CA222_tagCMSetGuideOK(); send.GuideIndex = 255; send.IsOK = 0; GameNetSystem.Instance.SendInfo(send); currentGuide = 0; UIManager.Instance.CloseWindow(); completeGuidesBuf.Clear(); } public void ResetGuide(int _guide) { var _List = GuideConfig.GetGuideList(_guide); if (_List == null) return; foreach (var guideID in _List) { var send = new CA222_tagCMSetGuideOK(); send.GuideIndex = (byte)guideID; send.IsOK = 0; GameNetSystem.Instance.SendInfo(send); completeGuidesBuf.Remove(guideID); } } //动态变化引导 public int ReplaceGuideID(int id) { if (id == BattleManager.Instance.challengeBossGuides[0] && MainLevelManager.Instance.CanChallengeBoss()) { return BattleManager.Instance.challengeBossGuides[1]; } return id; } } public enum GuideTriggerType { None = 999, //无限制 效果同5 MainLineQuestCanDo = 1, //主线任务 (如首次进入游戏按任务接取引导) FunctionOpen = 2, //功能开放 Map = 3, //地图(关卡副本) 玩家数据ExAttr1 20103代表当前已经过了第2章第1关第3波 MissionClick = 4, //点击任务按任务类型引导 OpenWindow = 5, //打开界面的时机 如装备替换界面 Level = 6, //等级满足条件 Realm = 7, //官职所有任务完成时触发引导,如6升7,6的任务全部完成,配置6 PassMainBoss = 8, //通关主线BOSS,在关闭界面StoryBossBattleWin时触发,触发条件为通关后的关卡如201 }