491 lines
17 KiB
C#
491 lines
17 KiB
C#
|
||
|
||
using Cal;
|
||
using Cal.DataTable;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace ET
|
||
{
|
||
public class BagHelper
|
||
{
|
||
public const int ExpId = 110201;
|
||
public const int YuanBaoId = 110202;
|
||
public const int CoinId = 110203;
|
||
public const int VoucherId = 110204;
|
||
public const int GemId = 110205;
|
||
|
||
/// <summary>
|
||
/// 收集背包信息
|
||
/// </summary>
|
||
/// <param name="unit"></param>
|
||
/// <param name="bagMapList"></param>
|
||
/// <returns></returns>
|
||
public static void GetBagInfo(Unit unit, System.Collections.Generic.List<BagMap> bagMapList)
|
||
{
|
||
Bag bag = unit.GetComponent<Bag>();
|
||
foreach (Item item in bag.ItemDic.Values)
|
||
{
|
||
if (item.IsEmpty) continue;
|
||
BagMap bagMap = new BagMap
|
||
{
|
||
Index = item.index,
|
||
NetItem = new NetItem(item)
|
||
};
|
||
if (item.ItemType == ItemType.EquipItem)
|
||
{
|
||
bagMap.EquipTransMessage = new EquipTransMessage(item.data.As<EquipItem>());
|
||
}
|
||
bagMapList.Add(bagMap);
|
||
}
|
||
}
|
||
|
||
public static Item GenerateItem(Unit unit, int itemId, int count, bool isLock, Item oldItem, float randomMax, string getSource)
|
||
{
|
||
ItemData itemData = null;
|
||
long serverId = 0;
|
||
ItemType itemType = default;
|
||
IConfig itemBase = BagHelper.GetItemBase(itemId);
|
||
switch (itemBase)
|
||
{
|
||
case EquipBase equipBase:
|
||
serverId = Game.IdGenerater.GenerateId();
|
||
if (oldItem != null)
|
||
itemData = oldItem.data.As<EquipItem>();
|
||
else
|
||
{
|
||
EquipItem equipItem = new EquipItem();
|
||
equipItem.Create(equipBase, unit, randomMax);
|
||
itemData = equipItem;
|
||
}
|
||
itemType = ItemType.EquipItem;
|
||
break;
|
||
case GoodsBase goodsBase:
|
||
if (oldItem != null)
|
||
itemData = oldItem.data.As<GoodsItem>();
|
||
else
|
||
{
|
||
GoodsItem equipItem = new GoodsItem();
|
||
equipItem.Create(goodsBase);
|
||
itemData = equipItem;
|
||
}
|
||
itemType = ItemType.GoodsItem;
|
||
break;
|
||
case MaterialBase materialBase:
|
||
if (oldItem != null)
|
||
itemData = oldItem.data.As<MaterialItem>();
|
||
else
|
||
{
|
||
MaterialItem equipItem = new MaterialItem();
|
||
equipItem.Create(materialBase);
|
||
itemData = equipItem;
|
||
}
|
||
itemType = ItemType.MaterialsItem;
|
||
break;
|
||
}
|
||
Item item = new Item(itemData)
|
||
{
|
||
ItemId = itemId,
|
||
Count = count,
|
||
ItemType = itemType,
|
||
IsLock = isLock,
|
||
ServerId = serverId,
|
||
getSource = getSource
|
||
};
|
||
return item;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 收集装备栏信息
|
||
/// </summary>
|
||
/// <param name="unit"></param>
|
||
/// <param name="bagMapList"></param>
|
||
/// <returns></returns>
|
||
public static void GetWornEquipInfo(Unit unit, System.Collections.Generic.List<BagMap> bagMapList)
|
||
{
|
||
Bag bag = unit.GetComponent<Bag>();
|
||
foreach (Item item in bag.WornEquipDic.Values)
|
||
{
|
||
BagMap bagMap = new BagMap
|
||
{
|
||
Index = item.index,
|
||
NetItem = new NetItem(item)
|
||
};
|
||
if (item.ItemType == ItemType.EquipItem)
|
||
{
|
||
bagMap.EquipTransMessage = new EquipTransMessage(item.data.As<EquipItem>());
|
||
}
|
||
bagMapList.Add(bagMap);
|
||
}
|
||
}
|
||
public static string CanUseGoods(Unit unit, Item item)
|
||
{
|
||
if (!unit.IsAlive)
|
||
{
|
||
return "您当前处于死亡状态";
|
||
}
|
||
GoodsBase goodsBase = DataTableHelper.Get<GoodsBase>(item.ItemId);
|
||
if (goodsBase == null)
|
||
{
|
||
Log.Error($"【{ UserComponent.Instance.Get(unit.Id)?.NickName} ({ unit.Id})】的物品Id = {item.ItemId}在表格中不存在");
|
||
return "系统错误";
|
||
}
|
||
NumericComponent num = unit.GetComponent<NumericComponent>();
|
||
if (num.GetAsInt(NumericType.Level) < goodsBase.UsedLevel)
|
||
{
|
||
return "使用等级不足!";
|
||
}
|
||
return null;
|
||
}
|
||
public static string UseGoodsEffect(Unit unit, Item item)
|
||
{
|
||
GoodsBase goodsBase = DataTableHelper.Get<GoodsBase>(item.ItemId);
|
||
if (goodsBase == null)
|
||
{
|
||
Log.Error($"【{ UserComponent.Instance.Get(unit.Id)?.NickName} ({ unit.Id})】的物品Id = {item.ItemId}在表格中不存在");
|
||
return "系统错误";
|
||
}
|
||
return GoodsEffectComponent.Instance.AcquireGoodsEffect(unit, goodsBase, item.IsLock);
|
||
}
|
||
|
||
|
||
|
||
public static ItemType GetItemType(int itemId)
|
||
{
|
||
if (itemId == 0) return ItemType.NoneItem;
|
||
if (itemId < 110000)
|
||
{
|
||
return ItemType.MaterialsItem;
|
||
|
||
}
|
||
if (itemId < 120000)
|
||
{
|
||
return ItemType.GoodsItem;
|
||
}
|
||
else
|
||
{
|
||
return ItemType.EquipItem;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 根据Id获取物品类型(自行判断类型)
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
public static IConfig GetItemBase(int id)
|
||
{
|
||
if (id == 0) return null;
|
||
IConfig config;
|
||
if (id < 110000)
|
||
{
|
||
config = DataTableHelper.Get<MaterialBase>(id);
|
||
}
|
||
else
|
||
{
|
||
if (id < 120000)
|
||
{
|
||
config = DataTableHelper.Get<GoodsBase>(id);
|
||
}
|
||
else
|
||
{
|
||
config = DataTableHelper.Get<EquipBase>(id);
|
||
}
|
||
}
|
||
if (config == null)
|
||
throw new Exception($"id is invalid :{id}");
|
||
return config;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取背包物品的名字
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
public static string GetName(int id)
|
||
{
|
||
if (id == 0) return null;
|
||
if (id < 110000)
|
||
{
|
||
MaterialBase materialBase = DataTableHelper.Get<MaterialBase>(id);
|
||
return materialBase.Name;
|
||
|
||
}
|
||
if (id < 120000)
|
||
{
|
||
GoodsBase goodsBase = DataTableHelper.Get<GoodsBase>(id);
|
||
return goodsBase.Name;
|
||
}
|
||
else
|
||
{
|
||
EquipBase equipBase = DataTableHelper.Get<EquipBase>(id);
|
||
return equipBase.Name;
|
||
}
|
||
}
|
||
public static string AddItem(Unit unit, int id, long count, bool isLock, Item equip = null, float randomMax = ConstDefine.EquipMaxRandom, string getSource = "未知")
|
||
{
|
||
NumericComponent num = unit.GetComponent<NumericComponent>();
|
||
switch ((SpecialGoodsType)id)
|
||
{
|
||
case SpecialGoodsType.Exp:
|
||
num.AddSet(NumericType.Exp, count);
|
||
return null;
|
||
case SpecialGoodsType.Coin:
|
||
num.AddSet(NumericType.Coin, count);
|
||
return null;
|
||
case SpecialGoodsType.Voucher:
|
||
num.AddSet(NumericType.Voucher, (int)count);
|
||
VoucherLogComponent.instance.AddInfo(unit.Id, $"{getSource} 获得了:{count}");
|
||
return null;
|
||
case SpecialGoodsType.YuanBao:
|
||
num.AddSet(NumericType.YuanBao, (int)count);
|
||
YuanBaoLogComponent.instance.AddInfo(unit.Id, $"{getSource} 获得了:{count}");
|
||
return null;
|
||
case SpecialGoodsType.Gem:
|
||
num.AddSet(NumericType.Gem, count);
|
||
return null;
|
||
}
|
||
int _count = (int)count;
|
||
string ret = ItemComponent.Instance.AddItem(unit, id, _count, isLock, equip, randomMax, getSource: getSource);
|
||
if (ret != string.Empty)
|
||
return ret;
|
||
return null;
|
||
}
|
||
public static bool HasItem(Unit unit, int id, int count)
|
||
{
|
||
Bag bag = unit.GetComponent<Bag>();
|
||
return HasItem(bag, id, count);
|
||
|
||
}
|
||
|
||
public static bool HasItem(Bag bag, int id, int count, bool needUnlocked = false)
|
||
{
|
||
if (!bag.ItemDic.TryGetValueByKey2(id, out List<Item> materialList) || materialList.Count == 0)
|
||
{
|
||
return false;
|
||
}
|
||
int materialCount = 0;
|
||
foreach (Item item in materialList)
|
||
{
|
||
if (materialCount >= count) break;
|
||
if (needUnlocked && item.IsLock) continue;
|
||
materialCount += item.Count;
|
||
}
|
||
if (materialCount < count)
|
||
{
|
||
return false;
|
||
}
|
||
return true;
|
||
|
||
}
|
||
public static bool HasItem(Bag bag, int id, int count, out bool hasLock)
|
||
{
|
||
hasLock = false;
|
||
if (!bag.ItemDic.TryGetValueByKey2(id, out List<Item> materialList) || materialList.Count == 0)
|
||
{
|
||
return false;
|
||
}
|
||
int materialCount = 0;
|
||
foreach (Item item in materialList)
|
||
{
|
||
if (materialCount >= count) break;
|
||
materialCount += item.Count;
|
||
hasLock = hasLock || item.IsLock;
|
||
}
|
||
if (materialCount < count)
|
||
{
|
||
return false;
|
||
}
|
||
return true;
|
||
|
||
}
|
||
|
||
public enum GoodAutoUseType
|
||
{
|
||
Exp,
|
||
Hp,
|
||
Mp,
|
||
}
|
||
internal static void UserGoods(Bag bag, GoodAutoUseType type)
|
||
{
|
||
int[] arr = null;
|
||
switch (type)
|
||
{
|
||
case GoodAutoUseType.Exp:
|
||
arr = ConstDefine.ExpGoodsIdArr;
|
||
break;
|
||
case GoodAutoUseType.Hp:
|
||
arr = ConstDefine.HpGoodsIdArr;
|
||
break;
|
||
case GoodAutoUseType.Mp:
|
||
arr = ConstDefine.MpGoodsIdArr;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
if (arr == null) return;
|
||
foreach (int itemId in arr)
|
||
{
|
||
if (!bag.ItemDic.TryGetValueByKey2(itemId, out List<Item> list) || list.Count == 0)
|
||
continue;
|
||
Item item = list[0];
|
||
Unit unit = bag.GetParent<Unit>();
|
||
string ret = BagHelper.CanUseGoods(unit, item);
|
||
if (ret != null)
|
||
continue;
|
||
//!消耗物品
|
||
DeleteItem(unit, item.ItemId, 1);
|
||
//!使用逻辑
|
||
BagHelper.UseGoodsEffect(unit, item);
|
||
break;
|
||
}
|
||
}
|
||
|
||
internal static async ETVoid AutoMoveItemToStore(Bag bag, int count)
|
||
{
|
||
Store store = await StoreComponent.Instance.Query(bag.Id);
|
||
for (int index = bag.MaxItemCount - count; index < bag.MaxItemCount; index++)
|
||
{
|
||
if (bag.ItemDic.TryGetValueByKey1(index, out Item item) && !item.IsEmpty )
|
||
{
|
||
bag.DeleteItem(index, item.Count);
|
||
store.AddItem(item);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void DeleteItem(Bag bag, int id, int count)
|
||
{
|
||
|
||
bag.DeleteMultiItem(id, count);
|
||
}
|
||
public static void DeleteItem(Unit unit, int id, long count)
|
||
{
|
||
NumericComponent num = unit.GetComponent<NumericComponent>();
|
||
switch ((SpecialGoodsType)id)
|
||
{
|
||
case SpecialGoodsType.Exp:
|
||
num.ReduceSet(NumericType.Exp, count);
|
||
return;
|
||
case SpecialGoodsType.Coin:
|
||
num.ReduceSet(NumericType.Coin, count);
|
||
return;
|
||
case SpecialGoodsType.Voucher:
|
||
num.ReduceSet(NumericType.Voucher, (int)count);
|
||
return;
|
||
case SpecialGoodsType.YuanBao:
|
||
num.ReduceSet(NumericType.YuanBao, (int)count);
|
||
return;
|
||
case SpecialGoodsType.Gem:
|
||
num.ReduceSet(NumericType.Gem, count);
|
||
return;
|
||
}
|
||
Bag bag = unit.GetComponent<Bag>();
|
||
DeleteItem(bag, id, (int)count);
|
||
}
|
||
|
||
private static float GetEquipAttribute(float baseA, float newA)
|
||
{
|
||
if (baseA == 0)
|
||
baseA = float.Epsilon;
|
||
return (newA - baseA) / baseA;
|
||
}
|
||
private static float GetEuqipBaseData(AttributeType attributeType, EquipBase equipBase)
|
||
{
|
||
switch (attributeType)
|
||
{
|
||
case AttributeType.无:
|
||
return 0;
|
||
case AttributeType.最大生命:
|
||
return equipBase.Hp;
|
||
case AttributeType.最大精力:
|
||
return equipBase.Mp;
|
||
case AttributeType.力量:
|
||
return equipBase.Str;
|
||
case AttributeType.敏捷:
|
||
return equipBase.Quk;
|
||
case AttributeType.精神:
|
||
return equipBase.Spi;
|
||
case AttributeType.智慧:
|
||
return equipBase.Wim;
|
||
case AttributeType.物理攻击:
|
||
return equipBase.PhyAtk;
|
||
case AttributeType.精神攻击:
|
||
return equipBase.SpiAtk;
|
||
case AttributeType.物理防御:
|
||
return equipBase.PhyDef;
|
||
case AttributeType.精神防御:
|
||
return equipBase.SpiDef;
|
||
case AttributeType.物理暴击系数:
|
||
return equipBase.Pcrir;
|
||
case AttributeType.精神暴击系数:
|
||
return equipBase.Mcrir;
|
||
case AttributeType.物理暴击效果:
|
||
return equipBase.Pcri;
|
||
case AttributeType.精神暴击效果:
|
||
return equipBase.Mcri;
|
||
case AttributeType.抗物理暴击系数:
|
||
return equipBase.Rpcrir;
|
||
case AttributeType.抗精神暴击系数:
|
||
return equipBase.Rmcrir;
|
||
case AttributeType.抗物理暴击效果:
|
||
return equipBase.Rpcri;
|
||
case AttributeType.抗精神暴击效果:
|
||
return equipBase.Rmcri;
|
||
case AttributeType.辅助值:
|
||
return equipBase.Dvo;
|
||
case AttributeType.体质:
|
||
return equipBase.Phy;
|
||
case AttributeType.耐力:
|
||
return equipBase.Sta;
|
||
case AttributeType.物理免伤:
|
||
return equipBase.Nphyi;
|
||
case AttributeType.精神免伤:
|
||
return equipBase.Nmeni;
|
||
case AttributeType.速度:
|
||
return equipBase.Spd;
|
||
case AttributeType.命中:
|
||
return equipBase.Hit;
|
||
case AttributeType.抵抗:
|
||
return equipBase.Res;
|
||
default:
|
||
return 0;
|
||
}
|
||
}
|
||
public static Item GenerateEquip(int level, int itemId, int count, bool isLock, Item oldItem, float randomMax, string getSource)
|
||
{
|
||
ItemData itemData = null;
|
||
long serverId = 0;
|
||
ItemType itemType = default;
|
||
IConfig itemBase = BagHelper.GetItemBase(itemId);
|
||
switch (itemBase)
|
||
{
|
||
case EquipBase equipBase:
|
||
serverId = Game.IdGenerater.GenerateId();
|
||
if (oldItem != null)
|
||
itemData = oldItem.data.As<EquipItem>();
|
||
else
|
||
{
|
||
EquipItem equipItem = new EquipItem();
|
||
equipItem.Create(equipBase, level, randomMax);
|
||
itemData = equipItem;
|
||
}
|
||
itemType = ItemType.EquipItem;
|
||
break;
|
||
}
|
||
Item item = new(itemData)
|
||
{
|
||
ItemId = itemId,
|
||
Count = count,
|
||
ItemType = itemType,
|
||
IsLock = isLock,
|
||
ServerId = serverId,
|
||
getSource = getSource,
|
||
};
|
||
return item;
|
||
}
|
||
}
|
||
|
||
}
|