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

103 lines
No EOL
3.8 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
using WingsAPI.Game.Extensions.ItemExtension.Item;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Act5;
using WingsEmu.Game.Configurations;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Items;
using WingsEmu.Game.Managers.StaticData;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Character;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.Act5;
public class Act5OpenNpcRunEventHandler : IAsyncEventProcessor<Act5OpenNpcRunEvent>
{
private readonly IAct5NpcRunCraftItemConfiguration _act5NpcRunCraftItemConfiguration;
private readonly IGameItemInstanceFactory _gameItemInstanceFactory;
private readonly IGameLanguageService _gameLanguage;
private readonly IItemsManager _itemsManager;
public Act5OpenNpcRunEventHandler(IAct5NpcRunCraftItemConfiguration act5NpcRunCraftItemConfiguration,
IGameItemInstanceFactory gameItemInstanceFactory, IItemsManager itemsManager, IGameLanguageService gameLanguage)
{
_act5NpcRunCraftItemConfiguration = act5NpcRunCraftItemConfiguration;
_gameItemInstanceFactory = gameItemInstanceFactory;
_itemsManager = itemsManager;
_gameLanguage = gameLanguage;
}
public async Task HandleAsync(Act5OpenNpcRunEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
NpcRunType npcRunType = e.NpcRunType;
bool isConfirm = e.IsConfirm;
if (session?.CurrentMapInstance == null)
{
return;
}
if (!session.IsInAct5())
{
return;
}
if (!isConfirm)
{
session.SendQnaPacket($"n_run {(short)npcRunType} 0 0 0 1", session.GetLanguage(GameDialogKey.ITEM_DIALOG_ASK_EXCHANGE));
return;
}
Act5NpcRunCraftItemConfig config = _act5NpcRunCraftItemConfiguration.GetConfigByNpcRun(npcRunType);
if (config == null)
{
session.SendInfo(session.GetLanguage(GameDialogKey.ACT5_CHATMESSAGE_NO_RECIPE));
return;
}
if (config.ItemByClass is true && session.PlayerEntity.Class is ClassType.Adventurer or ClassType.Wrestler)
{
return;
}
foreach (Act5NpcRunCraftItemConfigItem neededItem in config.NeededItems)
{
if (session.PlayerEntity.HasItem(neededItem.Item, (short)neededItem.Amount))
{
continue;
}
string getItemName = _itemsManager.GetItem(neededItem.Item).GetItemName(_gameLanguage, session.UserLanguage);
int missingItems = session.CountMissingItems(neededItem.Item, (short)neededItem.Amount);
session.SendMsg(session.GetLanguageFormat(GameDialogKey.INVENTORY_SHOUTMESSAGE_NOT_ENOUGH_ITEMS, missingItems, getItemName), MsgMessageType.Middle);
return;
}
int craftedItem = config.CraftedItem;
if (config.ItemByClass is true)
{
craftedItem += (int)session.PlayerEntity.Class;
}
if (!session.PlayerEntity.HasSpaceFor(craftedItem, (short)config.Amount))
{
session.SendChatMessage(session.GetLanguage(GameDialogKey.INTERACTION_MESSAGE_NOT_ENOUGH_PLACE), ChatMessageColorType.Yellow);
return;
}
foreach (Act5NpcRunCraftItemConfigItem item in config.NeededItems)
{
await session.RemoveItemFromInventory(item.Item, (short)item.Amount);
}
GameItemInstance newItem = _gameItemInstanceFactory.CreateItem(craftedItem, config.Amount);
await session.AddNewItemToInventory(newItem, true, ChatMessageColorType.Yellow);
}
}