NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/FunctionLock/FunctionLockManager.cs

109 lines
3.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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条件idvalue:功能锁
/// </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);
}
}
}