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

138 lines
No EOL
6 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.Data.Bazaar;
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
using WingsAPI.Game.Extensions.ItemExtension.Item;
using WingsEmu.DTOs.Items;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Bazaar;
using WingsEmu.Game.Bazaar.Configuration;
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;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.Bazaar;
public class BazaarItemAddEventHandler : IAsyncEventProcessor<BazaarItemAddEvent>
{
private readonly BazaarConfiguration _bazaarConfiguration;
private readonly IBazaarManager _bazaarManager;
private readonly IBazaarService _bazaarService;
private readonly IGameItemInstanceFactory _itemInstanceFactory;
private readonly IGameLanguageService _languageService;
private readonly IServerManager _serverManager;
public BazaarItemAddEventHandler(IBazaarService bazaarService, IBazaarManager bazaarManager, IGameLanguageService languageService, IServerManager serverManager,
BazaarConfiguration bazaarConfiguration, IGameItemInstanceFactory itemInstanceFactory)
{
_bazaarService = bazaarService;
_bazaarManager = bazaarManager;
_languageService = languageService;
_serverManager = serverManager;
_bazaarConfiguration = bazaarConfiguration;
_itemInstanceFactory = itemInstanceFactory;
}
public async Task HandleAsync(BazaarItemAddEvent e, CancellationToken cancellation)
{
if (e.InventoryItem == null || e.InventoryItem.ItemInstance.Amount < e.Amount)
{
await e.Sender.NotifyStrangeBehavior(StrangeBehaviorSeverity.ABUSING, "[BAZAAR] The item defined is null or doesn't meet the expectations.");
return;
}
if (!e.InventoryItem.ItemInstance.GameItem.IsSoldable || e.InventoryItem.ItemInstance.IsBound
|| e.InventoryItem.ItemInstance.GameItem.ItemType is ItemType.Specialist or ItemType.Quest1 or ItemType.Quest2)
{
await e.Sender.NotifyStrangeBehavior(StrangeBehaviorSeverity.ABUSING, "[BAZAAR] Item that can't be sold is being tried to be sold.");
return;
}
int maximumListedItems = e.UsedMedal ? _bazaarConfiguration.MaximumListedItemsMedal : _bazaarConfiguration.MaximumListedItems;
ItemInstanceDTO itemCopy = _itemInstanceFactory.CreateDto(e.InventoryItem.ItemInstance);
itemCopy.Amount = e.Amount;
await e.Sender.RemoveItemFromInventory(amount: e.Amount, item: e.InventoryItem);
e.Sender.PlayerEntity.RemoveGold(e.Tax);
BazaarItemResponse response = null;
try
{
response = await _bazaarService.AddItemToBazaar(new BazaarAddItemRequest
{
ChannelId = _serverManager.ChannelId,
BazaarItemDto = new BazaarItemDTO
{
Amount = itemCopy.Amount,
CharacterId = e.Sender.PlayerEntity.Id,
ItemInstance = itemCopy,
SaleFee = e.UsedMedal ? 0 : (long)(e.PricePerItem * 0.05),
ExpiryDate = e.ExpiryDate,
DayExpiryAmount = e.DayExpiryAmount,
IsPackage = e.IsPackage,
PricePerItem = e.PricePerItem,
UsedMedal = e.UsedMedal
},
OwnerName = e.Sender.PlayerEntity.Name,
SunkGold = e.Tax,
MaximumListedItems = maximumListedItems
});
}
catch (Exception ex)
{
Log.Error("[BAZAAR_LISTING]", ex);
}
if (response == null || response.ResponseType == RpcResponseType.MAINTENANCE_MODE)
{
e.Sender.SendInfo(_languageService.GetLanguage(GameDialogKey.BAZAAR_INFO_MAINTENANCE_MODE, e.Sender.UserLanguage));
await e.Sender.AddNewItemToInventory(_itemInstanceFactory.CreateItem(itemCopy), sendGiftIsFull: true);
await e.Sender.EmitEventAsync(new GenerateGoldEvent(e.Tax, sendMessage: false));
return;
}
if (response.ResponseType == RpcResponseType.SUCCESS)
{
string itemName = e.InventoryItem.ItemInstance.GameItem.GetItemName(_languageService, e.Sender.UserLanguage);
string message = _languageService.GetLanguageFormat(GameDialogKey.BAZAAR_CHATMESSAGE_ITEM_ADDED, e.Sender.UserLanguage, itemName, e.Amount);
e.Sender.SendChatMessage(message, ChatMessageColorType.Yellow);
e.Sender.SendMsg(_languageService.GetLanguage(GameDialogKey.BAZAAR_SHOUTMESSAGE_ITEM_ADDED, e.Sender.UserLanguage), MsgMessageType.Middle);
e.Sender.SendPacket("rc_reg 1");
await e.Sender.EmitEventAsync(new BazaarItemAddedEvent
{
ItemVnum = e.InventoryItem.ItemInstance.ItemVNum,
Amount = e.Amount,
PricePerItem = e.PricePerItem,
ExpiryDate = e.ExpiryDate,
UsedMedal = e.UsedMedal,
IsPackage = e.IsPackage,
Tax = e.Tax
});
await e.Sender.EmitEventAsync(new BazaarItemInsertedEvent
{
ItemInstance = e.InventoryItem.ItemInstance,
BazaarItemId = response.BazaarItemDto.Id,
Price = e.PricePerItem,
Quantity = e.Amount,
Taxes = e.Tax
});
return;
}
e.Sender.SendInfo(_languageService.GetLanguage(GameDialogKey.BAZAAR_INFO_MAXIMUM_ITEMS_REACHED, e.Sender.UserLanguage));
await e.Sender.AddNewItemToInventory(_itemInstanceFactory.CreateItem(itemCopy), sendGiftIsFull: true);
await e.Sender.EmitEventAsync(new GenerateGoldEvent(e.Tax, sendMessage: false));
}
}