100 lines
No EOL
3.4 KiB
C#
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;
|
|
}
|
|
} |