using UnityEngine;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System;
|
using LitJson;
|
|
|
|
public class NewBieCenter : GameSystemManager<NewBieCenter>
|
{
|
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; }
|
}
|
|
List<int> allGuides = new List<int>();
|
public List<int> completeGuidesBuf = new List<int>();
|
|
//因其他原因导致的等待显示的引导窗口,在OpenWindow时会触发复查,但时机太晚增加关闭界面时触发
|
List<string> waitGuideWinNames = new List<string>();
|
|
bool inited = false;
|
|
public event Action guideStepChangeEvent;
|
public event Action guideBeginEvent;
|
public event Action<int> 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;
|
}
|
|
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;
|
}
|
|
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;
|
}
|
}
|
}
|
}
|
|
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<int> _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)
|
{
|
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.ExistAnyFullScreenOrMaskWin(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;
|
}
|
|
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);
|
}
|
|
BattleManager.Instance.storyBattleField.IsPause = true;
|
currentGuide = _id;
|
|
guideStep = config.Steps.Length > 0 ? config.Steps[0] : 0;
|
|
if (guideBeginEvent != null)
|
{
|
guideBeginEvent();
|
}
|
|
if (!UIManager.Instance.IsOpened<NewBieWin>())
|
{
|
UIManager.Instance.OpenWindow<NewBieWin>();
|
}
|
else
|
{
|
guideStepChangeEvent?.Invoke();
|
}
|
UIManager.Instance.CloseWindow<ChatWin>();
|
return true;
|
|
}
|
|
bool IsNeedRecord(int _id)
|
{
|
return GuideConfig.Get(_id).NoRecord == 0;
|
}
|
|
public void FinishNewBieGuide(int _id)
|
{
|
var guideRecord = currentGuide;
|
currentGuide = 0;
|
|
UIManager.Instance.CloseWindow<NewBieWin>();
|
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:
|
return true;
|
case GuideTriggerType.FunctionOpen:
|
return FuncOpen.Instance.IsFuncOpen(config.Condition);
|
case GuideTriggerType.Level:
|
return PlayerDatas.Instance.baseData.LV >= config.Condition;
|
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;
|
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<NewBieWin>();
|
|
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<NewBieWin>();
|
|
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 enum GuideTriggerType
|
{
|
None = 999, //无限制 效果同5
|
MainLineQuestCanDo = 1, //主线任务 (如首次进入游戏按任务接取引导)
|
FunctionOpen = 2, //功能开放
|
Map = 3, //地图(关卡副本) 玩家数据ExAttr1 20103代表当前已经过了第2章第1关第3波
|
MissionClick = 4, //点击任务按任务类型引导
|
OpenWindow = 5, //打开界面的时机 如装备替换界面
|
Level = 6, //等级满足条件
|
|
}
|