123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- 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<EquipData>, IDisposable
- {
- private Dictionary<EEquipType, EquipItem> _wearEquipDic = new Dictionary<EEquipType, EquipItem>(); // 身上穿戴的装备数据
- private List<EquipItem> _temporaryEquipList = new List<EquipItem>(); // 开宝藏箱子掉落的临时装备列表
- private List<EquipItem> _bagEquipList = new List<EquipItem>(); // 装备背包列表
- private List<EquipItem> _replaceEquipList = new List<EquipItem>();
- /// <summary>
- /// 获得装备列表界面用到冒泡的装备uid
- /// </summary>
- public long BubblingEquipUid { set; get; }
- /// <summary>
- /// 获取身上穿戴的部位装备
- /// </summary>
- /// <param name="equipType"></param>
- /// <returns></returns>
- public EquipItem GetWearEquipData(EEquipType equipType)
- {
- if (_wearEquipDic.ContainsKey(equipType))
- {
- return _wearEquipDic[equipType];
- }
- return null;
- }
- /// <summary>
- /// 更换装备
- /// </summary>
- /// <param name="equipType"></param>
- /// <param name="id"></param>
- public void AddWearEquip(EEquipType equipType, EquipItem equipData)
- {
- _wearEquipDic.Add(equipType, equipData);
- }
- /// <summary>
- /// 身上该部位是否已穿戴装备
- /// </summary>
- /// <param name="equipType"></param>
- /// <returns></returns>
- public bool IsWear(EEquipType equipType)
- {
- return _wearEquipDic.ContainsKey(equipType);
- }
- /// <summary>
- /// 更换装备
- /// </summary>
- /// <param name="equipType"></param>
- /// <param name="id"></param>
- public void ChangeWearEquipData(EEquipType equipType, EquipItem data)
- {
- if (_wearEquipDic.ContainsKey(equipType))
- {
- _wearEquipDic[equipType] = data;
- }
- }
- /// <summary>
- /// 清除身上穿戴的装备数据
- /// </summary>
- public void ClearWearEquip()
- {
- foreach (EquipItem item in _wearEquipDic.Values)
- {
- if (item != null)
- item.Dispose();
- }
- _wearEquipDic.Clear();
- }
- /// <summary>
- /// 装备背包新增一个抓过南北数据
- /// </summary>
- /// <param name="equip"></param>
- public void AddEquip(EquipItem equip)
- {
- _bagEquipList.Add(equip);
- }
- /// <summary>
- /// 获取装备背包中的某件装备信息
- /// </summary>
- /// <param name="uid"></param>
- /// <returns></returns>
- public EquipItem GetBagEquipItem(long uid)
- {
- return _bagEquipList.Find(item => item.Id == uid);
- }
- /// <summary>
- /// 把更换下来的装备数据替换到装备背包中对应的
- /// </summary>
- /// <param name="wearEquip"></param>
- /// <param name="replaceEquipData"></param>
- 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();
- }
- /// <summary>
- /// 获取装备背包中的装备列表
- /// </summary>
- /// <param name="equipList"></param>
- public void GetEquipList(ref List<EquipItem> equipList)
- {
- equipList.AddRange(_bagEquipList);
- }
- /// <summary>
- /// 移除装备背包中的某件装备
- /// </summary>
- /// <param name="id"></param>
- /// <param name="bDispose"></param>
- 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;
- }
- }
- }
- /// <summary>
- /// 清除装备背包数据
- /// </summary>
- public void ClearEquipBag()
- {
- foreach (EquipItem item in _bagEquipList)
- {
- if (item != null)
- item.Dispose();
- }
- _bagEquipList.Clear();
- }
- /// <summary>
- /// 新增的掉落临时装备
- /// </summary>
- /// <param name="equip"></param>
- /// <param name="bAddBag">是否添加到装备背包中</param>
- public void AddTemporaryEquip(EquipItem equip,bool bAddBag = true)
- {
- _temporaryEquipList.Add(equip);
- if (bAddBag)
- AddEquip(equip);
- }
- /// <summary>
- /// 获取装备掉落的临时背包中某个装备
- /// </summary>
- /// <param name="uid"></param>
- /// <returns></returns>
- public EquipItem GetTemporaryEquipItem(long uid)
- {
- return _temporaryEquipList.Find(item => item.Id == uid);
- }
- /// <summary>
- /// 获取背包的装备列表
- /// </summary>
- /// <param name="equipList"></param>
- public void GetBagEquipList(ref List<EquipItem> equipList)
- {
- equipList.AddRange(_bagEquipList);
- }
- /// <summary>
- /// 装备背包是否为空
- /// </summary>
- /// <returns></returns>
- public bool IsEquipbagEmpty()
- {
- return _bagEquipList?.Count == 0;
- }
- /// <summary>
- /// 身上穿戴的装备列表是否为空
- /// </summary>
- /// <returns></returns>
- public bool IsWearEquipEmpty()
- {
- return _wearEquipDic.Count == 0;
- }
- /// <summary>
- /// 身上穿戴的装备信息
- /// </summary>
- /// <param name="equipData"></param>
- /// <returns></returns>
- 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<EAttributeType>();
- _equipItem.Attributes.GetAll(ref equipAttributes, 0);
- _equipItem.FightingPower = GetFightingPower(equipAttributes, _equipItem);
- return _equipItem;
- }
- /// <summary>
- /// 获取装备的数据信息
- /// </summary>
- /// <param name="equipData"></param>
- /// <returns></returns>
- 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<EAttributeType>();
- _equipItem.Attributes.GetAll(ref equipAttributes, 0);
- _equipItem.FightingPower = GetFightingPower(equipAttributes, _equipItem);
- return _equipItem;
- }
- /// <summary>
- /// 获取装备的属性转化的战斗力值
- /// </summary>
- /// <param name="attrMap"></param>
- /// <returns></returns>
- private long GetFightingPower(List<EAttributeType> attributeList, EquipItem equipItem)
- {
- long fightPower = 0;
- foreach (var item in attributeList)
- {
- fightPower += GetAttrToFightingPower(item, equipItem.Attributes.GetValue(item));
- }
- return fightPower;
- }
- /// <summary>
- /// 属性类型转化为战力值
- /// </summary>
- /// <returns></returns>
- 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));
- }
- /// <summary>
- /// 获取装备属性的总战力
- /// </summary>
- /// <param name="epsList"></param>
- /// <returns></returns>
- public long GetEquipPower(List<EpsSchema> epsList)
- {
- long fightPower = 0;
- foreach (var item in epsList)
- {
- fightPower += GetAttrToFightingPower((EAttributeType)item.epid, item.val);
- }
- return fightPower;
- }
- /// <summary>
- /// 清除临时掉落的装备列表
- /// </summary>
- 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();
- }
- }
- }
|