--- /dev/null
+using Impostor.Api.Innersloth;
+
+namespace Impostor.Api.Events.Player
+{
+ public interface IPlayerEnterVentEvent : IPlayerEvent
+ {
+ /// <summary>
+ /// Gets get the id of the used vent.
+ /// </summary>
+ public Vent Vent { get; }
+ }
+}
--- /dev/null
+using Impostor.Api.Innersloth;
+
+namespace Impostor.Api.Events.Player
+{
+ public interface IPlayerExitVentEvent : IPlayerEvent
+ {
+ /// <summary>
+ /// Gets get the id of the used vent.
+ /// </summary>
+ public Vent Vent { get; }
+ }
+}
/// Gets get the id of the used vent.
/// </summary>
public Vent Vent { get; }
-
- /// <summary>
- /// Gets a value indicating whether the vent was entered or exited.
- /// </summary>
- public bool VentEnter { get; }
}
}
_logger.LogInformation("Player {player} > started meeting, reason: {reason}", e.PlayerControl.PlayerInfo.PlayerName, e.Body == null ? "Emergency call button" : "Found the body of the player " + e.Body.PlayerInfo.PlayerName);
}
+ [EventListener]
+ public void OnPlayerEnterVentEvent(IPlayerEnterVentEvent e)
+ {
+ _logger.LogInformation("Player {player} entered the vent in {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name);
+ }
+
+ [EventListener]
+ public void OnPlayerExitVentEvent(IPlayerExitVentEvent e)
+ {
+ _logger.LogInformation("Player {player} exit the vent in {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name);
+ }
+
[EventListener]
public void OnPlayerVentEvent(IPlayerVentEvent e)
{
- _logger.LogInformation("Player {player} " + (e.VentEnter ? "entered" : "exit") + " the vent in {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name);
+ _logger.LogInformation("Player {player} vented to {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name);
}
}
}
--- /dev/null
+using Impostor.Api.Events.Player;
+using Impostor.Api.Games;
+using Impostor.Api.Innersloth;
+using Impostor.Api.Net;
+using Impostor.Api.Net.Inner.Objects;
+
+namespace Impostor.Server.Events.Player
+{
+ public class PlayerEnterVentEvent : IPlayerEnterVentEvent
+ {
+ public PlayerEnterVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, Vent vent)
+ {
+ Game = game;
+ ClientPlayer = sender;
+ PlayerControl = innerPlayerPhysics;
+ Vent = vent;
+ }
+
+ public IGame Game { get; }
+
+ public IClientPlayer ClientPlayer { get; }
+
+ public IInnerPlayerControl PlayerControl { get; }
+
+ public Vent Vent { get; }
+ }
+}
--- /dev/null
+using Impostor.Api.Events.Player;
+using Impostor.Api.Games;
+using Impostor.Api.Innersloth;
+using Impostor.Api.Net;
+using Impostor.Api.Net.Inner.Objects;
+
+namespace Impostor.Server.Events.Player
+{
+ public class PlayerExitVentEvent : IPlayerExitVentEvent
+ {
+ public PlayerExitVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, Vent vent)
+ {
+ Game = game;
+ ClientPlayer = sender;
+ PlayerControl = innerPlayerPhysics;
+ Vent = vent;
+ }
+
+ public IGame Game { get; }
+
+ public IClientPlayer ClientPlayer { get; }
+
+ public IInnerPlayerControl PlayerControl { get; }
+
+ public Vent Vent { get; }
+ }
+}
{
public class PlayerVentEvent : IPlayerVentEvent
{
- public PlayerVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, Vent vent, bool ventEnter)
+ public PlayerVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, Vent vent)
{
Game = game;
ClientPlayer = sender;
PlayerControl = innerPlayerPhysics;
Vent = vent;
- VentEnter = ventEnter;
}
public IGame Game { get; }
public IInnerPlayerControl PlayerControl { get; }
public Vent Vent { get; }
-
- public bool VentEnter { get; }
}
}
{
internal partial class InnerCustomNetworkTransform : InnerNetObject
{
+ private static readonly Vector2 ColliderOffset = new Vector2(0f, -0.4f);
+
private readonly ILogger<InnerCustomNetworkTransform> _logger;
private readonly InnerPlayerControl _playerControl;
private readonly IEventManager _eventManager;
return false;
}
- // TODO validate vent location
+ var vents = Game.GameNet.ShipStatus!.Data.Vents.Values;
+
+ var vent = vents.SingleOrDefault(x => Approximately(x.Position, position + ColliderOffset));
+
+ if (vent == null)
+ {
+ if (await sender.Client.ReportCheatAsync(call, "Failed vent position check"))
+ {
+ return false;
+ }
+ }
+ else
+ {
+ await _eventManager.CallAsync(new PlayerVentEvent(Game, sender, _playerControl, vent));
+ }
+
await SnapToAsync(sender, position, minSid);
return true;
}
throw new ArgumentOutOfRangeException(nameof(call), call, null);
}
- await _eventManager.CallAsync(new PlayerVentEvent(Game, sender, _playerControl, Game.GameNet.ShipStatus!.Data.Vents[ventId], call == RpcCalls.EnterVent));
+ var vent = Game.GameNet.ShipStatus!.Data.Vents[ventId];
+
+ switch (call)
+ {
+ case RpcCalls.EnterVent:
+ await _eventManager.CallAsync(new PlayerEnterVentEvent(Game, sender, _playerControl, vent));
+ break;
+ case RpcCalls.ExitVent:
+ await _eventManager.CallAsync(new PlayerExitVentEvent(Game, sender, _playerControl, vent));
+ break;
+ }
+
break;
case RpcCalls.ClimbLadder: