using System.Collections; using System.Collections.Generic; using System; using UnityEngine; using ET; using FairyGUI; using System.Threading.Tasks; namespace GFGGame { public enum DressFilterType { None, Search, Filter } public class DressUpMenuItemDataManager { public static string dressSearchTxt = ""; public static DressFilterType dressFilterType = DressFilterType.None; public static List selectRarityList = new List(); public static List selectScoreList = new List(); public static List selectTagList = new List(); private static List _itemDatas = new List(); private static Dictionary> _itemDatasBySubTypeDic = new Dictionary>(); public static Dictionary> ItemDatasBySubTypeDic { get { return _itemDatasBySubTypeDic; } } private static Dictionary> _newItemdata = new Dictionary>(); private static Dictionary> _itemDatasByRarityDic = new Dictionary>(); //存储初始化时的衣服,用于性能优化,逐帧加载配置 public static List itemIDListInited = new List(); public static void InitData() { _itemDatas.Clear(); _newItemdata.Clear(); _itemDatasBySubTypeDic.Clear(); _itemDatasByRarityDic.Clear(); } public static void Clear() { DressUpMenuItemDataManager.dressFilterType = DressFilterType.None; selectRarityList.Clear(); selectScoreList.Clear(); selectTagList.Clear(); dressSearchTxt = ""; } public static void Add(ItemInfoProto itemInfoProto) { var value = itemInfoProto.ConfigId; //初始化时禁止使用物品配置,会造成卡顿!!! if (!_itemDatas.Contains(value)) { _itemDatas.Add(value); int subType = itemInfoProto.SubType; subType = subType >= (int)ConstDressUpItemType.TE_SHU ? (int)ConstDressUpItemType.TE_SHU : subType; if (!_itemDatasBySubTypeDic.ContainsKey(subType)) { _itemDatasBySubTypeDic.Add(subType, new List()); } _itemDatasBySubTypeDic[subType].Add(value); if (!_itemDatasByRarityDic.ContainsKey(itemInfoProto.Rarity)) { _itemDatasByRarityDic.Add(itemInfoProto.Rarity, new List()); } _itemDatasByRarityDic[itemInfoProto.Rarity].Add(value); if (GameGlobal.DataInited) { AddNewDressItem(value); DressUpMenuSuitDataManager.CheckItemInSuit(value); } else { itemIDListInited.Add(value); } } } public static bool CheckHasItem(int itemID) { return _itemDatas.Contains(itemID); } public static void Remove(int value) { if (_itemDatas == null) { return; } if (_itemDatas.Contains(value)) { _itemDatas.Remove(value); } int subType = ItemUtilCS.GetItemSubType(value); subType = subType >= (int)ConstDressUpItemType.TE_SHU ? (int)ConstDressUpItemType.TE_SHU : subType; if (_itemDatasBySubTypeDic.ContainsKey(subType) && _itemDatasBySubTypeDic[subType].IndexOf(value) >= 0) { _itemDatasBySubTypeDic[subType].Remove(value); } int rarity = ItemCfgArray.Instance.GetCfg(value).rarity; if (_itemDatasByRarityDic.ContainsKey(rarity) && _itemDatasByRarityDic[rarity].IndexOf(value) >= 0) { _itemDatasByRarityDic[rarity].Remove(value); } } public static List getItemDatasByType(int type) { List arrayList = new List(); if (_itemDatasBySubTypeDic.ContainsKey(type)) { arrayList.AddRange(_itemDatasBySubTypeDic[type]); } // for (int i = 0; i < _itemDatas.Count; i++) // { // int itemID = (int)_itemDatas[i]; // int subType = ItemUtilCS.GetItemSubType(itemID); // if (type == (int)ConstDressUpItemType.TE_SHU && subType > type) // { // arrayList.Add(itemID); // } // else if (subType == type) // { // arrayList.Add(itemID); // } // } return arrayList; } public static List SortItemListByHighScore(List arrayList, bool checkNew = false) { arrayList.Sort((int a, int b) => { if (checkNew) { bool isNewA = CheckIsDressUpItemNew(a); bool isNewB = CheckIsDressUpItemNew(b); if (isNewA != isNewB) { if (isNewA) return -1; if (isNewB) return 1; } } int scoreA = ItemDataManager.GetItemAdditionScore(a, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); ; int scoreB = ItemDataManager.GetItemAdditionScore(b, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); ; if (scoreB > scoreA) return 1; if (scoreB < scoreA) return -1; return a - b; }); return arrayList; } public static List SortItemListByLowScore(List arrayList, bool checkNew = false) { arrayList.Sort((int a, int b) => { if (checkNew) { bool isNewA = CheckIsDressUpItemNew(a); bool isNewB = CheckIsDressUpItemNew(b); if (isNewA != isNewB) { if (isNewA) return -1; if (isNewB) return 1; } } int scoreA = ItemDataManager.GetItemAdditionScore(a, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); ; int scoreB = ItemDataManager.GetItemAdditionScore(b, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); ; if (scoreB < scoreA) { return 1; } else if (scoreB > scoreA) { return -1; } return 0; }); return arrayList; } private static List SortItemListByScoreByType(List arrayList) { arrayList.Sort((int a, int b) => { int typeA = ItemUtilCS.GetItemSubType(a); int typeB = ItemUtilCS.GetItemSubType(b); int scoreA = ItemDataManager.GetItemAdditionScore(a, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); ; int scoreB = ItemDataManager.GetItemAdditionScore(b, InstanceZonesDataManager.currentScoreType, InstanceZonesDataManager.currentFightTags); ; if (typeB < typeA) { return -1; } else if (typeB > typeA) { return 1; } else if (scoreB > scoreA) { return 1; } else if (scoreB < scoreA) { return -1; } return 0; }); return arrayList; } public static List SortItemListByHighRarity(List arrayList) { arrayList.Sort((int a, int b) => { ItemCfg itemCfgA = ItemCfgArray.Instance.GetCfg(a); ItemCfg itemCfgB = ItemCfgArray.Instance.GetCfg(b); bool isNewA = CheckIsDressUpItemNew(a); bool isNewB = CheckIsDressUpItemNew(b); if (isNewA != isNewB) { if (isNewA) return -1; if (isNewB) return 1; } if (itemCfgB.rarity > itemCfgA.rarity) { return 1; } else if (itemCfgB.rarity < itemCfgA.rarity) { return -1; } return 0; }); return arrayList; } public static List SortItemListByLowRarity(List arrayList) { arrayList.Sort((int a, int b) => { ItemCfg itemCfgA = ItemCfgArray.Instance.GetCfg(a); ItemCfg itemCfgB = ItemCfgArray.Instance.GetCfg(b); bool isNewA = CheckIsDressUpItemNew(a); bool isNewB = CheckIsDressUpItemNew(b); if (isNewA != isNewB) { if (isNewA) return -1; if (isNewB) return 1; } if (itemCfgB.rarity < itemCfgA.rarity) { return 1; } else if (itemCfgB.rarity > itemCfgA.rarity) { return -1; } return 0; }); return arrayList; } public static List GetRecommendItemList(bool toSort = true) { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); List recommendTypeList = new List(); List recommendList = new List(); List recommendSpecialList = new List(); List tempAllList = _itemDatas.GetRange(0, _itemDatas.Count); if (toSort) { SortItemListByScoreByType(tempAllList); } foreach (int itemID in tempAllList) { int subType = ItemUtilCS.GetItemSubType(itemID); if (!DressUpMenuItemCfg1Array.Instance.CheckIsSceneType(itemID) && subType != ConstDressUpItemType.BEI_JING) { if (!recommendTypeList.Contains(subType)) { bool isNeed = fightCfg.needItemId > 0 && (ItemUtilCS.GetItemSubType(fightCfg.needItemId) != subType || ItemUtilCS.GetItemSubType(fightCfg.needItemId) == subType && fightCfg.needItemId == itemID); if (isNeed || fightCfg.needItemId <= 0) { if (subType < ConstDressUpItemType.TE_SHU) { recommendList.Add(itemID); } recommendTypeList.Add(subType); } } } } recommendSpecialList = DressUpMenuItemDataManager.getItemDatasByType(ConstDressUpItemType.TE_SHU); recommendSpecialList = DressUpMenuItemDataManager.SortItemListByHighScore(recommendSpecialList); List specialSubList = new List(); List specialIdList = new List(); foreach (int itemID in recommendSpecialList) { int subType = ItemUtilCS.GetItemSubType(itemID); if (subType > ConstDressUpItemType.TE_SHU) { if (specialSubList.Count >= 3) continue; if (specialSubList.IndexOf(subType) < 0) { specialSubList.Add(subType); specialIdList.Add(itemID); } } } recommendList.AddRange(specialIdList); return recommendList; } // public static int GetRecommendCount() // { // List recommendTypeList = GetRecommendItemList(false); // return recommendTypeList.Count; // } // public static int GetItemScore(int itemId) // { // return ItemDataManager.GetItemAdditionScore(itemId, InstanceZonesDataManager.currentScoreType); // } public static List DressSearch(bool includeScene = true) { List searchList = new List(); for (int i = 0; i < _itemDatas.Count; i++) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemDatas[i]); if (!includeScene && DressUpMenuItemCfg1Array.Instance.CheckIsSceneType(_itemDatas[i])) continue; if (itemCfg.name.IndexOf(dressSearchTxt) >= 0 && searchList.IndexOf(itemCfg.id) < 0) { searchList.Add(itemCfg.id); } } return searchList; } public static List DressFilter(bool includeScene = true) { List filterList = new List(); for (int i = 0; i < _itemDatas.Count; i++) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemDatas[i]); if (!includeScene && DressUpMenuItemCfg1Array.Instance.CheckIsSceneType(_itemDatas[i])) continue; bool isTag = selectTagList.Count == 0; if (selectTagList.Count > 0) { for (int j = 0; j < itemCfg.tagsArr.Length; j++) { if (selectTagList.IndexOf(itemCfg.tagsArr[j][0]) >= 0) { isTag = true; break; } } } if (!isTag) continue; if (selectRarityList.Count > 0 && selectRarityList.IndexOf(itemCfg.rarity) < 0) continue; if (selectScoreList.Count > 0 && selectScoreList.IndexOf(itemCfg.mainScore) < 0) continue; filterList.Add(itemCfg.id); } return filterList; } public static List DressSearch(List list) { List searchList = new List(); for (int i = 0; i < list.Count; i++) { bool isSearch = true; ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(list[i]); SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(list[i]); string name = itemCfg != null ? itemCfg.name : suitCfg.name; for (int j = 0; j < dressSearchTxt.Length; j++) { if (name.IndexOf(dressSearchTxt[j]) < 0) { isSearch = false; break; } } if (isSearch) { searchList.Add(list[i]); } } return searchList; } public static List DressFilter(List list) { List filterList = new List(); for (int i = 0; i < list.Count; i++) { ItemCfg cfg = ItemCfgArray.Instance.GetCfg(list[i]); SuitCfg tzCfg = SuitCfgArray.Instance.GetCfg(list[i]); bool isRarity = cfg == null ? FilterRarity(tzCfg) : FilterRarity(cfg); bool isScore = cfg == null ? true : FilterScore(cfg); bool isTag = cfg == null ? true : FilterTag(cfg); if (isRarity && isScore && isTag) { filterList.Add(list[i]); } } if (filterList.Count == 0) { PromptController.Instance.ShowFloatTextPrompt("无满足条件物品"); } return filterList; } private static bool FilterRarity(ItemCfg cfg) { bool isRarity = false; if (selectRarityList.Count > 0) { for (int j = 0; j < selectRarityList.Count; j++) { if (cfg != null && cfg.rarity == selectRarityList[j]) { isRarity = true; break; } } } else { isRarity = true; } return isRarity; } private static bool FilterRarity(SuitCfg cfg) { bool isRarity = false; if (selectRarityList.Count > 0) { for (int j = 0; j < selectRarityList.Count; j++) { if (cfg != null && cfg.rarity == selectRarityList[j]) { isRarity = true; break; } } } else { isRarity = true; } return isRarity; } private static bool FilterScore(ItemCfg cfg) { bool isScore = false; if (selectScoreList.Count > 0) { if (cfg != null) { for (int j = 0; j < selectScoreList.Count; j++) { if (cfg.mainScore == selectScoreList[j]) { isScore = true; break; } } } } else { isScore = true; } return isScore; } private static bool FilterTag(ItemCfg cfg) { bool isTag = false; if (selectTagList.Count > 0) { if (cfg != null) { for (int j = 0; j < selectTagList.Count; j++) { if (isTag == true) { break; } for (int k = 0; k < cfg.tagsArr.Length; k++) { if (cfg.tagsArr[k][0] == selectTagList[j]) { isTag = true; break; } } } } } else { isTag = true; } return isTag; } public static void AddNewDressItem(int value) { int subType = ItemDataManager.GetItemSubType(value); if (!_newItemdata.ContainsKey(subType)) { _newItemdata.Add(subType, new List()); } _newItemdata[subType].Add(value); // ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(value); // if (itemCfg.suitId > 0 && DressUpMenuSuitDataManager.CheckHaveSuit(itemCfg.suitId)) // { // SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(itemCfg.suitId); // } } public static void RemoveNewDressItem(int itemId) { int subType = ItemCfgArray.Instance.GetCfg(itemId).subType; if (_newItemdata.ContainsKey(subType) && _newItemdata[subType].IndexOf(itemId) >= 0) { _newItemdata[subType].Remove(itemId); } } //检测一级菜单是否有展示新增 public static bool CheckIsFirstMenuNew(int menuId) { if (_newItemdata.Count == 0) return false; DressUpMenuItemCfg1 cfg1 = DressUpMenuItemCfg1Array.Instance.GetCfg(menuId); if (cfg1.subMenusArr.Length > 0)//有二级菜单 { foreach (int id2 in cfg1.subMenusArr) { if (CheckIsSecondMenuNew(id2)) return true; } } else { if (_newItemdata.ContainsKey(cfg1.type) && _newItemdata[cfg1.type].Count > 0) return true; } return false; } //检测二级菜单是否有展示新增 public static bool CheckIsSecondMenuNew(int subMenuId) { if (_newItemdata.Count == 0) return false; DressUpMenuItemCfg2 cfg2 = DressUpMenuItemCfg2Array.Instance.GetCfg(subMenuId); if (_newItemdata.ContainsKey(cfg2.type) && _newItemdata[cfg2.type].Count > 0) { return true; } return false; } //检测服装部件是否为新增 public static bool CheckIsDressUpItemNew(int itemId) { if (_newItemdata.Count == 0) return false; int subType = ItemUtilCS.GetItemSubType(itemId); return _newItemdata.ContainsKey(subType) && _newItemdata[subType].IndexOf(itemId) >= 0; } //预加载服装配置 public static void StartPreLoadItemCfg() { Timers.inst.AddUpdate(updateOnPreLoad); } private static void updateOnPreLoad(object param = null) { for(var i = 0; i < 3; i++) { PreLoadOneItemCfg(); } if (itemIDListInited.Count <= 0) { Timers.inst.Remove(updateOnPreLoad); } } private static void PreLoadOneItemCfg() { var itemIDListInited = DressUpMenuItemDataManager.itemIDListInited; if (itemIDListInited.Count > 0) { int lasetIndex = itemIDListInited.Count - 1; int itemId = itemIDListInited[lasetIndex]; itemIDListInited.RemoveAt(lasetIndex); ItemCfgArray.Instance.GetCfg(itemId); } } public static int[] dressUpGuideSubType = { ConstDressUpItemType.FA_XING, ConstDressUpItemType.LIAN_YI_QUN , ConstDressUpItemType.NEI_DA, ConstDressUpItemType.WAI_TAO,ConstDressUpItemType.SHANG_YI,ConstDressUpItemType.XIA_ZHUANG,ConstDressUpItemType.WA_ZI, ConstDressUpItemType.XIE_ZI,ConstDressUpItemType.SHOU_CHI_WU, ConstDressUpItemType.ZHUANG_RONG}; public static int[] dressUpGuideAccessoriesType = { ConstDressUpItemType.TOU_SHI, ConstDressUpItemType.ER_SHI , ConstDressUpItemType.JING_SHI, ConstDressUpItemType.MIAN_BU,ConstDressUpItemType.YAO_SHI,ConstDressUpItemType.SHOU_SHI,ConstDressUpItemType.PI_BO}; /// /// 根据主属性获取有序服装散件ID列表(排序规则: 已获得按稀有度从高到低 > 未获得按稀有度从高到低 > 名字拼音) /// 包含已获得和未获得 /// /// 0-全部 /// true-有序 /// public static List GetAllDressUpGuideIdListBySubType(int subType, bool sorted = true) { List result = new List(); List itemCfgs = new List(); // 全部 if (subType == 0) { // 除饰品外的散件 for (int i = 0; i < dressUpGuideSubType.Length; i++) { itemCfgs.AddRange(ItemCfgArray.Instance.GetCfgsByitemTypeAndsubType(ConstItemType.DRESS_UP, dressUpGuideSubType[i])); } // 饰品 for (int i = 0; i < dressUpGuideAccessoriesType.Length; i++) { itemCfgs.AddRange(ItemCfgArray.Instance.GetCfgsByitemTypeAndsubType(ConstItemType.DRESS_UP, dressUpGuideAccessoriesType[i])); } // 特殊 ItemTypeCfg[] itemTypeCfg = ItemTypeCfgArray.Instance.dataArray; for (int i = 0; i < itemTypeCfg.Length; i++) { if (itemTypeCfg[i].type > ConstDressUpItemType.TE_SHU) { itemCfgs.AddRange(ItemCfgArray.Instance.GetCfgsByitemTypeAndsubType(ConstItemType.DRESS_UP, itemTypeCfg[i].type)); } } } // 指定子类型 else { if(subType == ConstDressUpItemType.TE_SHU) { ItemTypeCfg[] itemTypeCfg = ItemTypeCfgArray.Instance.dataArray; for(int i = 0;i< itemTypeCfg.Length; i++) { if(itemTypeCfg[i].type > ConstDressUpItemType.TE_SHU) { itemCfgs.AddRange(ItemCfgArray.Instance.GetCfgsByitemTypeAndsubType(ConstItemType.DRESS_UP, itemTypeCfg[i].type)); } } } else { itemCfgs = ItemCfgArray.Instance.GetCfgsByitemTypeAndsubType(ConstItemType.DRESS_UP, subType); } } if (sorted) { itemCfgs.Sort((a, b) => { bool haveA = CheckHasItem(a.id); bool haveB = CheckHasItem(b.id); if (haveB && !haveA) { return 1; } else if (!haveB && haveA) { return -1; } if (a.rarity != b.rarity) { return a.rarity > b.rarity ? -1 : 1; } return a.res.CompareTo(b.res); }); } for (int i = 0; i < itemCfgs.Count; i++) { if(itemCfgs[i].isHide <= 0) { result.Add(itemCfgs[i].id); } } return result; } public static List GetAllDressUpGuideIdListBySubTypes(List subTypes) { List result = new List(); List itemCfgs = new List(); for (int j = 0; j < subTypes.Count; j++) { int subType = subTypes[j]; if (subType == ConstDressUpItemType.TE_SHU) { ItemTypeCfg[] itemTypeCfg = ItemTypeCfgArray.Instance.dataArray; for (int i = 0; i < itemTypeCfg.Length; i++) { if (itemTypeCfg[i].type > ConstDressUpItemType.TE_SHU) { itemCfgs.AddRange(ItemCfgArray.Instance.GetCfgsByitemTypeAndsubType(ConstItemType.DRESS_UP, itemTypeCfg[i].type)); } } } else { itemCfgs.AddRange(ItemCfgArray.Instance.GetCfgsByitemTypeAndsubType(ConstItemType.DRESS_UP, subType)); } } itemCfgs.Sort((a, b) => { bool haveA = CheckHasItem(a.id); bool haveB = CheckHasItem(b.id); if (haveB && !haveA) { return 1; } else if (!haveB && haveA) { return -1; } if (a.rarity != b.rarity) { return a.rarity > b.rarity ? -1 : 1; } return a.res.CompareTo(b.res); }); for (int i = 0; i < itemCfgs.Count; i++) { if (itemCfgs[i].isHide <= 0) { result.Add(itemCfgs[i].id); } } return result; } public static bool isLoading = false; public static async Task GetAllDressUpGuideIdListBySubTypeAsync() { isLoading = true; // 除饰品外的散件 for (int i = 0; i < dressUpGuideSubType.Length; i++) { await ItemCfgArray.Instance.GetCfgsByitemTypeAndsubTypeAsync(ConstItemType.DRESS_UP, dressUpGuideSubType[i]); } // 饰品 for (int i = 0; i < dressUpGuideAccessoriesType.Length; i++) { await ItemCfgArray.Instance.GetCfgsByitemTypeAndsubTypeAsync(ConstItemType.DRESS_UP, dressUpGuideAccessoriesType[i]); } // 特殊 ItemTypeCfg[] itemTypeCfg = ItemTypeCfgArray.Instance.dataArray; for (int i = 0; i < itemTypeCfg.Length; i++) { if (itemTypeCfg[i].type > ConstDressUpItemType.TE_SHU) { await ItemCfgArray.Instance.GetCfgsByitemTypeAndsubTypeAsync(ConstItemType.DRESS_UP, itemTypeCfg[i].type); } } isLoading = false; EventAgent.DispatchEvent(ConstMessage.DRESS_PART_LOAD_FINISHED); } public static void SortDressUpGuideIdList(List list) { list.Sort((a, b) => { ItemCfg itemA = ItemCfgArray.Instance.GetCfg(a); ItemCfg itemB = ItemCfgArray.Instance.GetCfg(b); bool haveA = CheckHasItem(itemA.id); bool haveB = CheckHasItem(itemB.id); if (haveB && !haveA) { return 1; } else if (!haveB && haveA) { return -1; } if (itemA.rarity != itemB.rarity) { return itemA.rarity > itemB.rarity ? -1 : 1; } return itemA.res.CompareTo(itemB.res); }); } public static void GetTotalProgress(out int haveCount, out int totalCount) { totalCount = GlobalCfgArray.globalCfg.ClothingPartsCount; haveCount = 0; // 除饰品外的散件 for (int i = 0; i < dressUpGuideSubType.Length; i++) { if (_itemDatasBySubTypeDic.ContainsKey(dressUpGuideSubType[i])) { haveCount += _itemDatasBySubTypeDic[dressUpGuideSubType[i]].Count; } } // 饰品 for (int i = 0; i < dressUpGuideAccessoriesType.Length; i++) { if (_itemDatasBySubTypeDic.ContainsKey(dressUpGuideAccessoriesType[i])) { haveCount += _itemDatasBySubTypeDic[dressUpGuideAccessoriesType[i]].Count; } } // 特殊 if (_itemDatasBySubTypeDic.ContainsKey(ConstDressUpItemType.TE_SHU)) { haveCount += _itemDatasBySubTypeDic[ConstDressUpItemType.TE_SHU].Count; } } //整理配置表数据 public static Dictionary> GetTidyTagCfgArray(ItemCfg itemCfg) { Dictionary> tagsArr = new Dictionary>(); for (int t = 0; t < itemCfg.tagsArr.Length; t++) { Dictionary arr = new Dictionary(); arr.Add(itemCfg.tagsArr[t][0], Convert.ToInt32(itemCfg.tagsArr[t][1])); tagsArr[t] = arr; } return tagsArr; } } }