686 lines
25 KiB
C#
686 lines
25 KiB
C#
|
||
|
||
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;
|
||
}
|
||
}
|
||
|
||
}
|