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();
}
}
}