using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Text;
|
|
using UnityEngine;
|
|
public class VirtualPackManager : GameSystemManager<VirtualPackManager>
|
{
|
Dictionary<PackType, List<VirtualPackItem>> virtualPackItems
|
= new Dictionary<PackType, List<VirtualPackItem>>();
|
Dictionary<PackType, ObjectPool<VirtualPackItem>> m_VirtualItemPool
|
= new Dictionary<PackType, ObjectPool<VirtualPackItem>>();
|
Dictionary<PackType, int> virtualPackCapacityDict = new Dictionary<PackType, int>();
|
|
public event Action<PackType> virtualPackRefresh;
|
int getA206Count = 0; //收到了几次A206包
|
bool isFrist = false; //是不是第一次获得聚魂碎片
|
Dictionary<int, int> noPackItemCountDict = new Dictionary<int, int>(); //无需背包的物品数量刷新,自动转化为数值
|
public event Action OnNoPackItemCountRefresh;
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
foreach (var packType in virtualPackItems.Keys)
|
{
|
var pool = m_VirtualItemPool[packType];
|
var items = virtualPackItems[packType];
|
foreach (var item in items)
|
{
|
pool.Release(item);
|
}
|
}
|
virtualPackItems.Clear();
|
noPackItemCountDict.Clear();
|
getA206Count = 0;
|
isFrist = false;
|
}
|
|
public void OnPlayerLoginOk()
|
{
|
isFrist = noPackItemCountDict.Count == 0;
|
}
|
|
public override void Init()
|
{
|
base.Init();
|
ParseConfig();
|
m_VirtualItemPool.Add(PackType.GatherSoul, new ObjectPool<VirtualPackItem>(OnGetItem, OnReleaseItem));
|
m_VirtualItemPool.Add(PackType.RunePack, new ObjectPool<VirtualPackItem>(OnGetItem, OnReleaseItem));
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
|
DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
|
}
|
|
public override void Release()
|
{
|
base.Release();
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
|
DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
|
}
|
|
void ParseConfig()
|
{
|
var funcConfig = FuncConfigConfig.Get("RunePackageNum");
|
virtualPackCapacityDict.Add(PackType.RunePack, int.Parse(funcConfig.Numerical1));
|
}
|
|
public bool IsVirtualPack(PackType packType)
|
{
|
switch (packType)
|
{
|
case PackType.GatherSoul:
|
case PackType.RunePack:
|
return true;
|
}
|
return false;
|
}
|
|
public int GetPackCapacity(PackType packType)
|
{
|
if (virtualPackCapacityDict.ContainsKey(packType))
|
{
|
return virtualPackCapacityDict[packType];
|
}
|
return 0;
|
}
|
|
public int GetPackRemainCount(PackType packType)
|
{
|
var capacity = GetPackCapacity(packType);
|
return capacity - GetPackItemCount(packType);
|
}
|
|
public int GetPackItemCount(PackType packType)
|
{
|
if (virtualPackItems.ContainsKey(packType))
|
{
|
return virtualPackItems[packType].Count;
|
}
|
return 0;
|
}
|
|
public int GetItemCountById(PackType packType, int id)
|
{
|
var count = 0;
|
List<int> list;
|
if (TryGetItems(packType, out list))
|
{
|
for (int i = 0; i < list.Count; i++)
|
{
|
VirtualPackItem item;
|
if (TryGetItem(packType, list[i], out item)
|
&& item.id == id)
|
{
|
count++;
|
}
|
}
|
}
|
return count;
|
}
|
|
public void GetItemIndexs(PackType packType, ref List<int> list)
|
{
|
list.Clear();
|
List<VirtualPackItem> _list;
|
if (virtualPackItems.TryGetValue(packType, out _list))
|
{
|
for (int i = 0; i < _list.Count; i++)
|
{
|
list.Add(_list[i].index);
|
}
|
}
|
}
|
|
public bool TryGetItems(PackType packType, out List<int> list)
|
{
|
list = new List<int>();
|
List<VirtualPackItem> _list;
|
if (virtualPackItems.TryGetValue(packType, out _list))
|
{
|
for (int i = 0; i < _list.Count; i++)
|
{
|
list.Add(_list[i].index);
|
}
|
return true;
|
}
|
return false;
|
}
|
|
public bool TryGetItem<T>(PackType packType, int packIndex, out T item) where T : VirtualPackItem
|
{
|
item = default(T);
|
if (virtualPackItems.ContainsKey(packType))
|
{
|
var _index = virtualPackItems[packType].FindIndex((x) =>
|
{
|
return x.index == packIndex;
|
});
|
if (_index != -1)
|
{
|
item = virtualPackItems[packType][_index] as T;
|
}
|
return _index != -1;
|
}
|
return false;
|
}
|
|
public void OnReceiveServerPack(HA204_tagMCVPackRefresh package)
|
{
|
var packType = (PackType)package.PackType;
|
if (!IsVirtualPack(packType))
|
{
|
return;
|
}
|
List<VirtualPackItem> list;
|
if (!virtualPackItems.TryGetValue(packType, out list))
|
{
|
list = new List<VirtualPackItem>();
|
virtualPackItems.Add(packType, list);
|
}
|
SetVirtualItem(packType, ref list, package.VPacklItemList);
|
if (virtualPackRefresh != null)
|
{
|
virtualPackRefresh((PackType)package.PackType);
|
}
|
|
}
|
|
public void OnReceiveServerPack(HA205_tagMCVPackClear package)
|
{
|
var packType = (PackType)package.PackType;
|
if (!IsVirtualPack(packType))
|
{
|
return;
|
}
|
List<VirtualPackItem> list;
|
if (virtualPackItems.TryGetValue(packType, out list))
|
{
|
var pool = m_VirtualItemPool[packType];
|
for (int i = 0; i < package.Count; i++)
|
{
|
var index = package.ItemPlaceList[i];
|
var items = list.FindAll((x) =>
|
{
|
return x.index == index;
|
});
|
foreach (var item in items)
|
{
|
list.Remove(item);
|
pool.Release(item);
|
}
|
}
|
if (virtualPackRefresh != null)
|
{
|
virtualPackRefresh(packType);
|
}
|
}
|
}
|
|
|
public void UpdateAutoItemCountRefresh(HA206_tagMCAutoItemCountRefresh netPack)
|
{
|
|
ShowRewardWin(netPack);//vNetData中ItemCount传的是碎片总数,需要在noPackItemCountDict写入数据之前计算差值
|
for (int i = 0; i < netPack.Count; i++)
|
{
|
noPackItemCountDict[(int)netPack.ItemCountList[i].ItemID] = (int)netPack.ItemCountList[i].ItemCount;
|
}
|
OnNoPackItemCountRefresh?.Invoke();
|
}
|
|
void ShowRewardWin(HA206_tagMCAutoItemCountRefresh vNetData)
|
{
|
getA206Count += 1;
|
if (ItemLogicUtility.Instance.hidePickItem)
|
return;
|
// if (ModelCenter.Instance.GetModel<GatheringSoulModel>().isOpenXBWin)
|
// return;
|
if (getA206Count <= 1 && !isFrist)
|
return;
|
|
for (int i = 0; i < vNetData.ItemCountList.Length; i++)
|
{
|
int itemID = (int)vNetData.ItemCountList[i].ItemID;
|
int itemCount = (int)vNetData.ItemCountList[i].ItemCount;
|
if (noPackItemCountDict.ContainsKey(itemID) && noPackItemCountDict[itemID] > itemCount)
|
return;
|
ItemLogicUtility.Instance.RefreshPickItem(PackType.Item, itemID.ToString());
|
}
|
}
|
|
|
public int GetNoPackItemCount(int id)
|
{
|
if (noPackItemCountDict.ContainsKey(id))
|
{
|
return noPackItemCountDict[id];
|
}
|
return 0;
|
}
|
|
public Dictionary<int, int> GetAllNoPackItem()
|
{
|
return noPackItemCountDict;
|
}
|
|
|
|
void SetVirtualItem(PackType packType, ref List<VirtualPackItem> list, HA204_tagMCVPackRefresh.tagMCVPackItem[] items)
|
{
|
var pool = m_VirtualItemPool[packType];
|
for (int i = 0; i < items.Length; i++)
|
{
|
var item = list.Find((x) =>
|
{
|
return x.index == items[i].ItemPlace;
|
});
|
if (item != null)
|
{
|
item.Release();
|
}
|
else
|
{
|
if (pool.inactivedCount > 0)
|
{
|
item = pool.Get();
|
list.Add(item);
|
}
|
}
|
if (item == null)
|
{
|
item = VirtualPackItem.Get(packType);
|
list.Add(item);
|
}
|
item.ParsePackItem(items[i].ItemPlace, items[i].ItemData);
|
|
ItemLogicUtility.Instance.RefreshPickItem(packType, item.id.ToString());
|
}
|
}
|
|
static void OnGetItem(VirtualPackItem item)
|
{
|
|
}
|
|
static void OnReleaseItem(VirtualPackItem item)
|
{
|
item.Release();
|
}
|
}
|
|
public abstract class VirtualPackItem
|
{
|
public int index { get; private set; }
|
|
public int id { get; private set; }
|
|
public int level { get; private set; }
|
|
protected string dataString { get; set; }
|
|
protected static StringBuilder sb = new StringBuilder();
|
|
public virtual void ParsePackItem(int index, uint data)
|
{
|
this.index = index;
|
|
dataString = data.ToString();
|
int delta = 10 - dataString.Length;
|
sb.Length = 0;
|
sb.Append('0', delta);
|
dataString = dataString.Insert(0, sb.ToString());
|
|
id = int.Parse(dataString.Substring(5, 5));
|
level = int.Parse(dataString.Substring(2, 3)) + 1;
|
}
|
|
public virtual void Release()
|
{
|
dataString = null;
|
}
|
|
public static VirtualPackItem Get(PackType packType)
|
{
|
// switch (packType)
|
// {
|
// case PackType.RunePack:
|
// return new RuneItem();
|
// }
|
return null;
|
}
|
}
|
|
public struct VirtualItem
|
{
|
public PackType packType;
|
public int itemId;
|
public int index;
|
public int level;
|
}
|