using LitJson;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using UnityEngine;
|
|
public enum PhantasmPavilionTab
|
{
|
Avatar, // 0 - 头像
|
AvatarFrame, // 1 - 头像框
|
ChatExpression, // 2 - 聊天表情
|
ChatBubble // 3 - 聊天气泡
|
}
|
|
public class PhantasmPavilionModel : GameSystemManager<PhantasmPavilionModel>
|
{
|
public readonly int MaxItemRowCount = 2; // 一行展示x个物品
|
public readonly int MaxEmojiCount = 10;
|
public readonly int FuncId = 236;
|
private PhantasmPavilionTab m_SelectTab;
|
//当前选中的标签页
|
public PhantasmPavilionTab selectTab
|
{
|
get { return m_SelectTab; }
|
set
|
{
|
m_SelectTab = value;
|
TabChangeEvent?.Invoke();
|
}
|
}
|
|
private int m_selectItemId;
|
public int selectItemId
|
{
|
get { return m_selectItemId; }
|
set
|
{
|
m_selectItemId = value;
|
ItemIdChangeEvent?.Invoke();
|
}
|
}
|
|
//当前选中的表情包组
|
|
private int m_SelectEmojiPackID;
|
public int selectEmojiPackID
|
{
|
get { return m_SelectEmojiPackID; }
|
set
|
{
|
m_SelectEmojiPackID = value;
|
EmojiPackIDChangeEvent?.Invoke();
|
}
|
}
|
|
private Dictionary<PhantasmPavilionTab, IPhantasmPavilionTabHandler> handlers = new Dictionary<PhantasmPavilionTab, IPhantasmPavilionTabHandler>();
|
public Dictionary<PhantasmPavilionTab, Dictionary<int, PhantasmPavilionInfo>> infoDict = new Dictionary<PhantasmPavilionTab, Dictionary<int, PhantasmPavilionInfo>>();
|
public Dictionary<PhantasmPavilionTab, Dictionary<int, int>> defaultIDDict = new Dictionary<PhantasmPavilionTab, Dictionary<int, int>>();
|
public Dictionary<PhantasmPavilionTab, int> nowIDDict = new Dictionary<PhantasmPavilionTab, int>();
|
|
// 幻境阁入口红点 459
|
Redpoint mainRedPoint = new Redpoint(10101, MainRedDot.PhantasmPavilionRepoint);
|
|
//标签页红点 4591 - 4594
|
public Dictionary<PhantasmPavilionTab, Redpoint> tabRedPointDict = new Dictionary<PhantasmPavilionTab, Redpoint>();
|
|
public Dictionary<PhantasmPavilionTab, Dictionary<int, Redpoint>> itemRedPointDict = new Dictionary<PhantasmPavilionTab, Dictionary<int, Redpoint>>();
|
|
public event Action TabChangeEvent; //切换标签页
|
public event Action ItemIdChangeEvent; //切换选中项
|
public event Action EmojiPackIDChangeEvent; //切换选中项
|
public event Action UpdateFaceInfoEvent;
|
public event Action UpdateFacePicInfoEvent;
|
public event Action UpdateEmojiPackInfoEvent;
|
public event Action UpdateChatBubbleBoxInfoEvent;
|
public Action<string> SendChatAction;
|
|
|
public override void Init()
|
{
|
PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefreshEvent;
|
PackManager.Instance.refreshItemCountEvent += OnRefreshItemCountEvent;
|
GlobalTimeEvent.Instance.secondEvent += CheckRedPoint;
|
InitHandler();
|
InitTable();
|
InitRedPoint();
|
}
|
|
public override void Release()
|
{
|
PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefreshEvent;
|
PackManager.Instance.refreshItemCountEvent -= OnRefreshItemCountEvent;
|
GlobalTimeEvent.Instance.fiveSecondEvent -= CheckRedPoint;
|
}
|
|
private void OnRefreshItemCountEvent(PackType type, int arg2, int arg3)
|
{
|
m_CheckRedPoint = true;
|
}
|
|
bool m_CheckRedPoint = false;
|
void CheckRedPoint()
|
{
|
if (m_CheckRedPoint)
|
{
|
UpdateRedPoint();
|
m_CheckRedPoint = false;
|
}
|
}
|
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
infoDict.Clear();
|
}
|
|
public void OnPlayerLoginOk()
|
{
|
selectTab = PhantasmPavilionTab.Avatar;
|
var list = ShowItemList(selectTab, out int fristIndex);
|
if (!list.IsNullOrEmpty())
|
selectItemId = fristIndex;
|
|
nowIDDict[PhantasmPavilionTab.Avatar] = PlayerDatas.Instance.baseData.face;
|
nowIDDict[PhantasmPavilionTab.AvatarFrame] = PlayerDatas.Instance.baseData.facePic;
|
nowIDDict[PhantasmPavilionTab.ChatBubble] = (int)PlayerDatas.Instance.baseData.bubbleId;
|
}
|
|
private void OnPlayerDataRefreshEvent(PlayerDataType type)
|
{
|
if (type == PlayerDataType.Face)
|
{
|
nowIDDict[PhantasmPavilionTab.Avatar] = (int)PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.Face);
|
}
|
else if (type == PlayerDataType.FacePic)
|
{
|
nowIDDict[PhantasmPavilionTab.AvatarFrame] = (int)PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.FacePic);
|
}
|
else if (type == PlayerDataType.ExAttr10)
|
{
|
nowIDDict[PhantasmPavilionTab.ChatBubble] = (int)PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.ExAttr10);
|
}
|
|
if (type == PlayerDataType.LV)
|
{
|
UpdateRedPoint();
|
}
|
}
|
|
private void InitHandler()
|
{
|
handlers = new Dictionary<PhantasmPavilionTab, IPhantasmPavilionTabHandler>();
|
handlers[PhantasmPavilionTab.Avatar] = new PhantasmPavilionAvatarHandler();
|
handlers[PhantasmPavilionTab.AvatarFrame] = new PhantasmPavilionAvatarFrameHandler();
|
handlers[PhantasmPavilionTab.ChatExpression] = new PhantasmPavilionChatExpressionHandler();
|
handlers[PhantasmPavilionTab.ChatBubble] = new PhantasmPavilionChatBubbleHandler();
|
}
|
|
private void InitTable()
|
{
|
InitDefault();
|
}
|
|
private void InitRedPoint()
|
{
|
InitTabRedPoint();
|
InitItemRedPoint(PhantasmPavilionTab.Avatar, PlayerFaceConfig.GetKeys());
|
InitItemRedPoint(PhantasmPavilionTab.AvatarFrame, PlayerFacePicConfig.GetKeys());
|
InitItemRedPoint(PhantasmPavilionTab.ChatExpression, EmojiPackConfig.GetKeys());
|
InitItemRedPoint(PhantasmPavilionTab.ChatBubble, ChatBubbleBoxConfig.GetKeys());
|
}
|
|
private void InitDefault()
|
{
|
var tabValues = Enum.GetValues(typeof(PhantasmPavilionTab));
|
for (int i = 0; i < tabValues.Length; i++)
|
{
|
PhantasmPavilionTab tab = (PhantasmPavilionTab)tabValues.GetValue(i);
|
if (!defaultIDDict.ContainsKey(tab))
|
{
|
defaultIDDict[tab] = new Dictionary<int, int>();
|
}
|
}
|
|
var config = FuncConfigConfig.Get("PhantasmPavilion");
|
var jsonData = JsonMapper.ToObject(config.Numerical1);
|
List<string> keyList = jsonData.Keys.ToList();
|
for (int i = 0; i < keyList.Count; i++)
|
{
|
int key = int.Parse(keyList[i]);
|
int value = int.Parse(jsonData[keyList[i]].ToString());
|
defaultIDDict[PhantasmPavilionTab.Avatar][key] = value;
|
}
|
|
jsonData = JsonMapper.ToObject(config.Numerical2);
|
keyList = jsonData.Keys.ToList();
|
for (int i = 0; i < keyList.Count; i++)
|
{
|
int key = int.Parse(keyList[i]);
|
int value = int.Parse(jsonData[keyList[i]].ToString());
|
defaultIDDict[PhantasmPavilionTab.AvatarFrame][key] = value;
|
}
|
//defaultIDDict[PhantasmPavilionTab.ChatExpression][0] = int.Parse(config.Numerical3);
|
defaultIDDict[PhantasmPavilionTab.ChatBubble][0] = int.Parse(config.Numerical3);
|
}
|
|
private void InitTabRedPoint()
|
{
|
var values = Enum.GetValues(typeof(PhantasmPavilionTab));
|
for (int i = 0; i < values.Length; i++)
|
{
|
PhantasmPavilionTab tab = (PhantasmPavilionTab)values.GetValue(i);
|
int id = MainRedDot.PhantasmPavilionRepoint * 10 + (int)tab + 1;
|
tabRedPointDict[tab] = new Redpoint(MainRedDot.PhantasmPavilionRepoint, id);
|
}
|
}
|
|
private void InitItemRedPoint(PhantasmPavilionTab tab, List<int> idList)
|
{
|
if (!infoDict.ContainsKey(tab))
|
itemRedPointDict[tab] = new Dictionary<int, Redpoint>();
|
|
for (int i = 0; i < idList.Count; i++)
|
{
|
int id = idList[i];
|
int baseValue = MainRedDot.PhantasmPavilionRepoint * 10 + (int)tab + 1;
|
itemRedPointDict[tab][id] = new Redpoint(baseValue, baseValue * 10000 + id);
|
}
|
}
|
|
public void UpdateRedPoint()
|
{
|
var values = Enum.GetValues(typeof(PhantasmPavilionTab));
|
for (int i = 0; i < values.Length; i++)
|
{
|
PhantasmPavilionTab key = (PhantasmPavilionTab)values.GetValue(i);
|
tabRedPointDict[key].state = RedPointState.None;
|
var keyList = itemRedPointDict[key].Keys.ToList();
|
for (int j = 0; j < keyList.Count; j++)
|
{
|
int id = keyList[j];
|
itemRedPointDict[key][id].state = RedPointState.None;
|
//可激活
|
if (GetUnLockState(key, id) == 1)
|
{
|
itemRedPointDict[key][id].state = RedPointState.Simple;
|
|
if (selectTab != key)
|
{
|
tabRedPointDict[key].state = RedPointState.Simple;
|
}
|
}
|
|
}
|
}
|
}
|
|
|
public bool IsCustom(int faceID, out int customPlayerID)
|
{
|
customPlayerID = 0;
|
if (!PlayerFaceConfig.HasKey(faceID))
|
return false;
|
customPlayerID = PlayerFaceConfig.Get(faceID).CustomPlayerID;
|
if (customPlayerID <= 0)
|
return false;
|
return true;
|
}
|
|
|
//获取不同职业对应的默认值
|
public bool TryGetDefaultID(PhantasmPavilionTab key, int job, out int defaultID)
|
{
|
defaultID = 0;
|
if (defaultIDDict == null || !defaultIDDict.TryGetValue(key, out var dict) || dict == null)
|
return false;
|
// 尝试获取 job 对应的值,如果没有则获取 key 为 0 的值
|
return dict.TryGetValue(job, out defaultID) || dict.TryGetValue(0, out defaultID);
|
}
|
|
public bool TryGetNowShowID(PhantasmPavilionTab key, out int result)
|
{
|
result = 0;
|
int job = PlayerDatas.Instance.baseData.Job;
|
// 如果 nowIDDict 为空或没有当前 ID,直接尝试获取默认 ID
|
if (nowIDDict == null || !TryGetDefaultID(key, job, out int defaultID))
|
return false;
|
|
// 获取当前 ID,如果存在则赋值给 result
|
if (nowIDDict.TryGetValue(key, out int nowID) && IsUnlock(key, nowID))
|
{
|
result = nowID;
|
}
|
else
|
{
|
result = defaultID;
|
}
|
|
return true;
|
}
|
|
public bool TryGetInfo(PhantasmPavilionTab tab, int id, out PhantasmPavilionInfo info)
|
{
|
info = new PhantasmPavilionInfo();
|
if (!Has(tab, id))
|
return false;
|
if (infoDict == null || !infoDict.TryGetValue(tab, out var tempInfoDict))
|
{
|
// 定制的默认激活0星
|
if (IsCustom(id, out int customPlayerID))
|
{
|
if (customPlayerID == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
info = new PhantasmPavilionInfo()
|
{
|
ID = id,
|
Star = 0,
|
State = true
|
};
|
return true;
|
}
|
}
|
return false;
|
}
|
if (tempInfoDict == null || !tempInfoDict.TryGetValue(id, out info))
|
{
|
// 定制的默认激活0星
|
if (IsCustom(id, out int customPlayerID))
|
{
|
if (customPlayerID == PlayerDatas.Instance.baseData.PlayerID)
|
{
|
info = new PhantasmPavilionInfo()
|
{
|
ID = id,
|
Star = 0,
|
State = true
|
};
|
return true;
|
}
|
}
|
return false;
|
}
|
return true;
|
}
|
|
|
public List<int> ShowItemList(PhantasmPavilionTab tab, out int fristIndex)
|
{
|
fristIndex = 0;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return new List<int>();
|
|
var resList = handler.GetTableKeys();
|
resList.Sort((int a, int b) => Cmp(a, b, tab));
|
|
if (tab == PhantasmPavilionTab.Avatar)
|
{
|
for (int i = resList.Count - 1; i >= 0; i--)
|
{
|
int id = resList[i];
|
int[] JobShowList = PlayerFaceConfig.Get(id).JobShowList;
|
if (JobShowList != null && !JobShowList.Contains(PlayerDatas.Instance.baseData.Job) && resList.Contains(id))
|
{
|
resList.Remove(id);
|
}
|
}
|
}
|
|
fristIndex = resList.First();
|
return resList;
|
}
|
|
public int Cmp(int a, int b, PhantasmPavilionTab tab)
|
{
|
// 获取 a 和 b 的解锁状态
|
int stateA = GetUnLockState(tab, a);
|
int stateB = GetUnLockState(tab, b);
|
|
// 将状态重新定义为优先级排序数值:可激活 > 已激活 > 未激活最后
|
int priorityA = stateA == 1 ? 0 : (stateA == 2 ? 1 : 2);
|
int priorityB = stateB == 1 ? 0 : (stateB == 2 ? 1 : 2);
|
|
if (priorityA != priorityB)
|
{
|
return priorityA.CompareTo(priorityB);
|
}
|
|
// 如果激活状态相同,比较 SortNum
|
int sortNumA = GetSortNum(tab, a);
|
int sortNumB = GetSortNum(tab, b);
|
|
if (sortNumA != sortNumB)
|
{
|
if (tab == PhantasmPavilionTab.Avatar)
|
{
|
return sortNumB.CompareTo(sortNumA);
|
}
|
else
|
{
|
return sortNumA.CompareTo(sortNumB);
|
}
|
}
|
|
return a.CompareTo(b);
|
}
|
|
////获得当前状态 0 - 未激活 1 - 可激活 2 - 已激活
|
public int GetUnLockState(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return 0;
|
|
if (IsCustom(id, out int customPlayerID))
|
{
|
if (customPlayerID == PlayerDatas.Instance.baseData.PlayerID)
|
return 2;
|
return 0;
|
}
|
|
//没激活
|
if (!IsUnlock(tab, id))
|
{
|
//没有填激活物品
|
if (!TryGetUnLockNeedItem(tab, id, out int itemId, out int count))
|
return 0;
|
if (!ItemConfig.HasKey(itemId))
|
return 0;
|
ItemConfig itemConfig = ItemConfig.Get(itemId);
|
if (itemConfig.UseLV > PlayerDatas.Instance.baseData.LV)
|
return 0;
|
//激活物品数量不足
|
int hasCnt = PackManager.Instance.GetItemCountByID(PackType.Item, itemId);
|
if (hasCnt < count)
|
return 0;
|
return 1;
|
}
|
return 2;
|
}
|
|
//获得属性展示样式类型 0 加号 1 箭头 false不展示
|
public bool TryGetAttrShowType(PhantasmPavilionTab tab, int faceId, out int type)
|
{
|
type = 0;
|
//int unLockState = GetUnLockState(tab, faceId);// 0 - 未激活 1 - 可激活 2 - 已激活
|
// bool isHaveUnLockAttr = TryGetUnLockAttr(tab, selectItemId, out int[] lightAttrTypeArr, out int[] lightAttrValueArr);
|
|
// if (!isHaveUnLockAttr)
|
// return false;
|
|
return false;
|
}
|
|
|
#region 表情包接入相关
|
|
public List<int> GetUnlockIDList()
|
{
|
List<int> allList = EmojiPackConfig.GetKeys();
|
List<int> result = new List<int>();
|
for (int i = 0; i < allList.Count; i++)
|
{
|
int id = allList[i];
|
if (IsUnlock(PhantasmPavilionTab.ChatExpression, id))
|
{
|
result.Add(id);
|
}
|
}
|
return result;
|
}
|
|
public List<string> GetEmojiList(int id)
|
{
|
var info = FaceConfig.GetEmojiPackList();
|
if (info == null || !info.TryGetValue(id, out var list) || list == null)
|
return new List<string>();
|
return list;
|
}
|
|
public int GetShowEmojiInfo(float itemWidth, int id, out int rowCount, out int emojiCount, out int space)
|
{
|
emojiCount = 0;
|
rowCount = 0;
|
space = 0; // 默认值
|
|
int minSpace = 5; // 最小间隔
|
int maxSpace = 50; // 最大间隔
|
int width = Mathf.CeilToInt(itemWidth);
|
|
GetEmojiShowSize(id, out int emojiWidth, out int emojiHeight);
|
List<string> emojiList = GetEmojiList(id);
|
if (emojiList == null || emojiList.Count == 0 || emojiWidth == 0)
|
return 0;
|
|
int listCount = emojiList.Count;
|
emojiCount = Mathf.Min(MaxEmojiCount, Mathf.Min(width / emojiWidth, listCount));
|
|
if (emojiCount > 1)
|
{
|
int availableWidthForSpaces = width - (emojiCount * emojiWidth);
|
space = availableWidthForSpaces / (emojiCount - 1);
|
space = Mathf.Clamp(space, minSpace, maxSpace);
|
}
|
else
|
{
|
space = 0; // 没有空间可分配间隔或者间隔之间只有一个表情
|
}
|
|
rowCount = Mathf.CeilToInt((float)listCount / emojiCount);
|
return 0;
|
}
|
|
// 获得表情包中表情最大的尺寸
|
public void GetEmojiShowSize(int id, out int width, out int height)
|
{
|
width = 0;
|
height = 0;
|
|
List<string> emojiList = GetEmojiList(id);
|
if (emojiList.IsNullOrEmpty())
|
return;
|
|
for (int i = 0; i < emojiList.Count; i++)
|
{
|
string imgSrc = emojiList[i];
|
|
if (UIFrameMgr.Inst.ContainsDynamicImage(imgSrc))
|
{
|
List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(imgSrc);
|
if (!spriteList.IsNullOrEmpty())
|
{
|
for (int j = 0; j < spriteList.Count; j++)
|
{
|
UpdateMaxSize(spriteList[j], ref width, ref height);
|
}
|
}
|
}
|
else if (IconConfig.HasKey(imgSrc))
|
{
|
UnityEngine.Sprite sprite = UILoader.LoadSprite(imgSrc);
|
UpdateMaxSize(sprite, ref width, ref height);
|
}
|
}
|
}
|
|
// 更新最大尺寸的方法
|
private void UpdateMaxSize(UnityEngine.Sprite sprite, ref int width, ref int height)
|
{
|
float nowWidth = sprite.rect.width;
|
float nowHeight = sprite.rect.height;
|
if (width < nowWidth)
|
width = Mathf.CeilToInt(nowWidth);
|
if (height < nowHeight)
|
height = Mathf.CeilToInt(nowHeight);
|
}
|
|
#endregion
|
|
//获得自己的聊天气泡ID
|
public int GetNowChatBubbleID()
|
{
|
PhantasmPavilionTab key = PhantasmPavilionTab.ChatBubble;
|
int job = 0;
|
// 尝试获取当前 ID
|
if (nowIDDict.TryGetValue(key, out int nowID) && ChatBubbleBoxConfig.HasKey(nowID) && IsUnlock(key, nowID))
|
return nowID;
|
// 如果当前 ID 不存在或未解锁,尝试获取默认 ID
|
return TryGetDefaultID(key, job, out int defaultID) ? defaultID : -1;
|
}
|
|
//获得其他玩家的聊天气泡ID
|
public int GetNowOtherChatBubbleID(int nowID)
|
{
|
PhantasmPavilionTab key = PhantasmPavilionTab.AvatarFrame;
|
// 尝试获取当前 ID
|
if (ChatBubbleBoxConfig.HasKey(nowID))
|
return nowID;
|
// 如果当前 ID 不存在或未解锁,尝试获取默认 ID
|
return TryGetDefaultID(key, 0, out int defaultID) ? defaultID : -1;
|
}
|
|
public bool IsUnlock(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return false;
|
int unlockDefault = GetUnlockDefault(tab, id);
|
//配默认激活的 不做其他判定直接激活
|
if (unlockDefault == 1)
|
return true;
|
// 封包中没有
|
if (!TryGetInfo(tab, id, out var info))
|
return false;
|
// 状态是未激活
|
if (!info.State)
|
return false;
|
// 时效不为永久 且时效用完
|
if (info.EndTime > 0 && info.EndTime < TimeUtility.AllSeconds)
|
return false;
|
return true;
|
}
|
|
//是否有时效 true 有时间限制 false 永久(无时间限制)
|
public bool IsLimitTime(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return false;
|
int unlockDefault = GetUnlockDefault(tab, id);
|
int expireMinutes = GetExpireMinutes(tab, id);
|
//没找到
|
if (unlockDefault == -1 || expireMinutes == -1)
|
return false;
|
//默认激活的都是永久的,没有时效限制
|
if (unlockDefault == 1)
|
return false;
|
//时效分钟配0的都是永久的,没有时效限制
|
if (expireMinutes <= 0)
|
return false;
|
return true;
|
}
|
|
|
|
public void ShowImage(PhantasmPavilionTab tab, int id, ImageEx imgTitle)
|
{
|
if (!Has(tab, id))
|
return;
|
string image = GetImage(tab, id);
|
UIFrame frame = imgTitle.GetComponent<UIFrame>();
|
if (UIFrameMgr.Inst.ContainsDynamicImage(image))
|
{
|
if (frame == null)
|
frame = imgTitle.gameObject.AddComponent<UIFrame>();
|
|
List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(image);
|
if (!spriteList.IsNullOrEmpty())
|
{
|
imgTitle.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height);
|
}
|
|
imgTitle.raycastTarget = false;
|
frame.ResetFrame(image);
|
frame.enabled = true;
|
}
|
else
|
{
|
if (frame != null)
|
frame.enabled = false;
|
imgTitle.SetSprite(image);
|
imgTitle.SetNativeSize();
|
}
|
}
|
|
|
|
#region handler相关
|
|
public bool Has(PhantasmPavilionTab tab, int id)
|
{
|
if (!handlers.TryGetValue(tab, out var handler))
|
return false;
|
return handler.Has(id);
|
}
|
public string GetDescriptive(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return string.Empty;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return string.Empty;
|
return handler.GetDescriptive(id);
|
}
|
|
public int GetSortNum(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return 0;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return 0;
|
return handler.GetSortNum(id);
|
}
|
|
public string GetName(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return string.Empty;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return string.Empty;
|
return handler.GetName(id);
|
}
|
|
public string GetImage(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return string.Empty;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return string.Empty;
|
return handler.GetImage(id);
|
}
|
|
public int GetUnlockDefault(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return 0;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return 0;
|
return handler.GetUnlockDefault(id);
|
}
|
|
public int GetExpireMinutes(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return 0;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return 0;
|
return handler.GetExpireMinutes(id);
|
}
|
|
public bool IsUsing(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return false;
|
if (!TryGetNowShowID(tab, out int result))
|
return false;
|
return result == id;
|
}
|
|
public bool TryGetUnLockAttr(PhantasmPavilionTab tab, int id, out int[] lightAttrTypeArr, out int[] lightAttrValueArr)
|
{
|
lightAttrTypeArr = null;
|
lightAttrValueArr = null;
|
if (!Has(tab, id))
|
return false;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return false;
|
return handler.TryGetUnLockAttr(id, out lightAttrTypeArr, out lightAttrValueArr);
|
}
|
|
public bool TryGetUnLockNeedItem(PhantasmPavilionTab tab, int id, out int itemId, out int count)
|
{
|
itemId = 0;
|
count = 0;
|
if (!Has(tab, id))
|
return false;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return false;
|
return handler.TryGetUnLockNeedItem(id, out itemId, out count);
|
}
|
|
|
|
public bool TryGetEffectID(PhantasmPavilionTab tab, int id, out int effectID)
|
{
|
effectID = 0;
|
if (!Has(tab, id))
|
return false;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return false;
|
return handler.TryGetEffectID(id, out effectID);
|
}
|
|
|
|
|
public void SendUsePack(PhantasmPavilionTab tab, int id)
|
{
|
if (!Has(tab, id))
|
return;
|
if (!handlers.TryGetValue(tab, out var handler))
|
return;
|
handler.SendUsePack(id);
|
}
|
|
#endregion
|
|
#region 发封包
|
|
public void SendCA323UnLockPack(int itemIndex, int count)
|
{
|
var pack = new CA323_tagCMUseItems();
|
pack.ItemIndex = (byte)itemIndex;
|
pack.UseCnt = (ushort)count;
|
GameNetSystem.Instance.SendInfo(pack);
|
}
|
|
public void SendCB226FaceChange(int faceId)
|
{
|
var pack = new CB226_tagCMFaceChange();
|
pack.FaceID = (uint)faceId;
|
GameNetSystem.Instance.SendInfo(pack);
|
}
|
|
|
|
public void SendCB228FacePicChange(int facePicId)
|
{
|
var pack = new CB228_tagCMFacePicChange();
|
pack.FacePicID = (uint)facePicId;
|
GameNetSystem.Instance.SendInfo(pack);
|
}
|
|
|
|
public void SendCA230SetChatBubbleBox(int id)
|
{
|
CA230_tagCMSetChatBubbleBox pak = new CA230_tagCMSetChatBubbleBox();
|
pak.BubbleBoxType = (byte)id;
|
GameNetSystem.Instance.SendInfo(pak);
|
}
|
|
|
#endregion
|
|
#region 收封包
|
|
public void UpdateFaceInfo(HB117_tagMCFaceInfo vNetData)
|
{
|
if (!infoDict.ContainsKey(PhantasmPavilionTab.Avatar))
|
infoDict[PhantasmPavilionTab.Avatar] = new Dictionary<int, PhantasmPavilionInfo>();
|
for (int i = 0; i < vNetData.FaceList.Length; i++)
|
{
|
HB117_tagMCFaceInfo.tagMCFace tagMCFaces = vNetData.FaceList[i];
|
if (!infoDict[PhantasmPavilionTab.Avatar].ContainsKey((int)tagMCFaces.FaceID))
|
infoDict[PhantasmPavilionTab.Avatar][(int)tagMCFaces.FaceID] = new PhantasmPavilionInfo();
|
infoDict[PhantasmPavilionTab.Avatar][(int)tagMCFaces.FaceID].ID = (int)tagMCFaces.FaceID;
|
infoDict[PhantasmPavilionTab.Avatar][(int)tagMCFaces.FaceID].State = tagMCFaces.State == 1;
|
infoDict[PhantasmPavilionTab.Avatar][(int)tagMCFaces.FaceID].EndTime = tagMCFaces.EndTime;
|
}
|
UpdateRedPoint();
|
UpdateFaceInfoEvent?.Invoke();
|
}
|
|
public void UpdateFacePicInfo(HB118_tagMCFacePicInfo vNetData)
|
{
|
if (!infoDict.ContainsKey(PhantasmPavilionTab.AvatarFrame))
|
infoDict[PhantasmPavilionTab.AvatarFrame] = new Dictionary<int, PhantasmPavilionInfo>();
|
|
for (int i = 0; i < vNetData.FacePicList.Length; i++)
|
{
|
HB118_tagMCFacePicInfo.tagMCFacePic tagMCFacePics = vNetData.FacePicList[i];
|
if (!infoDict[PhantasmPavilionTab.AvatarFrame].ContainsKey((int)tagMCFacePics.FacePicID))
|
infoDict[PhantasmPavilionTab.AvatarFrame][(int)tagMCFacePics.FacePicID] = new PhantasmPavilionInfo();
|
infoDict[PhantasmPavilionTab.AvatarFrame][(int)tagMCFacePics.FacePicID].ID = (int)tagMCFacePics.FacePicID;
|
infoDict[PhantasmPavilionTab.AvatarFrame][(int)tagMCFacePics.FacePicID].State = tagMCFacePics.State == 1;
|
infoDict[PhantasmPavilionTab.AvatarFrame][(int)tagMCFacePics.FacePicID].EndTime = tagMCFacePics.EndTime;
|
}
|
UpdateRedPoint();
|
UpdateFacePicInfoEvent?.Invoke();
|
}
|
|
public void UpdateEmojiPackInfo(HA721_tagMCEmojiPackInfo vNetData)
|
{
|
if (!infoDict.ContainsKey(PhantasmPavilionTab.ChatExpression))
|
infoDict[PhantasmPavilionTab.ChatExpression] = new Dictionary<int, PhantasmPavilionInfo>();
|
|
for (int i = 0; i < vNetData.EmojiPackList.Length; i++)
|
{
|
HA721_tagMCEmojiPackInfo.tagMCEmojiPack emojiPack = vNetData.EmojiPackList[i];
|
if (!infoDict[PhantasmPavilionTab.ChatExpression].ContainsKey((int)emojiPack.PackID))
|
infoDict[PhantasmPavilionTab.ChatExpression][(int)emojiPack.PackID] = new PhantasmPavilionInfo();
|
infoDict[PhantasmPavilionTab.ChatExpression][(int)emojiPack.PackID].ID = (int)emojiPack.PackID;
|
infoDict[PhantasmPavilionTab.ChatExpression][(int)emojiPack.PackID].State = emojiPack.State == 1;
|
infoDict[PhantasmPavilionTab.ChatExpression][(int)emojiPack.PackID].EndTime = emojiPack.EndTime;
|
}
|
UpdateRedPoint();
|
UpdateEmojiPackInfoEvent?.Invoke();
|
}
|
|
public void UpdateChatBubbleBoxInfo(HA717_tagMCChatBubbleBoxState vNetData)
|
{
|
if (!infoDict.ContainsKey(PhantasmPavilionTab.ChatBubble))
|
infoDict[PhantasmPavilionTab.ChatBubble] = new Dictionary<int, PhantasmPavilionInfo>();
|
|
for (int i = 0; i < vNetData.BoxList.Length; i++)
|
{
|
HA717_tagMCChatBubbleBoxState.tagMCChatBubbleBox chatBubbleBox = vNetData.BoxList[i];
|
if (!infoDict[PhantasmPavilionTab.ChatBubble].ContainsKey((int)chatBubbleBox.BoxID))
|
infoDict[PhantasmPavilionTab.ChatBubble][(int)chatBubbleBox.BoxID] = new PhantasmPavilionInfo();
|
infoDict[PhantasmPavilionTab.ChatBubble][(int)chatBubbleBox.BoxID].ID = (int)chatBubbleBox.BoxID;
|
infoDict[PhantasmPavilionTab.ChatBubble][(int)chatBubbleBox.BoxID].State = chatBubbleBox.State == 1;
|
infoDict[PhantasmPavilionTab.ChatBubble][(int)chatBubbleBox.BoxID].EndTime = chatBubbleBox.EndTime;
|
}
|
UpdateRedPoint();
|
UpdateChatBubbleBoxInfoEvent?.Invoke();
|
}
|
|
#endregion
|
}
|
|
public class PhantasmPavilionInfo
|
{
|
public int ID; //ID
|
public bool State; //是否已激活
|
public uint EndTime; //到期时间戳,0为永久
|
public int Star; //星级
|
}
|