using System; 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(); public static Dictionary ItemCollect = new Dictionary(); delegate object MemberGetDelegate(ItemCfg p); public static void Clear() { _itemExchangeDic.Clear(); } public static void Add(ItemInfoProto itemInfoProto) { //初始化时禁止使用物品配置,会造成卡顿!!! var itemID = itemInfoProto.ConfigId; ItemData itemData = null; if (_dataDic.ContainsKey(itemID)) { itemData = _dataDic[itemID]; } else { itemData = ItemDataPool.GetItemData(itemID); itemData.itemType = itemInfoProto.Type; itemData.subType = itemInfoProto.SubType; itemData.rarity = itemInfoProto.Rarity; _dataDic.Add(itemID, itemData); } itemData.num = itemInfoProto.Count; if (itemInfoProto.Type == ConstItemType.DRESS_UP && itemID % GameConst.MAX_COUNT_EVERY_TYPE_ITEM > 0) { DressUpMenuItemDataManager.Add(itemInfoProto); //游戏角色初始数据完成后才执行 if (GameGlobal.PreDataInited) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID); FunctionOpenCfg functionOpenCfg = FunctionOpenCfgArray.Instance.GetCfg(typeof(ClothingListView).Name); if (itemCfg.rarity == ConstDressRarity.Rarity_TIANYI && StorageDataManager.Instance.GetStorageValue(ConstStorageId.FUNCTION_OPEN + functionOpenCfg.index) == 0) { FunctionOpenDataManager.Instance.CheckHasSpecialFunOpen(); } } } if ((itemInfoProto.Type == ConstItemType.ITEM || itemInfoProto.Type == ConstItemType.USEABLE) && itemData.num > 0) { BagDataManager.Instance.Add(itemData); } if (itemInfoProto.Type == ConstItemType.HEAD) { RoleInfoManager.Instance.Add(itemInfoProto); if (GameGlobal.PreDataInited) { RoleInfoManager.Instance.AddNew(itemID); EventAgent.DispatchEvent(ConstMessage.RED_CHANGE); } } PhotographDataManager.Instance.Add(itemInfoProto); if(GameGlobal.PreDataInited) { 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.subType == ConstItemSubType.MATERIAL_SKILL_BOOK) DecomposeDataManager.Instance.RemoveMaterial(itemID); } if (itemCfg.itemType == ConstItemType.USEABLE) { 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 int GetItemType(int itemId) { _dataDic.TryGetValue(itemId, out var value); if(value != null) { return value.itemType; } //Debug.Log($"ItemDataManager GetItemType itemId {itemId}"); ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); return itemCfg.itemType; } public static int[][] GetItemSyntheticSuitArr(int itemId) { _dataDic.TryGetValue(itemId, out var value); if (value != null && value.syntheticMateriarsArr != null && value.syntheticMateriarsArr.Length > 0) { return value.syntheticMateriarsArr; } ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); return itemCfg.syntheticMateriarsArr; } public static int GetItemSubType(int itemId) { _dataDic.TryGetValue(itemId, out var value); if (value != null) { return value.subType; } ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); return itemCfg.subType; } public static int GetItemRarity(int itemId) { _dataDic.TryGetValue(itemId, out var value); if (value != null) { return value.rarity; } ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); return itemCfg.rarity; } public static int GetItemSkillId(int itemId) { _dataDic.TryGetValue(itemId, out var value); if (value != null && value.param2Arr != null) { return value.param2Arr[0]; } ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); if (itemCfg.param2Arr.Length == 0) { return 0; } return itemCfg.param2Arr[0]; } public static void InitServerData(List items) { _dataDic.Clear(); foreach (ItemInfoProto roleItem in items) { //LogUtil.LogEditor($"ItemDataManager InitServerData {roleItem.ConfigId}"); Add(roleItem); } DressUpMenuItemDataManager.StartPreLoadItemCfg(); } 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); relativeSuitPerPromote(info.ConfigId,0,0,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); relativeSuitPerPromote(itemId, 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 GetArenaScore(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; } else { ItemCfg itemdate = ItemCfgArray.Instance.GetCfg(itemId); ItemData itemDate = new ItemData() { }; if (itemdate != null) { itemDate.id = itemdate.id; int scroe = 0; if (tags != null) { scroe += ItemDataManager.GetItemTagScore(itemId, tags); } scroe += itemDate.GetScore(scoreType); return scroe; } } return 0; } /// /// 获取茶话会item物品的属性 /// /// /// /// public static int GetItemAddTeaPartyTagsScore(int itemId)//, int scoreType, string[] tags = null) { if (_dataDic.TryGetValue(itemId, out var itemData)) { int scroe = 0; ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); if (itemCfg.tagsArr != null) { foreach (var info in itemCfg.tagsArr) { scroe += Convert.ToInt32(info[1]); } } 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); if(itemCfg == null) { return false; } 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; } /// /// 检测背包中是否存在礼包 /// /// public static bool BagIsExistGiftBag() { var isExistGiftBag = _dataDic.Values.Any(a => ((a.itemType == ConstItemType.USEABLE && a.subType == ConstItemSubType.USEABLE_GIFT_BAG_SELECTABLE) || (a.itemType == ConstItemType.USEABLE && a.subType == ConstItemSubType.USEABLE_GIFT_BAG_RANDOM)) && a.id != 6003001 && a.id != 6003002); return isExistGiftBag; } /// /// 相对应的染色套装也需要乘以(服装升级)相应提升百分比 /// /// public static void relativeSuitPerPromote(int itemId, int keyInt = 0, int valueInt = 0, List keyList = null, List valueList = null) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); List fosterCfgs = SuitFosterCfgArray.Instance.GetCfgsBysuitId(itemCfg.suitId); SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(fosterCfgs[0].suitId2); for (int i = 0; i < suitCfg.partsArr.Length; i++) { ItemCfg itemPartCfg = ItemCfgArray.Instance.GetCfg(suitCfg.partsArr[i]); if (itemPartCfg.subType == itemCfg.subType) { if (_dataDic.TryGetValue(itemPartCfg.id, out var itemPartData)) { if(keyInt > 0) itemPartData.SetAttribute(keyInt, valueInt); else if (keyList.Count > 0) itemPartData.SetAttributes(keyList, valueList); } break; } } } public static bool dataDicOfItemid(int itemId) { if (_dataDic.ContainsKey(itemId)) { return true; } return false; } } }