137 lines
5.2 KiB
C#
137 lines
5.2 KiB
C#
namespace Fantasy;
|
||
|
||
public static class EquipHelper
|
||
{
|
||
/// <summary>
|
||
/// 装载一个装备
|
||
/// </summary>
|
||
/// <param name="account"></param>
|
||
/// <param name="mountEquipItem"></param>
|
||
/// <returns></returns>
|
||
public static uint MountEquip(Account account, Item mountEquipItem)
|
||
{
|
||
var itemConfig = mountEquipItem.Config;
|
||
|
||
if (!itemConfig.IsEquip())
|
||
{
|
||
// 这里返回的是不是装备的错误码。
|
||
return 1;
|
||
}
|
||
|
||
if (mountEquipItem.Container.Config.Type != (int)ContainerType.Bag)
|
||
{
|
||
// 只有在背包里的物品才可以装备到装备栏里的错误码。
|
||
return 2;
|
||
}
|
||
|
||
var mountEquipPosition = itemConfig.Position;
|
||
// 如果在目标装备栏上有装备,那就先卸载装备。
|
||
UnMountEquip(account, (EquipPosition)mountEquipPosition, true);
|
||
// 下面要执行把装备添加到装备栏上。
|
||
// 先在背包中移除该装备,因为已经得到了装备了,所以可以直接通过物品拿到背包的容器。
|
||
var removeItem = mountEquipItem.Container.RemoveItem(mountEquipItem, ItemReason.MountEquipRemove, true, false);
|
||
if (removeItem != 0)
|
||
{
|
||
// 移除装备的时候,发生了错误,直接返回错误码。
|
||
return removeItem;
|
||
}
|
||
// 把装备添加到对应的装备栏上。
|
||
var addItem = ContainerHelper.AddItem(account, ContainerType.Equip, mountEquipItem, mountEquipPosition,
|
||
ItemReason.MountEquipAdd, true);
|
||
if (addItem != 0)
|
||
{
|
||
// 添加装备的时候,发生了错误,直接返回错误码。
|
||
return addItem;
|
||
}
|
||
// 这里要执行添加装备后,因为装备有增加属性或词缀Buff,所以需要在添加的时候把这些也要给添加下。
|
||
// 因为本课程胡总没有数值系统和Buff系统,所以这里就不处理了。
|
||
Log.Debug($"执行了装备装备的效果逻辑。");
|
||
Log.Debug($"装载装备完成。mountEquipItem:{mountEquipItem.Id}");
|
||
// 可以合包优化下这个协议的数量,优化成一个,能节省流量。
|
||
return 0;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 卸载一个装备
|
||
/// </summary>
|
||
/// <param name="account"></param>
|
||
/// <param name="equipPosition"></param>
|
||
/// <param name="isSendClient"></param>
|
||
/// <returns></returns>
|
||
public static uint UnMountEquip(Account account, EquipPosition equipPosition, bool isSendClient)
|
||
{
|
||
if (!ContainerHelper.GetItemByCell(account, ContainerType.Equip, (long)equipPosition, out var unMountEquipItem))
|
||
{
|
||
// 没有找到该位置的装备的错误码。
|
||
return 1;
|
||
}
|
||
|
||
return UnMountEquip(account, unMountEquipItem, isSendClient);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 卸载一个装备
|
||
/// </summary>
|
||
/// <param name="account"></param>
|
||
/// <param name="unMountEquipItem"></param>
|
||
/// <param name="isSendClient"></param>
|
||
/// <returns></returns>
|
||
public static uint UnMountEquip(Account account, Item unMountEquipItem, bool isSendClient)
|
||
{
|
||
// 首先在装备栏容器中移除装备。
|
||
var removeItem = unMountEquipItem.Container.RemoveItem(unMountEquipItem, ItemReason.UnMountEquipRemove, isSendClient, false);
|
||
if (removeItem != 0)
|
||
{
|
||
// 移除失败了,要返回错误码,就不要执行后面的程序了。
|
||
return removeItem;
|
||
}
|
||
// 这里要执行移除装备后,因为装备有增加属性或词缀Buff,所以需要在移除的时候把这些也要给移除下。
|
||
// 因为本课程胡总没有数值系统和Buff系统,所以这里就不处理了。
|
||
// 把移除成功的装备再次添加到背包容器中。
|
||
Log.Debug("执行了装备卸载的效果逻辑。");
|
||
return ContainerHelper.AddItem(account, ContainerType.Bag, unMountEquipItem, ItemReason.UnMountEquipAdd, isSendClient);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据装备的位置获取装备
|
||
/// </summary>
|
||
/// <param name="account"></param>
|
||
/// <param name="equipPosition"></param>
|
||
/// <param name="item"></param>
|
||
/// <returns></returns>
|
||
public static bool GetEquipItem(Account account, EquipPosition equipPosition, out Item item)
|
||
{
|
||
return ContainerHelper.GetItemByCell(account, ContainerType.Equip, (long)equipPosition, out item);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 是否是装备
|
||
/// </summary>
|
||
/// <param name="item"></param>
|
||
/// <returns></returns>
|
||
public static bool IsEquip(this Item item)
|
||
{
|
||
return item.Config.IsEquip();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获得装备所在的装备栏位置
|
||
/// </summary>
|
||
/// <param name="item"></param>
|
||
/// <returns></returns>
|
||
public static EquipPosition GetEquipPosition(this Item item)
|
||
{
|
||
return (EquipPosition)item.GetEquipPositionInt();
|
||
}
|
||
|
||
private static int GetEquipPositionInt(this Item item)
|
||
{
|
||
return item.Config.Position;
|
||
}
|
||
|
||
private static bool IsEquip(this ItemConfig itemConfig)
|
||
{
|
||
var configType = (ItemType)itemConfig.Type;
|
||
return configType == ItemType.Equip;
|
||
}
|
||
} |