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

100 lines
No EOL
3.4 KiB
C#

using System.Threading.Tasks;
using PhoenixLib.Logging;
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
using WingsEmu.DTOs.Items;
using WingsEmu.Game._enum;
using WingsEmu.Game._Guri;
using WingsEmu.Game._Guri.Event;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Inventory;
using WingsEmu.Game.Items;
using WingsEmu.Game.Managers.StaticData;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
using WingsEmu.Plugins.BasicImplementations.Algorithms.Shells;
namespace WingsEmu.Plugins.BasicImplementations.Guri;
public class PerfumeGuriHandler : IGuriHandler
{
private readonly IGameLanguageService _gameLanguageService;
private readonly IItemsManager _itemsManager;
private readonly IShellPerfumeConfiguration _perfumeConfiguration;
public PerfumeGuriHandler(IShellPerfumeConfiguration perfumeConfiguration, IGameLanguageService gameLanguageService, IItemsManager itemsManager)
{
_perfumeConfiguration = perfumeConfiguration;
_gameLanguageService = gameLanguageService;
_itemsManager = itemsManager;
}
public long GuriEffectId => 205;
public async Task ExecuteAsync(IClientSession session, GuriEvent guriPacket)
{
if (guriPacket.User == null)
{
return;
}
const int perfumeVnum = (short)ItemVnums.PERFUME;
var perfumeInventoryType = (InventoryType)guriPacket.Data;
InventoryItem eq = session.PlayerEntity.GetItemBySlotAndType((short)guriPacket.User.Value, perfumeInventoryType);
if (eq == null)
{
return;
}
if (eq.ItemInstance.Type != ItemInstanceType.WearableInstance)
{
return;
}
GameItemInstance eqItem = eq.ItemInstance;
if (!eqItem.BoundCharacterId.HasValue)
{
return;
}
// Item already yours
if (eqItem.BoundCharacterId == session.PlayerEntity.Id)
{
return;
}
int? perfumesNeeded = _perfumeConfiguration.GetPerfumesByLevelAndRarity(eqItem.GameItem.LevelMinimum, (byte)eqItem.Rarity, eqItem.GameItem.IsHeroic);
if (perfumesNeeded == null)
{
Log.Debug($"[ERROR] A valid perfume configuration for LV: {eqItem.GameItem.LevelMinimum}, Rarity: {eqItem.Rarity}, IsHeroic: {eqItem.GameItem.IsHeroic} was not found.");
return;
}
if (!session.PlayerEntity.HasItem(perfumeVnum, (short)perfumesNeeded))
{
session.SendInfo(_gameLanguageService.GetLanguage(GameDialogKey.INVENTORY_SHOUTMESSAGE_NOT_ENOUGH_ITEMS, session.UserLanguage));
return;
}
int? goldNeeded = _perfumeConfiguration.GetGoldByLevel(eqItem.GameItem.LevelMinimum, eqItem.GameItem.IsHeroic);
if (goldNeeded == null)
{
Log.Debug($"[ERROR] A valid gold configuration for LV: {eqItem.GameItem.LevelMinimum}, IsHeroic: {eqItem.GameItem.IsHeroic} was not found.");
return;
}
if (session.PlayerEntity.Gold < goldNeeded)
{
session.SendInfo(_gameLanguageService.GetLanguage(GameDialogKey.INTERACTION_MESSAGE_NOT_ENOUGH_GOLD, session.UserLanguage));
return;
}
session.PlayerEntity.Gold -= (long)goldNeeded;
session.RefreshGold();
await session.RemoveItemFromInventory(perfumeVnum, (short)perfumesNeeded);
eqItem.BoundCharacterId = session.PlayerEntity.Id;
}
}