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

73 lines
No EOL
2.4 KiB
C#

using System.Linq;
using System.Threading.Tasks;
using WingsEmu.Game._enum;
using WingsEmu.Game._i18n;
using WingsEmu.Game._NpcDialog;
using WingsEmu.Game._NpcDialog.Event;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Character;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.NpcDialogs;
public class ChangeClassHandler : INpcDialogAsyncHandler
{
private readonly IGameLanguageService _langService;
public ChangeClassHandler(IGameLanguageService langService) => _langService = langService;
public NpcRunType[] NpcRunTypes => new[] { NpcRunType.CHANGE_CLASS };
public async Task Execute(IClientSession session, NpcDialogEvent e)
{
if (session.PlayerEntity.Class != (byte)ClassType.Adventurer)
{
session.SendMsg(_langService.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_NO_ADNVENTURER, session.UserLanguage), MsgMessageType.Middle);
return;
}
if (session.CantPerformActionOnAct4())
{
return;
}
if (session.PlayerEntity.Level < 15 || session.PlayerEntity.JobLevel < 20)
{
session.SendMsg(_langService.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_TOO_LOW_LVL, session.UserLanguage), MsgMessageType.Middle);
return;
}
if (session.PlayerEntity.IsInGroup())
{
session.SendMsg(_langService.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_NEED_LEAVE_GROUP, session.UserLanguage), MsgMessageType.Middle);
return;
}
if (e.Argument == (byte)session.PlayerEntity.Class)
{
return;
}
if (e.Argument >= 4 || e.Argument < 0)
{
return;
}
if (session.PlayerEntity.EquippedItems.Any(s => s != null && s.ItemInstance.GameItem.Class == (byte)ItemClassType.Adventurer))
{
session.SendMsg(_langService.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_EQ_NOT_EMPTY, session.UserLanguage), MsgMessageType.Middle);
return;
}
await session.EmitEventAsync(new ChangeClassEvent
{
NewClass = (ClassType)e.Argument,
ShouldObtainBasicItems = true,
ShouldObtainNewFaction = true,
ShouldResetJobLevel = true
});
}
}