using FL.Data.Items; using FL.Network; using System; using System.Collections.Generic; using UnityEngine; using XGame.Database; using XGame.Framework.Data; namespace FL { public class EquipData : DataSingleton, IDisposable { private Dictionary _wearEquipDic = new Dictionary(); // 身上穿戴的装备数据 private List _temporaryEquipList = new List(); // 开宝藏箱子掉落的临时装备列表 private List _bagEquipList = new List(); // 装备背包列表 private List _replaceEquipList = new List(); /// /// 获得装备列表界面用到冒泡的装备uid /// public long BubblingEquipUid { set; get; } /// /// 获取身上穿戴的部位装备 /// /// /// public EquipItem GetWearEquipData(EEquipType equipType) { if (_wearEquipDic.ContainsKey(equipType)) { return _wearEquipDic[equipType]; } return null; } /// /// 更换装备 /// /// /// public void AddWearEquip(EEquipType equipType, EquipItem equipData) { _wearEquipDic.Add(equipType, equipData); } /// /// 身上该部位是否已穿戴装备 /// /// /// public bool IsWear(EEquipType equipType) { return _wearEquipDic.ContainsKey(equipType); } /// /// 更换装备 /// /// /// public void ChangeWearEquipData(EEquipType equipType, EquipItem data) { if (_wearEquipDic.ContainsKey(equipType)) { _wearEquipDic[equipType] = data; } } /// /// 清除身上穿戴的装备数据 /// public void ClearWearEquip() { foreach (EquipItem item in _wearEquipDic.Values) { if (item != null) item.Dispose(); } _wearEquipDic.Clear(); } /// /// 装备背包新增一个抓过南北数据 /// /// public void AddEquip(EquipItem equip) { _bagEquipList.Add(equip); } /// /// 获取装备背包中的某件装备信息 /// /// /// public EquipItem GetBagEquipItem(long uid) { return _bagEquipList.Find(item => item.Id == uid); } /// /// 把更换下来的装备数据替换到装备背包中对应的 /// /// /// public void UpdataBagEquipData(EquipItem equipData) { for (int i = 0; i < _bagEquipList.Count; i++) { if (_bagEquipList != null && _bagEquipList[i].Id == equipData.Id) { _bagEquipList[i] = equipData; return; } } } public void ClearReplaceData() { _replaceEquipList.Clear(); } /// /// 获取装备背包中的装备列表 /// /// public void GetEquipList(ref List equipList) { equipList.AddRange(_bagEquipList); } /// /// 移除装备背包中的某件装备 /// /// /// public void RemoveEquip(long id, bool bDispose = false) { for (int i = 0; i < _bagEquipList.Count; i++) { if (_bagEquipList[i].Id == id) { if (bDispose) { _bagEquipList[i].Dispose(); } _bagEquipList.RemoveAt(i); return; } } } /// /// 清除装备背包数据 /// public void ClearEquipBag() { foreach (EquipItem item in _bagEquipList) { if (item != null) item.Dispose(); } _bagEquipList.Clear(); } /// /// 新增的掉落临时装备 /// /// /// 是否添加到装备背包中 public void AddTemporaryEquip(EquipItem equip,bool bAddBag = true) { _temporaryEquipList.Add(equip); if (bAddBag) AddEquip(equip); } /// /// 获取装备掉落的临时背包中某个装备 /// /// /// public EquipItem GetTemporaryEquipItem(long uid) { return _temporaryEquipList.Find(item => item.Id == uid); } /// /// 获取背包的装备列表 /// /// public void GetBagEquipList(ref List equipList) { equipList.AddRange(_bagEquipList); } /// /// 装备背包是否为空 /// /// public bool IsEquipbagEmpty() { return _bagEquipList?.Count == 0; } /// /// 身上穿戴的装备列表是否为空 /// /// public bool IsWearEquipEmpty() { return _wearEquipDic.Count == 0; } /// /// 身上穿戴的装备信息 /// /// /// public EquipItem GetNewWearEquipData(ActEquipChuan equipData) { EquipmentTable equipInfo = EquipmentTableRepo.Get(equipData.equipId); EquipItem _equipItem = new EquipItem(); _equipItem.Init(equipInfo, equipData.buwei); _equipItem.Level = equipData.level; if (equipData?.eps?.Count > 0) { Attributes attr = _equipItem.Attributes; if (attr != null) { foreach (var item in equipData.eps) { attr.SetValue((EAttributeType)item.epid, item.val); } } } //装备的属性列表 var equipAttributes = new List(); _equipItem.Attributes.GetAll(ref equipAttributes, 0); _equipItem.FightingPower = GetFightingPower(equipAttributes, _equipItem); return _equipItem; } /// /// 获取装备的数据信息 /// /// /// public EquipItem GetDropEquipData(ActEquipLsList equipData) { EquipmentTable equipInfo = EquipmentTableRepo.Get(equipData.equipId); EquipItem _equipItem = new EquipItem(); _equipItem.Init(equipInfo, equipData.xhid); _equipItem.Level = equipData.level; if (equipData?.eps?.Count > 0) { Attributes attr = _equipItem.Attributes; if (attr != null) { foreach (var item in equipData.eps) { attr.SetValue((EAttributeType)item.epid, item.val); } } } //装备的属性列表 var equipAttributes = new List(); _equipItem.Attributes.GetAll(ref equipAttributes, 0); _equipItem.FightingPower = GetFightingPower(equipAttributes, _equipItem); return _equipItem; } /// /// 获取装备的属性转化的战斗力值 /// /// /// private long GetFightingPower(List attributeList, EquipItem equipItem) { long fightPower = 0; foreach (var item in attributeList) { fightPower += GetAttrToFightingPower(item, equipItem.Attributes.GetValue(item)); } return fightPower; } /// /// 属性类型转化为战力值 /// /// private int GetAttrToFightingPower(EAttributeType attributeType, long attributeVal) { AttrDescTable attrInfo = AttrDescTableRepo.Get((int)attributeType); Debug.Assert(attrInfo != null, $"AttrDescTable表不存在属性类型{attributeType}"); bool bRatio = attrInfo.Num_type == 1 || attributeType == EAttributeType.AtkSpeed; return Mathf.CeilToInt(attrInfo.PowerConversion.ToReal() * (bRatio ? (float)attributeVal.ToRealDouble() : attributeVal)); } /// /// 获取装备属性的总战力 /// /// /// public long GetEquipPower(List epsList) { long fightPower = 0; foreach (var item in epsList) { fightPower += GetAttrToFightingPower((EAttributeType)item.epid, item.val); } return fightPower; } /// /// 清除临时掉落的装备列表 /// public void ClearTemporaryEquipList() { if (_temporaryEquipList?.Count > 0) { _temporaryEquipList.Clear(); } } void IDisposable.Dispose() { if (_wearEquipDic?.Count > 0) { foreach (var item in _wearEquipDic.Values) { (item as IDisposable)?.Dispose(); } _wearEquipDic.Clear(); } ClearTemporaryEquipList(); ClearEquipBag(); } } }