using cfg.FunctionLockCfg; using Framework; using Framework.Condition; using Gameplay.Net; using Gameplay.PopUp; using NLDPB; using PhxhSDK; using System; using System.Collections.Generic; namespace Gameplay.FunctionLock { /// /// 功能锁管理器 /// public sealed class FunctionLockManager : Singlenton, IInitable { /// /// 服务器功能锁id(按位存) /// private int ServerFunctionLockId; /// /// 功能锁弹窗 /// private FunctionUnlock_PopUp functionUnlockPopUp; /// /// 功能锁字典 /// private Dictionary dicFunctionLock; /// /// 记录本地功能是否解锁 /// private Dictionary dicIsFunctionUnLock; private List listTemp; /// /// 播放中的动画数量 /// private int playingAnimCount; /// /// 回调 /// private Action callback; /// /// 是否播放解锁动画中 /// public bool IsPlayingUnlockAnim { get { return playingAnimCount > 0; } } public void Init() { listTemp = new(); dicFunctionLock = new Dictionary(); dicIsFunctionUnLock = new Dictionary(); playingAnimCount = 0; EventManager.Instance.Register(EventManager.EventName.UIOpenByAnimComplete, OnUIOpenByAnimComplte); } public void Release() { EventManager.Instance.Unregister(EventManager.EventName.UIOpenByAnimComplete, OnUIOpenByAnimComplte); dicIsFunctionUnLock.Clear(); dicFunctionLock?.Clear(); } /// /// 初始化功能锁 /// public void InitFunctionLock() { #if FUNCTION_LOCK ServerFunctionLockId = (int)Actor.Instance.Logic.GetCount((uint)LogicID.LockStatus); foreach (DataFunctionLock cfg in TableManager.Instance.Tables.FunctionLockConfig.DataList) { if (IsUnlock(cfg.FunctionType)) // 已经解锁的不管 continue; dicIsFunctionUnLock[cfg.Id] = false; ConditionReactor.Instance.AddReaction(cfg.UnlockCondition, OnFunctionUnlockByCondition, cfg, true); } #endif } /// /// 功能是否解锁 /// /// /// public bool IsUnlock(E_Function functionType) { int id = (int)functionType; return (id & ServerFunctionLockId) == id; } /// /// 添加功能锁 /// public void AddFunctionLock(FunctionLock functionLock) { dicFunctionLock[functionLock.cfg.Id] = functionLock; } /// /// 移除功能锁 /// /// public void RemoveFunctionLock(int id) { dicFunctionLock.Remove(id); } /// /// 保存服务器 /// /// public void SaveServer(int flag) { int savaId = 1 << (flag - 1); ServerFunctionLockId |= savaId; NetHelper.SaveFunctionLock(ServerFunctionLockId); EventManager.Instance.Send(EventManager.EventName.FunctionUnLock, (E_Function)flag); } /// /// 添加动画状态 /// public void AddAnimState() { ++playingAnimCount; } /// /// 移除动画状态 /// public void RemoveAnimState() { if (playingAnimCount > 0) --playingAnimCount; if (0 == playingAnimCount) { callback?.Invoke(); callback = null; } } /// /// 添加回调 /// /// public void AddCallback(Action callbackAction) { callback += callbackAction; } /// /// 根据条件进行功能解锁 /// private void OnFunctionUnlockByCondition(bool conditionResult, object callBackParam, int reactionID) { if (!conditionResult) return; ConditionReactor.Instance.RemoveReaction(reactionID); if (callBackParam is not DataFunctionLock dataFunctionLock) { DebugUtil.LogError("参数错误"); return; } DataFunctionLock cfg = dataFunctionLock; dicIsFunctionUnLock[cfg.Id] = true; if (null == functionUnlockPopUp) functionUnlockPopUp = new FunctionUnlock_PopUp(); functionUnlockPopUp.AddFunctionLockCfg(cfg); PopUpManager.Instance.AddPopUp(functionUnlockPopUp); } /// /// UI完全打开完成 /// private void OnUIOpenByAnimComplte(string uiName) { foreach (FunctionLock functionLock in dicFunctionLock.Values) { if (null == functionLock) continue; if (functionLock.UIName != uiName) continue; if (!dicIsFunctionUnLock.TryGetValue(functionLock.cfg.Id, out bool isUnlock)) continue; if (isUnlock) listTemp.Add(functionLock); } foreach (FunctionLock functionLock in listTemp) { RemoveFunctionLock(functionLock.FunctionLockId); functionLock.PlayUnlockAnim(); } listTemp.Clear(); } } }