426 lines
14 KiB
C#
426 lines
14 KiB
C#
|
using Thousandto.Cfg.Data;
|
|||
|
using Thousandto.Code.Center;
|
|||
|
using Thousandto.Code.Global;
|
|||
|
using Thousandto.Plugins.Common;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
|
|||
|
using System.Text;
|
|||
|
using Thousandto.Core.Base;
|
|||
|
using UnityEngine;
|
|||
|
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;
|
|||
|
|
|||
|
namespace Thousandto.Code.Logic
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 主窗体的功能按钮处理系统
|
|||
|
/// </summary>
|
|||
|
public class MainFunctionSystem
|
|||
|
{
|
|||
|
#region//私有变量
|
|||
|
//整理后的功能按钮的字典数据
|
|||
|
private Dictionary<int, List<MainFunctionInfo>> _dataByPos = new Dictionary<int, List<MainFunctionInfo>>();
|
|||
|
//记录提醒信息
|
|||
|
private Dictionary<int, MainFunctionInfo> _dataByID = new Dictionary<int, MainFunctionInfo>();
|
|||
|
//缓存开启的功能ID,在某些地图中功能开启效果不展示,进入新的地图才展示
|
|||
|
private List<int> _cacheOpenFuncList = new List<int>();
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//静态属性
|
|||
|
//主窗体是否创建完成
|
|||
|
public static bool MainFormIsCreated { get; set; }
|
|||
|
//头顶界面是否显示
|
|||
|
public static bool HUDFormIsShowed { get; set; }
|
|||
|
//主菜单是否显示
|
|||
|
public static bool MainMenuIsShowed { get; set; }
|
|||
|
//引导界面是否显示
|
|||
|
public static bool GuideFormIsShowed { get; set; }
|
|||
|
//主窗体是否正在显示
|
|||
|
public static bool IsShowingMainForm { get; set; }
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//静态构造函数
|
|||
|
static MainFunctionSystem()
|
|||
|
{
|
|||
|
MainFormIsCreated = false;
|
|||
|
HUDFormIsShowed = false;
|
|||
|
MainMenuIsShowed = false;
|
|||
|
GuideFormIsShowed = false;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//公共接口: 根据功能ID打开相应功能的
|
|||
|
//通过功能ID的枚举码,来打开相应功能
|
|||
|
public void DoFunctionCallBack(int code, object param = null)
|
|||
|
{
|
|||
|
var funcData = GameCenter.MainFunctionSystem.GetFunctionInfo(code);
|
|||
|
if (funcData == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
if (!funcData.IsVisible)
|
|||
|
{
|
|||
|
ShowNotOpenTips(funcData);
|
|||
|
return;
|
|||
|
}
|
|||
|
//功能打开全部交给lua处理
|
|||
|
GameCenter.LuaSystem.Adaptor.DoFunctionCallBack(code, param);
|
|||
|
}
|
|||
|
|
|||
|
//显示功能未开启提示
|
|||
|
public void ShowNotOpenTips(int code)
|
|||
|
{
|
|||
|
GameCenter.LuaSystem.Adaptor.ShowFuncNotOpenTips(code);
|
|||
|
}
|
|||
|
public void ShowNotOpenTips(MainFunctionInfo funcData)
|
|||
|
{
|
|||
|
if (funcData == null)
|
|||
|
return;
|
|||
|
ShowNotOpenTips(funcData.ID);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region //公共接口: 初始化, 功能列表获取,功能设置
|
|||
|
//初始化
|
|||
|
public void Initialize()
|
|||
|
{
|
|||
|
MainMenuIsShowed = false;
|
|||
|
//遍历功能配置表,填充到字典中
|
|||
|
var e = DeclareFunctionStart.CacheData.GetEnumerator();
|
|||
|
try
|
|||
|
{
|
|||
|
while (e.MoveNext())
|
|||
|
{
|
|||
|
var cfg = e.Current.Value;
|
|||
|
var info = new MainFunctionInfo(cfg);
|
|||
|
_dataByID.Add((int)info.ID, info);
|
|||
|
|
|||
|
List<MainFunctionInfo> list = null;
|
|||
|
if (_dataByPos.TryGetValue(cfg.FunctionPosType, out list))
|
|||
|
{
|
|||
|
list.Add(info);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
list = new List<MainFunctionInfo>();
|
|||
|
list.Add(info);
|
|||
|
_dataByPos.Add(cfg.FunctionPosType, list);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
e.Dispose();
|
|||
|
}
|
|||
|
|
|||
|
//遍历字典,链接父子关系
|
|||
|
var e2 = _dataByID.GetEnumerator();
|
|||
|
try
|
|||
|
{
|
|||
|
while (e2.MoveNext())
|
|||
|
{
|
|||
|
var curValue = e2.Current.Value;
|
|||
|
if (curValue.Cfg.ParentId != curValue.Cfg.FunctionId)
|
|||
|
{
|
|||
|
MainFunctionInfo parent = null;
|
|||
|
if (_dataByID.TryGetValue(curValue.Cfg.ParentId, out parent))
|
|||
|
{
|
|||
|
curValue.SetParent(parent);
|
|||
|
parent.AddChild(curValue);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
e2.Dispose();
|
|||
|
}
|
|||
|
|
|||
|
//遍历字典数据,对其中的链表进行排序
|
|||
|
var e1 = _dataByPos.GetEnumerator();
|
|||
|
try
|
|||
|
{
|
|||
|
while (e1.MoveNext())
|
|||
|
{
|
|||
|
e1.Current.Value.Sort(Comparison);
|
|||
|
}
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
e1.Dispose();
|
|||
|
}
|
|||
|
_cacheOpenFuncList.Clear();
|
|||
|
|
|||
|
SetFunctionEffectByAlert(FunctionStartIdCode.RealmStifle, true);
|
|||
|
//仙人留步功能设置为false,防止登录时关闭弹出此界面
|
|||
|
SetFunctionEnabled(FunctionStartIdCode.ExitRewardTips, false);
|
|||
|
}
|
|||
|
//卸载化
|
|||
|
public void Uninitialize()
|
|||
|
{
|
|||
|
_dataByID.Clear();
|
|||
|
_dataByPos.Clear();
|
|||
|
_cacheOpenFuncList.Clear();
|
|||
|
}
|
|||
|
|
|||
|
//获取功能信息
|
|||
|
public MainFunctionInfo GetFunctionInfo(int id)
|
|||
|
{
|
|||
|
MainFunctionInfo result = null;
|
|||
|
_dataByID.TryGetValue(id, out result);
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
//获取功能列表 -- 根据位置类型
|
|||
|
public List<MainFunctionInfo> GetFunctionList(MainFunctionPosType posType)
|
|||
|
{
|
|||
|
if (_dataByPos.ContainsKey((int)posType))
|
|||
|
{
|
|||
|
return _dataByPos[(int)posType];
|
|||
|
}
|
|||
|
return new List<MainFunctionInfo>();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//设置功能效果是否显示
|
|||
|
public void SetFunctionEffect(int code, bool isShow)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(code);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
info.SetEffectEnabled(isShow);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//设置功能效果是否根据红点显示
|
|||
|
public void SetFunctionEffectByAlert(int code, bool value)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(code);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
info.SetEffectByAlert(value);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//设置功能副标题
|
|||
|
public void SetFunctionLittleName(int code, string name)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(code);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
info.SetLittleName(name);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//设置功能是否显示在主界面上
|
|||
|
public void SetFunctionVisible(int code, bool isShow)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(code);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
info.SetIsVisible(isShow);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//设置功能是否开启
|
|||
|
public void SetFunctionEnabled(int code, bool enable)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(code);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
info.SetEnabled(enable);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//设置警告标记
|
|||
|
public void SetAlertFlag(int id, bool alertFlag)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(id);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
info.IsShowRedPoint = alertFlag;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//获取提醒标记
|
|||
|
public bool GetAlertFlag(int id)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(id);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
return info.IsShowRedPoint;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//功能是否开放
|
|||
|
public bool FunctionIsEnabled(int id)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(id);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
return info.IsEnable;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//功能是否开放
|
|||
|
public bool FunctionIsVisible(int id)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(id);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
return info.IsVisible;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
//功能是否在跨服中不可使用
|
|||
|
public bool FunctionIsCanNotUseInCross(int id)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(id);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
return info.IsCanNotUseInCross;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
//功能是否在跨服中开放
|
|||
|
public bool FuncationIsEnabledInCorss(int id)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(id);
|
|||
|
if (info != null)
|
|||
|
return info.FuncationInCross;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//进入场景,缓存的功能处理
|
|||
|
public void OnEnterScene()
|
|||
|
{
|
|||
|
if (GameCenter.MapLogicSwitch.ShowNewFunction && _cacheOpenFuncList.Count > 0)
|
|||
|
{
|
|||
|
for (int i = 0; i < _cacheOpenFuncList.Count; ++i)
|
|||
|
{
|
|||
|
//新功能开启界面
|
|||
|
GameCenter.BlockingUpPromptSystem.AddNewFunction(1, _cacheOpenFuncList[i]);
|
|||
|
//新功能开启引导检测
|
|||
|
GameCenter.GuideSystem.Check(GuideTriggerType.SystemOpen, _cacheOpenFuncList[i]);
|
|||
|
}
|
|||
|
_cacheOpenFuncList.Clear();
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//网络服务器接口处理
|
|||
|
//功能是否开启的初始化的消息处理
|
|||
|
public void GS2U_ResFuncOpenList(MSG_Backend.ResFuncOpenList result)
|
|||
|
{
|
|||
|
var msgTmpDic = new Dictionary<int, int>(result.funcOpenList.Count);
|
|||
|
for (int i = 0; i < result.funcOpenList.Count; ++i)
|
|||
|
{
|
|||
|
msgTmpDic[result.funcOpenList[i].id] = result.funcOpenList[i].state;
|
|||
|
}
|
|||
|
|
|||
|
var iter = _dataByID.GetEnumerator();
|
|||
|
try
|
|||
|
{
|
|||
|
while (iter.MoveNext())
|
|||
|
{
|
|||
|
var info = iter.Current.Value;
|
|||
|
bool open = true;
|
|||
|
bool getAward = false;
|
|||
|
var state = 0;
|
|||
|
if (msgTmpDic.TryGetValue(info.Cfg.FunctionId, out state))
|
|||
|
{
|
|||
|
open = state != 0;
|
|||
|
getAward = state == 2;
|
|||
|
}
|
|||
|
|
|||
|
info.SetEnabled(open);
|
|||
|
info.SetGetAward(getAward);
|
|||
|
if (open)
|
|||
|
{
|
|||
|
//功能开启处理
|
|||
|
OnFunctionOpened(info.ID, false);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
iter.Dispose();
|
|||
|
}
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_SYNC_FUNCTION_INFO);
|
|||
|
}
|
|||
|
|
|||
|
//功能开启状态切换的消息处理
|
|||
|
public void ResSwitchFunction(MSG_Backend.ResSwitchFunction result)
|
|||
|
{
|
|||
|
var list = result.switchFuncList;
|
|||
|
list.Sort((a, b) => { return b.id - a.id; });
|
|||
|
for (int i = 0; i < list.Count; ++i)
|
|||
|
{
|
|||
|
var msgInfo = list[i];
|
|||
|
var info = GetFunctionInfo(msgInfo.id);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
info.SetEnabled(msgInfo.state != 0);
|
|||
|
info.SetGetAward(msgInfo.state == 2);
|
|||
|
|
|||
|
if (msgInfo.state != 0)
|
|||
|
{
|
|||
|
if (result.isnew)
|
|||
|
{
|
|||
|
if (!GameCenter.MapLogicSwitch.ShowNewFunction)
|
|||
|
{
|
|||
|
_cacheOpenFuncList.Add(msgInfo.id);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//新功能开启界面
|
|||
|
GameCenter.BlockingUpPromptSystem.AddNewFunction(1, msgInfo.id);
|
|||
|
//新功能开启引导检测
|
|||
|
GameCenter.GuideSystem.Check(GuideTriggerType.SystemOpen, msgInfo.id);
|
|||
|
}
|
|||
|
}
|
|||
|
//功能开启处理
|
|||
|
OnFunctionOpened(info.ID, result.isnew);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_SYNC_FUNCTION_INFO);
|
|||
|
}
|
|||
|
|
|||
|
//领取奖励状态更新
|
|||
|
public void GS2U_ResFuncOpenReward(MSG_Backend.ResFuncOpenReward result)
|
|||
|
{
|
|||
|
//领取成功
|
|||
|
var cfg = DeclareFunctionOpenTips.Get(result.id);
|
|||
|
if (cfg != null)
|
|||
|
{
|
|||
|
var info = GetFunctionInfo(cfg.FunctionId);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
info.SetGetAward(true);
|
|||
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_SYNC_FUNCTION_INFO);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//私有方法
|
|||
|
//两个功能配置的比较方法---用于list的排序
|
|||
|
private int Comparison(MainFunctionInfo x, MainFunctionInfo y)
|
|||
|
{
|
|||
|
return x.SortNum - y.SortNum;
|
|||
|
}
|
|||
|
|
|||
|
//处理功能开启事件
|
|||
|
public void OnFunctionOpened(int idCode, bool isNew)
|
|||
|
{
|
|||
|
//功能开启事件全部交给lua处理
|
|||
|
GameCenter.LuaSystem.Adaptor.OnFunctionOpened(idCode, isNew);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|