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

686 lines
25 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 (var 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;
var 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 (var 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 "系统错误";
}
var 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)
{
var materialBase = DataTableHelper.Get<MaterialBase>(id);
return materialBase.Name;
}
if (id < 120000)
{
var goodsBase = DataTableHelper.Get<GoodsBase>(id);
return goodsBase.Name;
}
else
{
var 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 = "未知")
{
var 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 var materialList) || materialList.Count == 0)
{
return false;
}
int materialCount = 0;
foreach (var 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 var materialList) || materialList.Count == 0)
{
return false;
}
int materialCount = 0;
foreach (var 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 (var itemId in arr)
{
if (!bag.ItemDic.TryGetValueByKey2(itemId, out var list) || list.Count == 0)
continue;
Item item = list[0];
var unit = bag.GetParent<Unit>();
var 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 var 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)
{
var 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);
}
internal static async ETTask UpdateEquip()
{
var bagList = await DBComponent.Instance.QueryJson<Bag>("{}");
foreach (var bag in bagList)
{
try
{
bool isRequired = false;
foreach (var kv in bag.WornEquipDic)
{
try
{
Item item = kv.Value;
if (item.ItemType == ItemType.EquipItem)
{
isRequired = true;
await ChangAttribute(bag.Id, item);
}
}
catch (Exception e)
{
Log.Error(e);
}
}
foreach (var kv in bag.ItemDic)
{
try
{
Item item = kv.Value;
if (item.ItemType == ItemType.EquipItem)
{
isRequired = true;
await ChangAttribute(bag.Id, item);
}
}
catch (Exception e)
{
Log.Error(e);
}
}
if (isRequired)
{
Unit unit = MapUnitComponent.Instance.Get(bag.Id);
if (unit != null)
{
unit.RemoveComponent<Bag>();
unit.AddComponent(bag);
}
await DBComponent.Instance.Save(bag);
}
}
catch (Exception e)
{
Log.Error(e);
}
}
Log.Info($"bag结束");
var list = await DBComponent.Instance.QueryJson<Store>("{}");
foreach (var store in list)
{
try
{
bool isRequired = false;
foreach (var kv in store.StoreDic)
{
try
{
Item item = kv.Value;
if (item.ItemType == ItemType.EquipItem)
{
isRequired = true;
await ChangAttribute(store.Id, item);
}
}
catch (Exception e)
{
Log.Error(e);
}
}
if (isRequired)
{
var _store = await StoreComponent.Instance.Query(store.Id);
if (_store != null)
{
_store = store;
}
await DBComponent.Instance.Save(store);
}
}
catch (Exception e)
{
Log.Error(e);
}
}
Log.Info($"store结束");
var mailList = await DBComponent.Instance.QueryJson<MailLib>("{}");
foreach (var mailLib in mailList)
{
try
{
bool isRequired = false;
foreach (var mail in mailLib.Dic.Values)
{
try
{
foreach (var mailItem in mail.RewordArr)
{
try
{
if (mailItem.IsHasItem)
{
Item item = mailItem.Item;
if (item.ItemType == ItemType.EquipItem)
{
isRequired = true;
await ChangAttribute(mailLib.Id, item);
}
}
}
catch (Exception e)
{
Log.Error(e);
}
}
}
catch (Exception e)
{
Log.Error(e);
}
}
if (isRequired)
{
await DBComponent.Instance.Save(mailLib);
}
}
catch (Exception e)
{
Log.Error(e);
}
}
Log.Info($"mail结束");
var consignmentList = await DBComponent.Instance.QueryJson<Consignment>("{}");
foreach (var consignment in consignmentList)
{
try
{
bool isRequired = false;
if (consignment.Item.ItemType == ItemType.EquipItem)
{
isRequired = true;
await ChangAttribute(consignment.UnitId, consignment.Item);
}
if (isRequired)
{
var _store = await ConsignmentComponent.Instance.QueryById(consignment.Id);
if (_store != null)
{
_store = consignment;
}
await DBComponent.Instance.Save(consignment);
}
}
catch (Exception e)
{
Log.Error(e);
}
}
Log.Info($"全部结束");
static async ETTask ChangAttribute(long id, Item item)
{
Item _item;
User user = await DBComponent.Instance.Query<User>(id);
if (user == null)
{
Log.Error($"user == null where id = {id}");
_item = GenerateEquip(1, item.ItemId, item.Count, item.IsLock, null, ConstDefine.EquipMaxRandom, item.getSource);
}
_item = GenerateEquip(user.Level, item.ItemId, item.Count, item.IsLock, null, ConstDefine.EquipMaxRandom, item.getSource);
var list = item.data.As<EquipItem>().gemList;
item.data = _item.data;
foreach (var gemId in list)
{
try
{
await MailHelper.AddItem(id, gemId, 1, true, "", "系统强制拆除", "宝石位置发生改变,强制拆除所有宝石", "系统");
}
catch (Exception e)
{
Log.Error(e);
}
}
}
}
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;
var 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;
}
}
}