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

143 lines
No EOL
5.3 KiB
C#

using System;
using System.Threading.Tasks;
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
using WingsEmu.DTOs.Maps;
using WingsEmu.Game._enum;
using WingsEmu.Game._Guri;
using WingsEmu.Game._Guri.Event;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.Guri;
public class WingsOfFriendshipGuriHandler : IGuriHandler
{
private readonly IDelayManager _delay;
private readonly IGameLanguageService _gameLanguageService;
private readonly ISessionManager _sessionManager;
public WingsOfFriendshipGuriHandler(IGameLanguageService gameLanguageService, IMapManager mapManager, ISessionManager sessionManager, IDelayManager delay)
{
_sessionManager = sessionManager;
_delay = delay;
_gameLanguageService = gameLanguageService;
}
public long GuriEffectId => 199;
public async Task ExecuteAsync(IClientSession session, GuriEvent guriPacket)
{
if (guriPacket.User == null)
{
return;
}
if (!long.TryParse(guriPacket.User.Value.ToString(), out long charId))
{
return;
}
if (session.CantPerformActionOnAct4())
{
return;
}
IClientSession otherSession = _sessionManager.GetSessionByCharacterId(charId);
bool isMarriedToTarget = session.PlayerEntity.IsMarried(charId);
if (!session.PlayerEntity.IsFriend(charId) && !isMarriedToTarget)
{
session.SendMsg(_gameLanguageService.GetLanguage(GameDialogKey.FRIEND_SHOUTMESSAGE_CHARACTER_NOT_FRIEND, session.UserLanguage), MsgMessageType.Middle);
return;
}
if (otherSession == null)
{
session.SendMsg(_gameLanguageService.GetLanguage(GameDialogKey.INFORMATION_MESSAGE_USER_NOT_CONNECTED, session.UserLanguage), MsgMessageType.Middle);
return;
}
bool hasItem = session.PlayerEntity.HasItem((short)ItemVnums.WING_OF_FRIENDSHIP);
bool hasLimitedItem = session.PlayerEntity.HasItem((short)ItemVnums.WING_OF_FRIENDSHIP_LIMITED);
if (!hasItem && !hasLimitedItem && !isMarriedToTarget)
{
session.SendChatMessage(_gameLanguageService.GetLanguage(GameDialogKey.INFORMATION_CHATMESSAGE_NO_WINGS, session.UserLanguage), ChatMessageColorType.Red);
return;
}
if (!session.CurrentMapInstance.HasMapFlag(MapFlags.IS_BASE_MAP) && !session.CurrentMapInstance.HasMapFlag(MapFlags.ACT_4))
{
session.SendMsg(_gameLanguageService.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_MUST_BE_IN_CLASSIC_MAP, session.UserLanguage), MsgMessageType.Middle);
return;
}
if (!otherSession.CurrentMapInstance.HasMapFlag(MapFlags.IS_BASE_MAP) && !otherSession.CurrentMapInstance.HasMapFlag(MapFlags.ACT_4))
{
session.SendMsg(_gameLanguageService.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_USER_NOT_BASEMAP, session.UserLanguage), MsgMessageType.Middle);
return;
}
// Act 5
if (session.IsInAct5() && !otherSession.IsInAct5())
{
session.SendMsg(_gameLanguageService.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_MUST_BE_IN_CLASSIC_MAP, session.UserLanguage), MsgMessageType.Middle);
return;
}
if (!session.IsInAct5() && otherSession.IsInAct5())
{
session.SendMsg(_gameLanguageService.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_USER_NOT_BASEMAP, session.UserLanguage), MsgMessageType.Middle);
return;
}
if (guriPacket.Data != 2)
{
DateTime waitUntil = await _delay.RegisterAction(session.PlayerEntity, DelayedActionType.WingOfFriendship);
session.SendDelay((int)(waitUntil - DateTime.UtcNow).TotalMilliseconds, GuriType.UsingItem, $"guri 199 2 {charId}");
return;
}
if (!await _delay.CanPerformAction(session.PlayerEntity, DelayedActionType.WingOfFriendship))
{
return;
}
await _delay.CompleteAction(session.PlayerEntity, DelayedActionType.WingOfFriendship);
switch (otherSession.CurrentMapInstance.MapInstanceType)
{
case MapInstanceType.Act4Instance:
if (session.PlayerEntity.Faction != otherSession.PlayerEntity.Faction)
{
return;
}
short mapInstanceX = otherSession.PlayerEntity.PositionY;
short mapInstanceY = otherSession.PlayerEntity.PositionX;
session.ChangeMap(otherSession.CurrentMapInstance, mapInstanceX, mapInstanceY);
break;
default:
short mapY = otherSession.PlayerEntity.PositionY;
short mapX = otherSession.PlayerEntity.PositionX;
int mapId = otherSession.PlayerEntity.MapInstance.MapId;
session.ChangeMap(mapId, mapX, mapY);
break;
}
if (!isMarriedToTarget)
{
await session.RemoveItemFromInventory(hasLimitedItem ? (short)ItemVnums.WING_OF_FRIENDSHIP_LIMITED : (short)ItemVnums.WING_OF_FRIENDSHIP);
}
}
}