using System.Collections.Generic; using System.Linq; using ET; using UnityEngine; namespace GFGGame { public class ItemDataManager { private static Dictionary _dataDic = new Dictionary(); private static Dictionary _itemExchangeDic = new Dictionary(); delegate object MemberGetDelegate(ItemCfg p); public static void Clear() { _itemExchangeDic.Clear(); } public static void Add(int itemID, long itemNum) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID); if (itemCfg == null) { Debug.LogError($"添加了一个不存在的物品 {itemID}"); return; } ItemData itemData = null; if (_dataDic.ContainsKey(itemID)) { itemData = _dataDic[itemID]; if (itemCfg.itemType == ConstItemType.CARD) { return; //每张卡牌只有一张 } } else { itemData = ItemDataPool.GetItemData(itemID); _dataDic.Add(itemID, itemData); } itemData.num += itemNum; if (ItemUtilCS.IsDressUpItem(itemID) && itemID % GameConst.MAX_COUNT_EVERY_TYPE_ITEM > 0) { //游戏角色初始数据完成后才执行 bool dataInited = GameGlobal.DataInited; DressUpMenuItemDataManager.Add(itemID); if (!DressUpMenuItemCfg1Array.Instance.CheckIsSceneType(itemID)) { DecomposeDataManager.Instance.Add(itemID); } FunctionOpenCfg functionOpenCfg = FunctionOpenCfgArray.Instance.GetCfg(typeof(ClothingListView).Name); if (dataInited && itemCfg.rarity == ConstDressRarity.Rarity_TIANYI && StorageDataManager.Instance.GetStorageValue(ConstStorageId.FUNCTION_OPEN + functionOpenCfg.index) == 0) { FunctionOpenDataManager.Instance.CheckHasSpecialFunOpen(); } } if ((itemCfg.itemType == ConstItemType.ITEM || itemCfg.itemType == ConstItemType.GIFT_BAG) && itemData.num > 0) { BagDataManager.Instance.Add(itemData); } if (itemCfg.itemType == ConstItemType.HEAD) { RoleInfoManager.Instance.Add(itemID); if (GameGlobal.DataInited) { RoleInfoManager.Instance.AddNew(itemID); EventAgent.DispatchEvent(ConstMessage.RED_CHANGE); } } PhotographDataManager.Instance.Add(itemID); EventAgent.DispatchEvent(ConstMessage.ITEM_CHANGED, itemID); } public static void Remove(int itemID, long itemNum) { if (_dataDic.ContainsKey(itemID)) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID); ItemData itemData = _dataDic[itemID]; itemData.num -= itemNum; if (itemData.num <= 0) { itemData.num = 0; _dataDic.Remove(itemID); if (ItemUtilCS.IsDressUpItem(itemID)) { DressUpMenuItemDataManager.Remove(itemID); } if (itemCfg.itemType == ConstItemType.ITEM) { BagDataManager.Instance.Remove(itemID); } if (itemCfg.itemType == ConstItemType.GIFT_BAG) { BagDataManager.Instance.Remove(itemID); } if (itemCfg.itemType == ConstItemType.HEAD) { RoleInfoManager.Instance.Remove(itemID); } } if (itemCfg.itemType == ConstItemType.DRESS_UP && !DressUpMenuItemCfg1Array.Instance.CheckIsSceneType(itemID)) { DecomposeDataManager.Instance.Remove(itemID); } EventAgent.DispatchEvent(ConstMessage.ITEM_CHANGED, itemID); } } public static long GetItemNum(int itemId) { int numericType = NumericUtil.GetNumericTypeByItemId(itemId); if (numericType != 0) { return GameGlobal.myNumericComponent.GetAsInt(numericType); } int leagueType = NumericUtil.GetLeagueNumericTypeByItemId(itemId); if (leagueType != 0) { return LeagueDataManager.Instance.GetNumeriValue(leagueType); } if (_dataDic.TryGetValue(itemId, out var itemData)) { return itemData.num; } return 0; } public static void InitServerData(List items) { _dataDic.Clear(); foreach (ItemInfoProto roleItem in items) { Add(roleItem.ConfigId, roleItem.Count); } } public static void InitServerDataItemAttribute(List infos) { foreach (var info in infos) { if (_dataDic.TryGetValue(info.ConfigId, out var itemData)) { itemData.SetAttributes(info.Ks, info.Vs); } } } public static void InitItemExchange(int itemId, int exchangTimes) { if (_itemExchangeDic.ContainsKey(itemId)) { _itemExchangeDic[itemId] = exchangTimes; } else { _itemExchangeDic.Add(itemId, exchangTimes); } } //获取物品已兑换次数 public static int GetItemExchangeTimes(int itemId) { if (_itemExchangeDic.ContainsKey(itemId) == false) { InitItemExchange(itemId, 0); } return _itemExchangeDic[itemId]; } public static void SetAttribute(int itemId, int key, int value) { if (_dataDic.TryGetValue(itemId, out var itemData)) { itemData.SetAttribute(key, value); } } /// /// 获取表格配置的基础属性 /// /// /// /// public static int GetItemBaseScoreValue(int itemId, int scoreType) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); if (scoreType == 1) { return itemCfg.score1; } else if (scoreType == 2) { return itemCfg.score2; } else if (scoreType == 3) { return itemCfg.score3; } else if (scoreType == 4) { return itemCfg.score4; } return 0; } /// /// 获取当前(养护/升级/升星...后)的属性 /// /// /// /// public static int GetItemAdditionScore(int itemId, int scoreType, string[] tags = null) { if (_dataDic.TryGetValue(itemId, out var itemData)) { int scroe = 0; if (tags != null) { scroe += GetItemTagScore(itemId, tags); } scroe += itemData.GetScore(scoreType); return scroe; } return 0; } /// /// 获取一个换装部件对应的标签分数 /// /// /// /// public static int GetItemTagScore(int itemId, string[] tags) { int score = 0; ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); if (itemCfg == null) { ET.Log.Error("物品:" + itemId + "不存在"); return score; } for (int i = 0; i < itemCfg.tagsArr.Length; i++) { for (int j = 0; j < tags.Length; j++) { if (itemCfg.tagsArr[i][0] == tags[j]) { score += int.Parse(itemCfg.tagsArr[i][1]); } } } return score; } /// /// 检测一件服装是否包含要求的标签 /// /// public static bool CheckItemTagsRight(int itemId, string[] tags) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); for (int i = 0; i < itemCfg.tagsArr.Length; i++) { for (int j = 0; j < tags.Length; j++) { if (itemCfg.tagsArr[i][0] == tags[j]) return true; } } return false; } } }