CTT/Server/Hotfix/Game/Helper/BagHelper.cs

491 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
}
}
}