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;
public const int FamilyCoinId = 110206;
///
/// 收集背包信息
///
///
///
///
public static void GetBagInfo(Unit unit, System.Collections.Generic.List bagMapList)
{
Bag bag = unit.GetComponent();
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());
}
bagMapList.Add(bagMap);
}
}
public static Item GenerateItem(Entity 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();
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();
else
{
GoodsItem equipItem = new GoodsItem();
equipItem.Create(goodsBase);
itemData = equipItem;
}
itemType = ItemType.GoodsItem;
break;
case MaterialBase materialBase:
if (oldItem != null)
itemData = oldItem.data.As();
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;
}
///
/// 收集装备栏信息
///
///
///
///
public static void GetWornEquipInfo(Unit unit, System.Collections.Generic.List bagMapList)
{
Bag bag = unit.GetComponent();
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());
}
bagMapList.Add(bagMap);
}
}
public static string CanUseGoods(Unit unit, Item item)
{
if (!unit.IsAlive)
{
return "您当前处于死亡状态";
}
GoodsBase goodsBase = DataTableHelper.Get(item.ItemId);
if (goodsBase == null)
{
Log.Error($"【{UserComponent.Instance.Get(unit.Id)?.NickName} ({unit.Id})】的物品Id = {item.ItemId}在表格中不存在");
return "系统错误";
}
NumericComponent num = unit.GetComponent();
if (num.GetAsInt(NumericType.Level) < goodsBase.UsedLevel)
{
return "使用等级不足!";
}
return null;
}
public static string UseGoodsEffect(Unit unit, Item item)
{
GoodsBase goodsBase = DataTableHelper.Get(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;
}
}
///
/// 根据Id获取物品类型(自行判断类型)
///
///
///
public static IConfig GetItemBase(int id)
{
if (id == 0) return null;
IConfig config;
if (id < 110000)
{
config = DataTableHelper.Get(id);
}
else
{
if (id < 120000)
{
config = DataTableHelper.Get(id);
}
else
{
config = DataTableHelper.Get(id);
}
}
if (config == null)
throw new Exception($"id is invalid :{id}");
return config;
}
///
/// 获取背包物品的名字
///
///
///
public static string GetName(int id)
{
if (id == 0) return null;
if (id < 110000)
{
MaterialBase materialBase = DataTableHelper.Get(id);
return materialBase.Name;
}
if (id < 120000)
{
GoodsBase goodsBase = DataTableHelper.Get(id);
return goodsBase.Name;
}
else
{
EquipBase equipBase = DataTableHelper.Get(id);
return equipBase.Name;
}
}
public static bool IsSpecialItem(int id)
{
return id is
BagHelper.ExpId or
BagHelper.YuanBaoId or
BagHelper.VoucherId or
BagHelper.GemId or
BagHelper.CoinId or
BagHelper.FamilyCoinId
;
}
public static string AddItem(Entity unit, int id, long count, bool isLock, Item oldItem = null, float randomMax = ConstDefine.EquipMaxRandom,
string getSource = "未知")
{
NumericComponent num = unit.GetComponent();
if (IsSpecialItem(id))
{
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;
case SpecialGoodsType.FamilyCoin:
num.AddSet(NumericType.FamilyContribution, count);
return null;
}
}
int _count = (int) count;
string ret = ItemComponent.Instance.AddItem(unit, id, _count, isLock, oldItem, randomMax, getSource: getSource);
if (ret != string.Empty)
return ret;
return null;
}
public static bool CanAddItem(Entity unit, int itemId, int count)
{
return ItemComponent.Instance.CanAddItem(unit, itemId, count);
}
public static bool HasItem(Entity unit, int id, int count)
{
Bag bag = unit.GetComponent();
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- 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
- 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
- list) || list.Count == 0)
continue;
Item item = list[0];
Unit unit = bag.GetParent();
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(Entity unit, int id, long count)
{
NumericComponent num = unit.GetComponent();
if (IsSpecialItem(id))
{
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;
case SpecialGoodsType.FamilyCoin:
num.ReduceSet(NumericType.FamilyContribution, count);
return;
}
}
Bag bag = unit.GetComponent();
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();
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;
}
}
}