using System; using System.Collections.Generic; using System.Reflection; using ET; using FairyGUI; using UnityEngine; using static UnityEditor.Progress; namespace GFGGame { public class ItemDataManager { private static Dictionary _dataDic = new Dictionary(); delegate object MemberGetDelegate(ItemCfg p); public static void Add(int itemID, int 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) { DressUpMenuItemDataManager.Add(itemID); } //Debug.Log("itemid:"+ itemID); //Debug.Log("itemCfg:" + itemCfg); if (itemCfg.itemType == ConstItemType.CARD) { CardDataManager.Add(itemID); } if (itemCfg.itemType == ConstItemType.DRESS_UP && !DressUpMenuItemDataManager.CheckIsSceneType(itemID)) { DecomposeDataManager.Instance.Add(itemID); } PhotographDataManager.Instance.Add(itemID); EventAgent.DispatchEvent(ConstMessage.ITEM_CHANGED, itemID); } public static void Remove(int itemID, int itemNum) { if (_dataDic.ContainsKey(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); } } ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemID); if (itemCfg.itemType == ConstItemType.DRESS_UP && !DressUpMenuItemDataManager.CheckIsSceneType(itemID)) { DecomposeDataManager.Instance.Remove(itemID); } EventAgent.DispatchEvent(ConstMessage.ITEM_CHANGED, itemID); } } public static int GetItemNum(int itemId) { int numericType = NumericUtil.GetNumericTypeByItemId(itemId); if (numericType != 0) { return GameGlobal.myNumericComponent.GetAsInt(numericType); } 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 GetMainScore(int itemId, out int mainScore, out int mainScoreValue) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); //五个属性中最大的为主属性 mainScore = 1; mainScoreValue = 0; if (itemCfg.score1 > mainScoreValue) { mainScoreValue = itemCfg.score1; mainScore = 1; } if (itemCfg.score2 > mainScoreValue) { mainScoreValue = itemCfg.score2; mainScore = 2; } if (itemCfg.score3 > mainScoreValue) { mainScoreValue = itemCfg.score3; mainScore = 3; } if (itemCfg.score4 > mainScoreValue) { mainScoreValue = itemCfg.score4; mainScore = 4; } } public static int GetItemScoreValue(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 GetScore(int itemId, int scoreType) { var cfg = ItemCfgArray.Instance.GetCfg(itemId); Type type = typeof(ItemCfg); PropertyInfo property = type.GetProperty("score" + scoreType); MemberGetDelegate memberGet = (MemberGetDelegate)System.Delegate.CreateDelegate(typeof(MemberGetDelegate), property.GetGetMethod()); System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew(); var scoreBase = (int)memberGet(cfg); int index = scoreType - 1; var scoreadd = !_dataDic.ContainsKey(itemId) || _dataDic[itemId].AddScoresArr.Length == 0 ? 0 : _dataDic[itemId].AddScoresArr[index]; var percentAdd = !_dataDic.ContainsKey(itemId) || _dataDic[itemId].AddPercentArr.Length == 0 ? 0 : _dataDic[itemId].AddPercentArr[index]; return CalculateUtil.GetItemScore(scoreBase, percentAdd, scoreadd); } } }