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

491 lines
17 KiB
C#
Raw Normal View History

2021-04-08 20:09:59 +08:00

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>();
2021-04-11 19:50:39 +08:00
foreach (Item item in bag.ItemDic.Values)
2021-04-08 20:09:59 +08:00
{
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;
2021-04-11 19:50:39 +08:00
IConfig itemBase = BagHelper.GetItemBase(itemId);
2021-04-08 20:09:59 +08:00
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>();
2021-04-11 19:50:39 +08:00
foreach (Item item in bag.WornEquipDic.Values)
2021-04-08 20:09:59 +08:00
{
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 "系统错误";
}
2021-04-11 19:50:39 +08:00
NumericComponent num = unit.GetComponent<NumericComponent>();
2021-04-08 20:09:59 +08:00
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)
{
2021-04-11 19:50:39 +08:00
MaterialBase materialBase = DataTableHelper.Get<MaterialBase>(id);
2021-04-08 20:09:59 +08:00
return materialBase.Name;
}
if (id < 120000)
{
2021-04-11 19:50:39 +08:00
GoodsBase goodsBase = DataTableHelper.Get<GoodsBase>(id);
2021-04-08 20:09:59 +08:00
return goodsBase.Name;
}
else
{
2021-04-11 19:50:39 +08:00
EquipBase equipBase = DataTableHelper.Get<EquipBase>(id);
2021-04-08 20:09:59 +08:00
return equipBase.Name;
}
}
public static string AddItem(Unit unit, int id, long count, bool isLock, Item equip = null, float randomMax = ConstDefine.EquipMaxRandom, string getSource = "未知")
{
2021-04-11 19:50:39 +08:00
NumericComponent num = unit.GetComponent<NumericComponent>();
2021-04-08 20:09:59 +08:00
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)
{
2021-04-11 19:50:39 +08:00
if (!bag.ItemDic.TryGetValueByKey2(id, out List<Item> materialList) || materialList.Count == 0)
2021-04-08 20:09:59 +08:00
{
return false;
}
int materialCount = 0;
2021-04-11 19:50:39 +08:00
foreach (Item item in materialList)
2021-04-08 20:09:59 +08:00
{
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;
2021-04-11 19:50:39 +08:00
if (!bag.ItemDic.TryGetValueByKey2(id, out List<Item> materialList) || materialList.Count == 0)
2021-04-08 20:09:59 +08:00
{
return false;
}
int materialCount = 0;
2021-04-11 19:50:39 +08:00
foreach (Item item in materialList)
2021-04-08 20:09:59 +08:00
{
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;
2021-04-11 19:50:39 +08:00
foreach (int itemId in arr)
2021-04-08 20:09:59 +08:00
{
2021-04-11 19:50:39 +08:00
if (!bag.ItemDic.TryGetValueByKey2(itemId, out List<Item> list) || list.Count == 0)
2021-04-08 20:09:59 +08:00
continue;
Item item = list[0];
2021-04-11 19:50:39 +08:00
Unit unit = bag.GetParent<Unit>();
string ret = BagHelper.CanUseGoods(unit, item);
2021-04-08 20:09:59 +08:00
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++)
{
2021-04-11 19:50:39 +08:00
if (bag.ItemDic.TryGetValueByKey1(index, out Item item) && !item.IsEmpty )
2021-04-08 20:09:59 +08:00
{
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)
{
2021-04-11 19:50:39 +08:00
NumericComponent num = unit.GetComponent<NumericComponent>();
2021-04-08 20:09:59 +08:00
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;
2021-04-11 19:50:39 +08:00
IConfig itemBase = BagHelper.GetItemBase(itemId);
2021-04-08 20:09:59 +08:00
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;
}
}
}