server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/Bazaar/BazaarItemRemoveEventHandler.cs
2026-02-10 18:21:30 +01:00

116 lines
No EOL
4.8 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using PhoenixLib.Logging;
using WingsAPI.Communication;
using WingsAPI.Communication.Bazaar;
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
using WingsAPI.Game.Extensions.PacketGeneration;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Bazaar;
using WingsEmu.Game.Bazaar.Events;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Items;
using WingsEmu.Game.Managers;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.Bazaar;
public class BazaarItemRemoveEventHandler : IAsyncEventProcessor<BazaarItemRemoveEvent>
{
private readonly IBazaarManager _bazaarManager;
private readonly IBazaarService _bazaarService;
private readonly IGameItemInstanceFactory _itemInstanceFactory;
private readonly IGameLanguageService _languageService;
private readonly IServerManager _serverManager;
public BazaarItemRemoveEventHandler(IBazaarManager bazaarManager, IBazaarService bazaarService, IServerManager serverManager, IGameLanguageService languageService,
IGameItemInstanceFactory itemInstanceFactory)
{
_bazaarManager = bazaarManager;
_bazaarService = bazaarService;
_serverManager = serverManager;
_languageService = languageService;
_itemInstanceFactory = itemInstanceFactory;
}
public async Task HandleAsync(BazaarItemRemoveEvent e, CancellationToken cancellation)
{
BazaarItem item = await _bazaarManager.GetBazaarItemById(e.BazaarItemId);
if (item == null)
{
return;
}
if (item.BazaarItemDto.CharacterId != e.Sender.PlayerEntity.Id)
{
await e.Sender.NotifyStrangeBehavior(StrangeBehaviorSeverity.ABUSING, $"Tried to remove an item that is not listed by this character. BazaarItemId: {e.BazaarItemId.ToString()}");
return;
}
int amount = item.BazaarItemDto.Amount - item.BazaarItemDto.SoldAmount;
if (amount > 0 && !e.Sender.PlayerEntity.HasSpaceFor(item.Item.ItemVNum, (short)amount))
{
e.Sender.SendMsg(_languageService.GetLanguage(GameDialogKey.INTERACTION_MESSAGE_NOT_ENOUGH_PLACE, e.Sender.UserLanguage), MsgMessageType.Middle);
return;
}
BazaarItemResponse response = null;
try
{
response = await _bazaarService.RemoveItemFromBazaar(new BazaarRemoveItemRequest
{
ChannelId = _serverManager.ChannelId,
BazaarItemDto = item.BazaarItemDto,
RequesterCharacterId = e.Sender.PlayerEntity.Id
});
}
catch (Exception ex)
{
Log.Error("", ex);
}
if (response?.ResponseType != RpcResponseType.SUCCESS)
{
e.Sender.SendInfo(_languageService.GetLanguage(
response?.ResponseType == RpcResponseType.MAINTENANCE_MODE ? GameDialogKey.BAZAAR_INFO_MAINTENANCE_MODE : GameDialogKey.BAZAAR_INFO_ITEM_CHANGED, e.Sender.UserLanguage));
return;
}
long pricePerItem = response.BazaarItemDto.PricePerItem;
long totalProfit = 0;
long taxes = 0;
if (response.BazaarItemDto.SoldAmount >= 1)
{
taxes = response.BazaarItemDto.SaleFee * response.BazaarItemDto.SoldAmount / response.BazaarItemDto.Amount;
totalProfit = pricePerItem * response.BazaarItemDto.SoldAmount - taxes;
await e.Sender.EmitEventAsync(new GenerateGoldEvent(totalProfit, sendMessage: false, fallBackToBank: true));
await e.Sender.EmitEventAsync(new BazaarItemRemovedEvent
{
ItemVnum = response.BazaarItemDto.ItemInstance.ItemVNum,
SoldAmount = (short)response.BazaarItemDto.SoldAmount,
Amount = (short)response.BazaarItemDto.Amount,
TotalProfit = totalProfit
});
await e.Sender.EmitEventAsync(new BazaarItemWithdrawnEvent
{
ItemInstance = response.BazaarItemDto.ItemInstance,
Quantity = response.BazaarItemDto.Amount,
Price = response.BazaarItemDto.PricePerItem,
BazaarItemId = response.BazaarItemDto.Id
});
}
GameItemInstance itemInstance = _itemInstanceFactory.CreateItem(response.BazaarItemDto.ItemInstance);
if (response.BazaarItemDto.SoldAmount < response.BazaarItemDto.Amount)
{
itemInstance.Amount = response.BazaarItemDto.Amount - response.BazaarItemDto.SoldAmount;
await e.Sender.AddNewItemToInventory(itemInstance, sendGiftIsFull: true);
}
e.Sender.SendBazaarResponseItemRemove(true, pricePerItem, response.BazaarItemDto.SoldAmount, response.BazaarItemDto.Amount, taxes, totalProfit, itemInstance.ItemVNum);
}
}