using Impostor.Api.Games;
using Impostor.Api.Net.Inner.Objects;
+using Impostor.Api.Innersloth;
namespace Impostor.Api.Net.Messages.Rpcs
{
public static class Rpc12MurderPlayer
{
- public static void Serialize(IMessageWriter writer, IInnerPlayerControl target)
+ public static void Serialize(IMessageWriter writer, IInnerPlayerControl target, MurderResultFlags result)
{
writer.Write(target);
+ writer.Write((int)result);
}
- public static void Deserialize(IMessageReader reader, IGame game, out IInnerPlayerControl? target)
+ public static void Deserialize(IMessageReader reader, IGame game, out IInnerPlayerControl? target, out MurderResultFlags result)
{
target = reader.ReadNetObject<IInnerPlayerControl>(game);
+ result = (MurderResultFlags)reader.ReadInt32();
}
}
}
((InnerPlayerControl)target).Die(DeathReason.Kill);
using var writer = Game.StartRpc(NetId, RpcCalls.MurderPlayer);
- Rpc12MurderPlayer.Serialize(writer, target);
+ Rpc12MurderPlayer.Serialize(writer, target, MurderResultFlags.Succeeded);
await Game.FinishRpcAsync(writer);
await _eventManager.CallAsync(new PlayerMurderEvent(Game, Game.GetClientPlayer(OwnerId)!, this, target));
{
private static readonly byte ColorsCount = (byte)Enum.GetValues<ColorType>().Length;
+ private readonly Game _game;
private readonly ILogger<InnerPlayerControl> _logger;
private readonly IEventManager _eventManager;
private readonly IDateTimeProvider _dateTimeProvider;
public InnerPlayerControl(ICustomMessageManager<ICustomRpc> customMessageManager, Game game, ILogger<InnerPlayerControl> logger, IServiceProvider serviceProvider, IEventManager eventManager, IDateTimeProvider dateTimeProvider) : base(customMessageManager, game)
{
+ _game = game;
_logger = logger;
_eventManager = eventManager;
_dateTimeProvider = dateTimeProvider;
return false;
}
- Rpc12MurderPlayer.Deserialize(reader, Game, out var murdered);
- return await HandleMurderPlayer(sender, murdered);
+ Rpc12MurderPlayer.Deserialize(reader, Game, out var murdered, out var result);
+ return await HandleMurderPlayer(sender, murdered, result);
}
case RpcCalls.SendChat:
}
}
- PlayerInfo.LastMurder = _dateTimeProvider.UtcNow - TimeSpan.FromMilliseconds(sender.Client.Connection.AveragePing);
-
if (target == null || target.PlayerInfo.IsImpostor)
{
if (await sender.Client.ReportCheatAsync(RpcCalls.CheckMurder, "Client tried to murder invalid target"))
}
}
+ PlayerInfo.LastMurder = _dateTimeProvider.UtcNow - TimeSpan.FromMilliseconds(sender.Client.Connection.AveragePing);
IsMurdering = target;
- return true;
+ // Check if host authority mode is on
+ if (_game.IsHostModded()) {
+ // Pass the RPC on unharmed, the client will handle it
+ return true;
+ }
+
+ // TODO check if protected by GA
+
+ if (target != null)
+ {
+ MurderPlayerAsync(target);
+ }
+
+ return false;
}
- private async ValueTask<bool> HandleMurderPlayer(ClientPlayer sender, IInnerPlayerControl? target)
+ private async ValueTask<bool> HandleMurderPlayer(ClientPlayer sender, IInnerPlayerControl? target, MurderResultFlags result)
{
if (target == null || target.PlayerInfo.IsImpostor)
{