using System.Collections.Generic; using System.Linq; using cfg; using cfg.GfgCfg; using ET; namespace GFGGame { public class DecomposeDataManager : SingletonBase { Dictionary> _decomposeData = new Dictionary>(); //所有可分解的换装部件数据 Dictionary> _decomposeMaterialData = new Dictionary>(); //所有可分解的材料数据 Dictionary> _suitSyntheticMaterials = new Dictionary>(); //materiasId,Lsit List _rewardList = new List(); public const int MaxCount = 999; public void Clear() { _decomposeData.Clear(); _decomposeMaterialData.Clear(); _suitSyntheticMaterials.Clear(); } public void Add(int itemId) { //初始化时禁止使用物品配置,会造成卡顿!!! int rarity = ItemDataManager.GetItemRarity(itemId); if (!_decomposeData.ContainsKey(rarity)) { _decomposeData.Add(rarity, new List()); } long count = ItemCanDecomposeCount(itemId); if (_decomposeData[rarity].IndexOf(itemId) < 0 && count > 0) { _decomposeData[rarity].Add(itemId); } //套装拥有的时候需要让材料重新加进列表 IList syntheticMateriarsArr = ItemDataManager.GetItemSyntheticSuitArr(itemId); if (syntheticMateriarsArr.Count > 0) { foreach (var materiars in syntheticMateriarsArr) { int materialId = materiars.ItemId; int materialItemType = ItemDataManager.GetItemType(materialId); if (materialItemType == ConstItemType.DRESS_UP) { long materiarsCount = ItemCanDecomposeCount(materialId); if (materiarsCount > 0 && (materiarsCount + materiars.Count - DeductSynthesisNeedNum(materialId)) > 0) { rarity = ItemDataManager.GetItemRarity(materialId); if (!_decomposeData.ContainsKey(rarity)) { _decomposeData.Add(rarity, new List()); } if (_decomposeData[rarity].IndexOf(materialId) < 0) { _decomposeData[rarity].Add(materialId); } } } } } } public void AddMaterial(int itemId) { //初始化时禁止使用物品配置,会造成卡顿!!! int rarity = ItemDataManager.GetItemRarity(itemId); if (!_decomposeMaterialData.ContainsKey(rarity)) { _decomposeMaterialData.Add(rarity, new List()); } if (_decomposeMaterialData[rarity].IndexOf(itemId) < 0) { _decomposeMaterialData[rarity].Add(itemId); } } public void Remove(int itemId) { int rarity = CommonDataManager.Tables.TblItemCfg.GetOrDefault(itemId).Rarity; long count = ItemCanDecomposeCount(itemId); if (_decomposeData.ContainsKey(rarity) && _decomposeData[rarity].IndexOf(itemId) >= 0 && count <= 0) { _decomposeData[rarity].Remove(itemId); } } public void RemoveMaterial(int itemId) { int rarity = CommonDataManager.Tables.TblItemCfg.GetOrDefault(itemId).Rarity; long count = ItemCanDecomposeMaterialCount(itemId); if (_decomposeMaterialData.ContainsKey(rarity) && _decomposeMaterialData[rarity].IndexOf(itemId) >= 0 && count <= 0) { _decomposeMaterialData[rarity].Remove(itemId); } } //分解需要扣去合成需要的数量 public int DeductSynthesisNeedNum(int itemId) { ItemCfg itemCfg = CommonDataManager.Tables.TblItemCfg.GetOrDefault(itemId); if (itemCfg == null) return 0; int sum = 0; foreach (int syntheticId in itemCfg.SyntheticSuit) { if (ItemDataManager.GetItemNum(syntheticId) <= 0) { ItemCfg syntheticItemCfg = CommonDataManager.Tables.TblItemCfg.GetOrDefault(syntheticId); foreach (var MateriarsInfo in syntheticItemCfg.SyntheticMateriars) { if (MateriarsInfo.ItemId == itemId) sum += MateriarsInfo.Count; } } } return sum; } public List GetRewardList() { if (_rewardList.Count == 0) { var cfgs = CommonDataManager.Tables.TblDecomposeCfg.DataList; for (int i = 0; i < cfgs.Count; i++) { for (int j = 0; j < cfgs[i].Items.Count; j++) { if (_rewardList.IndexOf(cfgs[i].Items[j].ItemId) < 0) { _rewardList.Add(cfgs[i].Items[j].ItemId); } } } } return _rewardList; } //物品可分解的数量 public long CanDecomposeCount(int decomposeType, int itemId) { if (decomposeType == 0) { return ItemCanDecomposeCount(itemId); } else { return ItemCanDecomposeMaterialCount(itemId); } } //物品可分解的数量 public long ItemCanDecomposeCount(int itemId) { //合成需要的数量 int synthesisNum = DeductSynthesisNeedNum(itemId); return ItemDataManager.GetItemNum(itemId) - 1 - synthesisNum; } //材料可分解的数量 public long ItemCanDecomposeMaterialCount(int itemId) { //合成需要的数量 int synthesisNum = DeductSynthesisMaterialNeedNum(itemId); return ItemDataManager.GetItemNum(itemId) - synthesisNum; } //整理分解物品数据 public void TidyDecomposeData() { foreach (var itemId in DressUpMenuItemDataManager.GetDressUpItemDatas()) { if (!DressUpMenuItemCfg1Array.Instance.CheckIsBackGroundType(itemId)) { Add(itemId); } } foreach (var info in BagDataManager.Instance.GetBagData()) { if (info.Value.itemType == ConstItemType.ITEM && info.Value.subType == ConstItemSubType.MATERIAL_SKILL_BOOK) { AddMaterial(info.Value.id); } } } //获得分解服装数据 public List GetDecomposeDataByRarity(int rarity) { if (!_decomposeData.ContainsKey(rarity)) return null; return _decomposeData[rarity]; } //获得分解技能书数据 public List GetDecomposeMaterialByRarity(int rarity) { if (!_decomposeMaterialData.ContainsKey(rarity)) return null; Dictionary LeagueSkillLvDatas = SkillDataManager.Instance.LeagueSkillLvDatas; List materialDataKey = new List(); foreach (var key in _decomposeMaterialData.Keys) { materialDataKey.Add(key); } for (int i = 0; i < materialDataKey.Count; i++) { for (int k = _decomposeMaterialData[materialDataKey[i]].Count - 1; k >= 0; k--) { int itemId = _decomposeMaterialData[materialDataKey[i]][k]; if (ItemCanDecomposeMaterialCount(itemId) <= 0) { _decomposeMaterialData[materialDataKey[i]].RemoveAt(k); } } } return _decomposeMaterialData[rarity]; } //分解需要扣去合成材料需要的数量 public int DeductSynthesisMaterialNeedNum(int itemId) { int sum = 0; int skillId = ItemDataManager.GetItemSkillId(itemId); if (skillId == 0) { return 0; } Dictionary leagueSkillLvDatas = SkillDataManager.Instance.GetLeagueSkillLvDatas(); if (!leagueSkillLvDatas.ContainsKey(skillId)) return 0; int skillLv = leagueSkillLvDatas[skillId]; PassivitySkillLvlCfg skillLvlCfg = CommonDataManager.Tables.TblPassivitySkillLvlCfg.Get(skillLv, skillId); int skillLvIndex = skillLv; while (skillLvlCfg != null && skillLvlCfg.Materiars != null && skillLvlCfg.Materiars.Count > 0) { sum += skillLvlCfg.Materiars[0].Count; skillLvIndex += 1; skillLvlCfg = CommonDataManager.Tables.TblPassivitySkillLvlCfg.Get(skillLvIndex, skillId); } return sum; } public void InitSuitSyntheticMaterias() { List suitCfgs = new List(); suitCfgs.AddRange(new List(CommonDataManager.Tables.TblSuitCfg.DataList .Where(a => a.SyntheticType == 1).ToList())); suitCfgs.AddRange(new List(CommonDataManager.Tables.TblSuitCfg.DataList .Where(a => a.SyntheticType == 2).ToList())); suitCfgs.AddRange(new List(CommonDataManager.Tables.TblSuitCfg.DataList .Where(a => a.SyntheticType == 3).ToList())); for (int i = 0; i < suitCfgs.Count; i++) { int suitId = suitCfgs[i].Id; for (int j = 0; j < suitCfgs[i].Parts.Count; j++) { ItemCfg itemCfg = CommonDataManager.Tables.TblItemCfg.GetOrDefault(suitCfgs[i].Parts[j]); for (int k = 0; k < itemCfg.SyntheticMateriars.Count; k++) { int materialId = itemCfg.SyntheticMateriars[k].ItemId; if (!_suitSyntheticMaterials.ContainsKey(materialId)) { _suitSyntheticMaterials[materialId] = new List(); } if (_suitSyntheticMaterials[materialId].IndexOf(suitId) < 0) _suitSyntheticMaterials[materialId].Add(suitId); } } } } /// /// 检测物品对应的套装是否全部合成 /// /// /// public bool CheckIsItemForSuitSynthetic(int itemId) { if (!_suitSyntheticMaterials.ContainsKey(itemId)) return true; for (int i = 0; i < _suitSyntheticMaterials[itemId].Count; i++) { if (!DressUpMenuSuitDataManager.CheckHaveSuit(_suitSyntheticMaterials[itemId][i])) return false; } return true; } } }