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 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 string AddItem(Entity unit, int id, long count, bool isLock, Item oldItem = null, float randomMax = ConstDefine.EquipMaxRandom, string getSource = "未知") { NumericComponent num = unit.GetComponent(); 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, 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(); 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(); 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; } } }