109 lines
3.1 KiB
C#
109 lines
3.1 KiB
C#
using cfg.FunctionLockCfg;
|
||
using Framework;
|
||
using Framework.Condition;
|
||
using Gameplay.Net;
|
||
using Gameplay.PopUp;
|
||
using NLDPB;
|
||
using PhxhSDK;
|
||
using System.Collections.Generic;
|
||
|
||
namespace Gameplay.FunctionLock
|
||
{
|
||
/// <summary>
|
||
/// 功能锁管理器
|
||
/// </summary>
|
||
public sealed class FunctionLockManager : Singlenton<FunctionLockManager>, IInitable
|
||
{
|
||
/// <summary>
|
||
/// 服务器功能锁id(按位存)
|
||
/// </summary>
|
||
private int ServerFunctionLockId;
|
||
/// <summary>
|
||
/// 条件对应的功能锁配置字典,key:条件id,value:功能锁
|
||
/// </summary>
|
||
private Dictionary<int, DataFunctionLock> dicReaction;
|
||
/// <summary>
|
||
/// 功能锁弹窗
|
||
/// </summary>
|
||
private FunctionUnlockPopUp functionUnlockPopUp;
|
||
|
||
public void Init()
|
||
{
|
||
dicReaction = new Dictionary<int, DataFunctionLock>();
|
||
|
||
EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, OnInit);
|
||
}
|
||
|
||
public void Release()
|
||
{
|
||
EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, OnInit);
|
||
|
||
dicReaction?.Clear();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 初始化功能锁
|
||
/// </summary>
|
||
public void InitFunctionLock()
|
||
{
|
||
ServerFunctionLockId = (int)Actor.Instance.Logic.GetCount((uint)LogicID.LockStatus);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 是否解锁
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
public bool IsUnlock(int id)
|
||
{
|
||
return (id & ServerFunctionLockId) == id;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存服务器
|
||
/// </summary>
|
||
/// <param name="flag"></param>
|
||
public void SaveServer(int flag)
|
||
{
|
||
int savaId = 1 << (flag - 1);
|
||
ServerFunctionLockId |= savaId;
|
||
NetHelper.SaveFunctionLock(ServerFunctionLockId);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 初始化
|
||
/// </summary>
|
||
private void OnInit()
|
||
{
|
||
foreach (DataFunctionLock cfg in TableManager.Instance.Tables.FunctionLockConfig.DataList)
|
||
{
|
||
if (IsUnlock(cfg.ServerFlag)) // 已经解锁的不管
|
||
continue;
|
||
|
||
dicReaction[ConditionReactor.Instance.AddReaction(cfg.UnlockCondition, OnFunctionUnlockByCondition)] = cfg;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据条件进行功能解锁
|
||
/// </summary>
|
||
private void OnFunctionUnlockByCondition(bool conditionResult, object callBackParam, int reactionID)
|
||
{
|
||
if (!conditionResult)
|
||
return;
|
||
|
||
if (!dicReaction.TryGetValue(reactionID, out DataFunctionLock cfg))
|
||
return;
|
||
|
||
ConditionReactor.Instance.RemoveReaction(reactionID);
|
||
dicReaction.Remove(reactionID);
|
||
|
||
if (null == functionUnlockPopUp)
|
||
functionUnlockPopUp = new FunctionUnlockPopUp();
|
||
|
||
functionUnlockPopUp.AddFunctionUnlockCfg(cfg);
|
||
|
||
PopUpManager.Instance.AddPopUp(functionUnlockPopUp);
|
||
}
|
||
}
|
||
} |