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 { /// /// 功能锁管理器 /// public sealed class FunctionLockManager : Singlenton, IInitable { /// /// 服务器功能锁id(按位存) /// private int ServerFunctionLockId; /// /// 条件对应的功能锁配置字典,key:条件id,value:功能锁 /// private Dictionary dicReaction; /// /// 功能锁弹窗 /// private FunctionUnlockPopUp functionUnlockPopUp; public void Init() { dicReaction = new Dictionary(); EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, OnInit); } public void Release() { EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, OnInit); dicReaction?.Clear(); } /// /// 初始化功能锁 /// public void InitFunctionLock() { ServerFunctionLockId = (int)Actor.Instance.Logic.GetCount((uint)LogicID.LockStatus); } /// /// 是否解锁 /// /// /// public bool IsUnlock(int id) { return (id & ServerFunctionLockId) == id; } /// /// 保存服务器 /// /// public void SaveServer(int flag) { int savaId = 1 << (flag - 1); ServerFunctionLockId |= savaId; NetHelper.SaveFunctionLock(ServerFunctionLockId); } /// /// 初始化 /// 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; } } /// /// 根据条件进行功能解锁 /// 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); } } }