server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/ItemUsage/Etc/Teacher/NosMateTrainerHandler.cs
2026-02-10 18:21:30 +01:00

104 lines
No EOL
3.4 KiB
C#

using System.Collections.Generic;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
using WingsEmu.DTOs.Maps;
using WingsEmu.Game;
using WingsEmu.Game._i18n;
using WingsEmu.Game._ItemUsage;
using WingsEmu.Game._ItemUsage.Event;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Helpers.Damages;
using WingsEmu.Game.Managers.StaticData;
using WingsEmu.Game.Monster.Event;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.ItemUsage.Etc.Teacher;
public class NosMateTrainerHandler : IItemHandler
{
private const int MAX_DOLLS = 10;
private readonly IAsyncEventPipeline _eventPipeline;
private readonly IGameLanguageService _gameLanguage;
private readonly INpcMonsterManager _monsterManager;
public NosMateTrainerHandler(IGameLanguageService gameLanguage, INpcMonsterManager monsterManager, IAsyncEventPipeline eventPipeline)
{
_gameLanguage = gameLanguage;
_monsterManager = monsterManager;
_eventPipeline = eventPipeline;
}
public ItemType ItemType => ItemType.PetPartnerItem;
public long[] Effects => new long[] { 21, 20 };
public async Task HandleAsync(IClientSession session, InventoryUseItemEvent e)
{
if (!session.PlayerEntity.IsAlive())
{
return;
}
if (session.PlayerEntity.IsInExchange())
{
return;
}
if (session.PlayerEntity.IsOnVehicle)
{
return;
}
if (session.PlayerEntity.HasShopOpened)
{
return;
}
int monsterVnum = e.Item.ItemInstance.GameItem.EffectValue;
IMonsterData monster = _monsterManager.GetNpc(monsterVnum);
if (monster == null)
{
return;
}
if (session.PlayerEntity.IsInMateDollZone())
{
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.DOLL_SHOUTMESSAGE_NOT_IN_ZONE, session.UserLanguage), MsgMessageType.Middle);
return;
}
int dolls = session.CurrentMapInstance.GetAliveMonsters(x => x != null && x.IsAlive() && x.SummonerId == session.PlayerEntity.Id && x.SummonerType == VisualType.Player && x.IsMateTrainer)
.Count;
if (dolls >= MAX_DOLLS)
{
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.DOLL_SHOUTMESSAGE_DOLLS_LIMIT, session.UserLanguage), MsgMessageType.Middle);
return;
}
FactionType factionType = FactionType.Neutral;
if (session.CurrentMapInstance.HasMapFlag(MapFlags.ACT_4))
{
factionType = session.PlayerEntity.Faction == FactionType.Angel ? FactionType.Demon : FactionType.Angel;
}
var listToSummon = new List<ToSummon>
{
new()
{
VNum = (short)monsterVnum,
SpawnCell = session.PlayerEntity.Position,
IsMoving = false,
IsMateTrainer = true,
FactionType = factionType
}
};
await _eventPipeline.ProcessEventAsync(new MonsterSummonEvent(session.CurrentMapInstance, listToSummon, session.PlayerEntity, false));
await session.RemoveItemFromInventory(item: e.Item);
}
}