namespace Fantasy; public static class EquipHelper { /// /// 装载一个装备 /// /// /// /// 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; } /// /// 卸载一个装备 /// /// /// /// /// 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); } /// /// 卸载一个装备 /// /// /// /// /// 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); } /// /// 根据装备的位置获取装备 /// /// /// /// /// public static bool GetEquipItem(Account account, EquipPosition equipPosition, out Item item) { return ContainerHelper.GetItemByCell(account, ContainerType.Equip, (long)equipPosition, out item); } /// /// 是否是装备 /// /// /// public static bool IsEquip(this Item item) { return item.Config.IsEquip(); } /// /// 获得装备所在的装备栏位置 /// /// /// 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; } }