170 lines
No EOL
5.8 KiB
C#
170 lines
No EOL
5.8 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using WingsAPI.Game.Extensions.Groups;
|
|
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
|
|
using WingsEmu.Game._enum;
|
|
using WingsEmu.Game._i18n;
|
|
using WingsEmu.Game._ItemUsage;
|
|
using WingsEmu.Game._ItemUsage.Configuration;
|
|
using WingsEmu.Game._ItemUsage.Event;
|
|
using WingsEmu.Game.Battle;
|
|
using WingsEmu.Game.Characters.Events;
|
|
using WingsEmu.Game.Extensions;
|
|
using WingsEmu.Game.Extensions.Mates;
|
|
using WingsEmu.Game.Managers;
|
|
using WingsEmu.Game.Maps;
|
|
using WingsEmu.Game.Mates;
|
|
using WingsEmu.Game.Mates.Events;
|
|
using WingsEmu.Game.Networking;
|
|
using WingsEmu.Game.Networking.Broadcasting;
|
|
using WingsEmu.Packets.Enums;
|
|
using WingsEmu.Packets.Enums.Character;
|
|
using WingsEmu.Packets.Enums.Chat;
|
|
using WingsEmu.Plugins.BasicImplementations.Vehicles;
|
|
|
|
namespace WingsEmu.Plugins.BasicImplementations.ItemUsage.Main.Special;
|
|
|
|
public class VehicleHandler : IItemHandler
|
|
{
|
|
private readonly IDelayManager _delayManager;
|
|
private readonly IGameLanguageService _languageService;
|
|
private readonly IMapManager _mapManager;
|
|
private readonly IVehicleConfigurationProvider _provider;
|
|
private readonly ISpPartnerConfiguration _spPartner;
|
|
|
|
public VehicleHandler(IDelayManager delayManager, IGameLanguageService languageService, IVehicleConfigurationProvider provider, ISpPartnerConfiguration spPartner, IMapManager mapManager)
|
|
{
|
|
_delayManager = delayManager;
|
|
_languageService = languageService;
|
|
_provider = provider;
|
|
_spPartner = spPartner;
|
|
_mapManager = mapManager;
|
|
}
|
|
|
|
public ItemType ItemType => ItemType.Special;
|
|
public long[] Effects => new long[] { 1000 };
|
|
|
|
public async Task HandleAsync(IClientSession session, InventoryUseItemEvent e)
|
|
{
|
|
if (!session.HasCurrentMapInstance)
|
|
{
|
|
// log it and report
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.RainbowBattleComponent.IsInRainbowBattle)
|
|
{
|
|
session.SendChatMessage(session.GetLanguage(GameDialogKey.ITEM_MESSAGE_CANT_USE), ChatMessageColorType.Yellow);
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.HasShopOpened)
|
|
{
|
|
// log it and report for abusing
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.IsInExchange())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!session.PlayerEntity.IsAlive())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.IsCastingSkill)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.LastSkillUse.AddSeconds(2) > DateTime.UtcNow)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!session.PlayerEntity.IsOnVehicle && session.PlayerEntity.BuffComponent.HasBuff(BuffGroup.Bad))
|
|
{
|
|
session.SendMsg(_languageService.GetLanguage(GameDialogKey.ITEM_SHOUTMESSAGE_VEHICLE_DEBUFF, session.UserLanguage), MsgMessageType.Middle);
|
|
return;
|
|
}
|
|
|
|
VehicleConfiguration vehicle = _provider.GetByVehicleVnum(e.Item.ItemInstance.ItemVNum);
|
|
|
|
if (vehicle == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.IsMorphed)
|
|
{
|
|
session.SendChatMessage(_languageService.GetLanguage(GameDialogKey.ITEM_MESSAGE_CANT_USE, session.UserLanguage), ChatMessageColorType.Yellow);
|
|
return;
|
|
}
|
|
|
|
if (e.Option == 0 && !session.PlayerEntity.IsOnVehicle)
|
|
{
|
|
if (session.PlayerEntity.IsSitting)
|
|
{
|
|
await session.RestAsync();
|
|
}
|
|
|
|
DateTime waitUntil = await _delayManager.RegisterAction(session.PlayerEntity, DelayedActionType.EquipVehicle);
|
|
session.SendDelay((int)(waitUntil - DateTime.UtcNow).TotalMilliseconds, GuriType.Transforming,
|
|
$"u_i 1 {session.PlayerEntity.Id} {(byte)e.Item.ItemInstance.GameItem.Type} {e.Item.Slot} 2");
|
|
return;
|
|
}
|
|
|
|
if (!session.PlayerEntity.IsOnVehicle && e.Option != 0)
|
|
{
|
|
bool canEquipVehicle = await _delayManager.CanPerformAction(session.PlayerEntity, DelayedActionType.EquipVehicle);
|
|
if (!canEquipVehicle)
|
|
{
|
|
return;
|
|
}
|
|
|
|
await _delayManager.CompleteAction(session.PlayerEntity, DelayedActionType.EquipVehicle);
|
|
|
|
session.PlayerEntity.IsOnVehicle = true;
|
|
session.PlayerEntity.VehicleSpeed = (byte)vehicle.DefaultSpeed;
|
|
session.PlayerEntity.MorphUpgrade = 0;
|
|
session.PlayerEntity.MorphUpgrade2 = 0;
|
|
session.PlayerEntity.Morph = session.PlayerEntity.Gender == GenderType.Male ? vehicle.MaleMorphId : vehicle.FemaleMorphId;
|
|
|
|
foreach (IMateEntity x in session.PlayerEntity.MateComponent.TeamMembers())
|
|
{
|
|
if (x.IsSitting && x.IsAlive())
|
|
{
|
|
await session.EmitEventAsync(new MateRestEvent
|
|
{
|
|
MateEntity = x,
|
|
Force = true
|
|
});
|
|
}
|
|
|
|
session.Broadcast(x.GenerateOut());
|
|
}
|
|
|
|
session.RefreshParty(_spPartner);
|
|
|
|
session.BroadcastEffect((int)EffectType.Transform, new RangeBroadcast(session.PlayerEntity.PositionX, session.PlayerEntity.PositionY));
|
|
session.PlayerEntity.RefreshCharacterStats();
|
|
session.SendCondPacket();
|
|
session.BroadcastCMode();
|
|
|
|
session.PlayerEntity.LastSpeedChange = DateTime.UtcNow;
|
|
|
|
await session.EmitEventAsync(new VehicleCheckMapSpeedEvent());
|
|
|
|
if (vehicle.RemoveItem is true)
|
|
{
|
|
await session.RemoveItemFromInventory(item: e.Item);
|
|
}
|
|
}
|
|
else if (session.PlayerEntity.IsOnVehicle)
|
|
{
|
|
await session.EmitEventAsync(new RemoveVehicleEvent(true));
|
|
}
|
|
}
|
|
} |