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;
///
/// 功能锁弹窗
///
private FunctionUnlockPopUp functionUnlockPopUp;
///
/// 功能锁字典
///
private Dictionary dicFunctionLock;
///
/// 记录本地功能是否解锁
///
private Dictionary dicIsFunctionUnLock;
private List listTemp;
public void Init()
{
listTemp = new();
dicFunctionLock = new Dictionary();
dicIsFunctionUnLock = new Dictionary();
EventManager.Instance.Register(EventManager.EventName.UIOpenByAnimComplete, OnUIOpenByaAnimComplte);
}
public void Release()
{
EventManager.Instance.Unregister(EventManager.EventName.UIOpenByAnimComplete, OnUIOpenByaAnimComplte);
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.ServerFlag)) // 已经解锁的不管
continue;
dicIsFunctionUnLock[cfg.Id] = false;
ConditionReactor.Instance.AddReaction(cfg.UnlockCondition, OnFunctionUnlockByCondition, cfg, true);
}
#endif
}
///
/// 是否解锁
///
///
///
public bool IsUnlock(int id)
{
return (id & ServerFunctionLockId) == id;
}
///
/// 添加功能锁
///
public void AddFunctionLock(FunctionLock functionLock)
{
dicFunctionLock[functionLock.FunctionLockCfgId] = functionLock;
}
///
/// 移除功能锁
///
///
public void RemoveFunctionLock(int id)
{
dicFunctionLock.Remove(id);
}
///
/// 保存服务器
///
///
public void SaveServer(int flag)
{
int savaId = 1 << (flag - 1);
ServerFunctionLockId |= savaId;
NetHelper.SaveFunctionLock(ServerFunctionLockId);
}
///
/// 根据条件进行功能解锁
///
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 FunctionUnlockPopUp();
functionUnlockPopUp.AddFunctionLockCfg(cfg);
PopUpManager.Instance.AddPopUp(functionUnlockPopUp);
}
///
/// UI完全打开完成
///
private void OnUIOpenByaAnimComplte(string uiName)
{
foreach (FunctionLock functionLock in dicFunctionLock.Values)
{
if (null == functionLock)
continue;
if (functionLock.UIName != uiName)
continue;
if (!dicIsFunctionUnLock.TryGetValue(functionLock.FunctionLockCfgId, out bool isUnlock))
continue;
if (isUnlock)
listTemp.Add(functionLock);
}
foreach (FunctionLock functionLock in listTemp)
{
RemoveFunctionLock(functionLock.FunctionLockCfgId);
functionLock.PlayUnlockAnim();
}
listTemp.Clear();
}
}
}