143 lines
No EOL
5.3 KiB
C#
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);
|
|
}
|
|
}
|
|
} |