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

101 lines
No EOL
4 KiB
C#

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using PhoenixLib.Logging;
using WingsAPI.Communication;
using WingsAPI.Communication.ServerApi;
using WingsAPI.Communication.ServerApi.Protocol;
using WingsAPI.Data.Families;
using WingsAPI.Packets.Enums;
using WingsEmu.Core.Extensions;
using WingsEmu.Game;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Networking;
using WingsEmu.Game.Ship;
using WingsEmu.Game.Ship.Configuration;
using WingsEmu.Game.Ship.Event;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.Ship.Event;
public class ShipProcessEventAct4Handler : IAsyncEventProcessor<ShipProcessEvent>
{
private readonly IGameLanguageService _languageService;
private readonly IRandomGenerator _randomGenerator;
private readonly IServerApiService _serverApiService;
private readonly IServerManager _serverManager;
public ShipProcessEventAct4Handler(IServerApiService serverApiService, IServerManager serverManager, IGameLanguageService languageService, IRandomGenerator randomGenerator)
{
_serverApiService = serverApiService;
_serverManager = serverManager;
_languageService = languageService;
_randomGenerator = randomGenerator;
}
public async Task HandleAsync(ShipProcessEvent e, CancellationToken cancellation)
{
if (e.ShipInstance.ShipType != ShipType.Act4Angels && e.ShipInstance.ShipType != ShipType.Act4Demons)
{
return;
}
await ProcessDeparture(e.ShipInstance, e.CurrentTime);
}
private async Task ProcessDeparture(ShipInstance shipInstance, DateTime currentTime)
{
if (currentTime < shipInstance.LastDeparture + shipInstance.Configuration.Departure)
{
return;
}
GetChannelInfoResponse response = null;
try
{
response = await _serverApiService.GetAct4ChannelInfo(new GetAct4ChannelInfoRequest
{
WorldGroup = _serverManager.ServerGroup
});
}
catch (Exception e)
{
Log.Error("[SHIP_PROCESS_ACT4] Unexpected error happened while trying to obtain Act4 Channel's Info.", e);
}
SerializableGameServer gameServer = response?.GameServer;
if (response?.ResponseType != RpcResponseType.SUCCESS || gameServer == null)
{
shipInstance.MapInstance.Broadcast(x => x.GenerateMsgPacket(_languageService.GetLanguage(GameDialogKey.ACT4_CHANNEL_OFFLINE, x.UserLanguage), MsgMessageType.Middle));
return;
}
foreach (IClientSession session in shipInstance.MapInstance.Sessions.ToList())
{
long baseToRemove = shipInstance.Configuration.ShipCost;
short toRemove = session.PlayerEntity.Family?.UpgradeValues.GetOrDefault(FamilyUpgradeType.DECREASE_SHIP_TP_COST) ?? 0;
long amountToRemove = (long)(baseToRemove * (toRemove * 0.01));
baseToRemove -= amountToRemove;
if (!session.PlayerEntity.RemoveGold(baseToRemove))
{
session.SendErrorChatMessage(_languageService.GetLanguage(GameDialogKey.INTERACTION_MESSAGE_NOT_ENOUGH_GOLD, session.UserLanguage));
session.ChangeToLastBaseMap();
continue;
}
await session.EmitEventAsync(new PlayerChangeChannelEvent(gameServer, ItModeType.ShipToAct4, (short)shipInstance.Configuration.DestinationMapId,
(short)_randomGenerator.RandomNumber(shipInstance.Configuration.DestinationMapX.Minimum, shipInstance.Configuration.DestinationMapX.Maximum + 1),
(short)_randomGenerator.RandomNumber(shipInstance.Configuration.DestinationMapY.Minimum, shipInstance.Configuration.DestinationMapY.Maximum + 1)));
}
shipInstance.DepartureWarnings = shipInstance.Configuration.DepartureWarnings.ToList();
shipInstance.LastDeparture = currentTime;
}
}