public SpawnFlags SpawnFlags { get; internal set; }
- public abstract void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
- IMessageReader reader);
+ public abstract void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader);
public abstract bool Serialize(IMessageWriter writer, bool initialState);
}
else
{
- _logger.LogWarning("InnerCustomNetworkTransform: Unknown rpc call {0}", call);
+ _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerCustomNetworkTransform), call);
}
}
-using Impostor.Api.Net;
+using System;
+using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.Logging;
namespace Impostor.Api.Innersloth.Net.Objects.Components
{
public class InnerPlayerPhysics : InnerNetObject
{
- public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
- IMessageReader reader)
+ private readonly ILogger<InnerPlayerPhysics> _logger;
+
+ public InnerPlayerPhysics(ILogger<InnerPlayerPhysics> logger)
{
- throw new System.NotImplementedException();
+ _logger = logger;
+ }
+
+ public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
+ {
+ if (call != RpcCalls.EnterVent && call != RpcCalls.ExitVent)
+ {
+ _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerPlayerPhysics), call);
+ return;
+ }
+
+ if (!sender.IsOwner(this))
+ {
+ throw new ImpostorCheatException($"Client sent {call} to an unowned {nameof(InnerPlayerControl)}.");
+ }
+
+ if (target != null)
+ {
+ throw new ImpostorCheatException($"Client sent {call} to a specific player instead of broadcast.");
+ }
+
+ if (!sender.Character.PlayerInfo.IsImpostor)
+ {
+ throw new ImpostorCheatException($"Client sent {call} as crewmate.");
+ }
+
+ var ventId = reader.ReadPackedUInt32();
+ var ventEnter = call == RpcCalls.EnterVent;
+
+ // TODO: Do stuff.
}
public override bool Serialize(IMessageWriter writer, bool initialState)
{
- throw new System.NotImplementedException();
+ throw new NotImplementedException();
}
public override void Deserialize(IClientPlayer sender, IMessageReader reader, bool initialState)
{
- throw new System.NotImplementedException();
+ throw new NotImplementedException();
}
}
}
\ No newline at end of file
using System.Collections.Generic;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.Logging;
namespace Impostor.Api.Innersloth.Net.Objects.Components
{
public class InnerVoteBanSystem : InnerNetObject
{
+ private readonly ILogger<InnerVoteBanSystem> _logger;
private readonly Dictionary<int, int[]> _votes;
- public InnerVoteBanSystem()
+ public InnerVoteBanSystem(ILogger<InnerVoteBanSystem> logger)
{
+ _logger = logger;
_votes = new Dictionary<int, int[]>();
}
- public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
- IMessageReader reader)
+ public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
- throw new NotImplementedException();
+ if (call != RpcCalls.AddVote)
+ {
+ _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerVoteBanSystem), call);
+ return;
+ }
+
+ var clientId = reader.ReadInt32();
+ if (clientId != sender.Client.Id)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.AddVote)} as other client.");
+ }
+
+ if (target != null)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CastVote)} to wrong destinition, must be broadcast.");
+ }
+
+ var targetClientId = reader.ReadInt32();
+
+ // TODO: Use.
}
public override bool Serialize(IMessageWriter writer, bool initialState)
PlayerId = playerId;
}
+ public InnerPlayerControl Controller { get; internal set; }
+
public byte PlayerId { get; }
public string PlayerName { get; internal set; }
public DeathReason LastDeathReason { get; internal set; }
- public List<TaskInfo> Tasks { get; private set; }
+ public List<TaskInfo> Tasks { get; internal set; }
public void Serialize(IMessageWriter writer)
{
{
public class TaskInfo
{
- public uint Id { get; private set; }
+ public uint Id { get; internal set; }
- public bool Complete { get; private set; }
+ public bool Complete { get; internal set; }
public void Serialize(IMessageWriter writer)
{
using Impostor.Api.Innersloth.Net.Objects.Components;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
namespace Impostor.Api.Innersloth.Net.Objects
{
public partial class InnerGameData : InnerNetObject
{
+ private readonly ILogger<InnerGameData> _logger;
private readonly IGame _game;
private readonly ConcurrentDictionary<byte, PlayerInfo> _allPlayers;
- public InnerGameData(IGame game)
+ public InnerGameData(ILogger<InnerGameData> logger, IGame game, IServiceProvider serviceProvider)
{
+ _logger = logger;
_game = game;
_allPlayers = new ConcurrentDictionary<byte, PlayerInfo>();
Components.Add(this);
- Components.Add(new InnerVoteBanSystem());
+ Components.Add(ActivatorUtilities.CreateInstance<InnerVoteBanSystem>(serviceProvider));
}
public int PlayerCount => _allPlayers.Count;
public IReadOnlyDictionary<byte, PlayerInfo> Players => _allPlayers;
- internal void AddPlayer(InnerPlayerControl control)
- {
- var playerId = control.PlayerId;
- var playerInfo = new PlayerInfo(control.PlayerId);
-
- if (_allPlayers.TryAdd(playerId, playerInfo))
- {
- control.PlayerInfo = playerInfo;
- }
- }
-
public PlayerInfo? GetPlayerById(byte id)
{
if (id == byte.MaxValue)
public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
- throw new NotImplementedException();
+ switch (call)
+ {
+ case RpcCalls.SetTasks:
+ {
+ if (!sender.IsHost)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.SetTasks)} but was not a host.");
+ }
+
+ if (target != null)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.SetTasks)} to a specific player instead of broadcast.");
+ }
+
+ var playerId = reader.ReadByte();
+ var taskTypeIds = reader.ReadBytesAndSize();
+
+ SetTasks(playerId, taskTypeIds);
+ break;
+ }
+
+ case RpcCalls.UpdateGameData:
+ {
+ if (!sender.IsHost)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.SetTasks)} but was not a host.");
+ }
+
+ if (target != null)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.SetTasks)} to a specific player instead of broadcast.");
+ }
+
+ while (reader.Position < reader.Length)
+ {
+ var message = reader.ReadMessage();
+ var player = GetPlayerById(message.Tag);
+ if (player != null)
+ {
+ player.Deserialize(message);
+ }
+ else
+ {
+ var playerInfo = new PlayerInfo(message.Tag);
+
+ playerInfo.Deserialize(reader);
+
+ if (!_allPlayers.TryAdd(playerInfo.PlayerId, playerInfo))
+ {
+ throw new ImpostorException("Failed to add player to InnerGameData.");
+ }
+ }
+ }
+
+ break;
+ }
+
+ default:
+ {
+ _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerGameData), call);
+ break;
+ }
+ }
}
public override bool Serialize(IMessageWriter writer, bool initialState)
for (var i = 0; i < num; i++)
{
- var playerInfo = new PlayerInfo(reader.ReadByte());
+ var playerId = reader.ReadByte();
+ var playerInfo = new PlayerInfo(playerId);
playerInfo.Deserialize(reader);
}
else
{
- throw new NotImplementedException("This shouldn't happen, according to Among Us disassembly..");
-
- // var num = reader.ReadByte();
- //
- // for (var i = 0; i < num; i++)
- // {
- // var id = reader.ReadByte();
- // var player = GetPlayerById(id);
- // if (player != null)
- // {
- // player.Deserialize(reader);
- // }
- // else
- // {
- // var playerInfo = new PlayerInfo(id);
- // playerInfo.Deserialize(reader);
- // _allPlayers.Add(playerInfo);
- // }
- // }
+ throw new NotImplementedException("This shouldn't happen, according to Among Us disassembly.");
+ }
+ }
+
+ internal void AddPlayer(InnerPlayerControl control)
+ {
+ var playerId = control.PlayerId;
+ var playerInfo = new PlayerInfo(control.PlayerId);
+
+ if (_allPlayers.TryAdd(playerId, playerInfo))
+ {
+ control.PlayerInfo = playerInfo;
+ }
+ }
+
+ private void SetTasks(byte playerId, ReadOnlyMemory<byte> taskTypeIds)
+ {
+ var player = GetPlayerById(playerId);
+ if (player == null)
+ {
+ _logger.LogTrace("Could not set tasks for playerId {0}.", playerId);
+ return;
+ }
+
+ if (player.Disconnected)
+ {
+ return;
+ }
+
+ player.Tasks = new List<TaskInfo>(taskTypeIds.Length);
+
+ for (var i = 0; i < taskTypeIds.Length; i++)
+ {
+ player.Tasks.Add(new TaskInfo());
+ player.Tasks[i].Id = (uint)i;
}
}
}
Components.Add(this);
}
- public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
- IMessageReader reader)
+ public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
throw new System.NotImplementedException();
}
using Impostor.Api.Innersloth.Data;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.Logging;
namespace Impostor.Api.Innersloth.Net.Objects
{
public partial class InnerMeetingHud : InnerNetObject
{
+ private readonly ILogger<InnerMeetingHud> _logger;
private readonly IGame _game;
private readonly IGameNet _gameNet;
private PlayerVoteArea[] _playerStates;
- public InnerMeetingHud(IGame game)
+ public InnerMeetingHud(ILogger<InnerMeetingHud> logger, IGame game)
{
+ _logger = logger;
_game = game;
_gameNet = game.GameNet;
_playerStates = null;
.ToArray();
}
- public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
- IMessageReader reader)
+ public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
- throw new NotImplementedException();
+ switch (call)
+ {
+ case RpcCalls.Close:
+ {
+ if (!sender.IsHost)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.Close)} but was not a host.");
+ }
+
+ if (target != null)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.Close)} to a specific player instead of broadcast.");
+ }
+
+ break;
+ }
+
+ case RpcCalls.VotingComplete:
+ {
+ if (!sender.IsHost)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.VotingComplete)} but was not a host.");
+ }
+
+ if (target != null)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.VotingComplete)} to a specific player instead of broadcast.");
+ }
+
+ var states = reader.ReadBytesAndSize();
+ var playerId = reader.ReadByte();
+ var tie = reader.ReadBoolean();
+ break;
+ }
+
+ case RpcCalls.CastVote:
+ {
+ var srcPlayerId = reader.ReadByte();
+ if (srcPlayerId != sender.Character.PlayerId)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CastVote)} to an unowned {nameof(InnerPlayerControl)}.");
+ }
+
+ // Host broadcasts vote to others.
+ if (sender.IsHost && target != null)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CastVote)} to a specific player instead of broadcast.");
+ }
+
+ // Player sends vote to host.
+ if (target == null || !target.IsHost)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CastVote)} to wrong destinition, must be host.");
+ }
+
+ var targetPlayerId = reader.ReadByte();
+ break;
+ }
+
+ default:
+ {
+ _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerMeetingHud), call);
+ break;
+ }
+ }
}
public override bool Serialize(IMessageWriter writer, bool initialState)
throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CompleteTask)} to an unowned {nameof(InnerPlayerControl)}.");
}
+ if (target != null)
+ {
+ throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CompleteTask)} to a specific player instead of broadcast.");
+ }
+
var index = reader.ReadPackedUInt32();
break;
}
if (!sender.Character.PlayerInfo.IsImpostor)
{
// TODO: Uncomment
- // throw new ImpostorHackException($"Client sent {nameof(RpcCalls.MurderPlayer)} as crewmate.");
+ // throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.MurderPlayer)} as crewmate.");
}
var player = reader.ReadNetObject<InnerPlayerControl>(_game);
var player = _game.GameNet.GameData.GetPlayerById(playerId);
// Meeting started by "player", can also be null.
- Console.WriteLine("ads");
break;
}
}
default:
- _logger.LogWarning("InnerPlayerControl: Unknown rpc call {0}", call);
+ {
+ _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerPlayerControl), call);
break;
+ }
}
}
using Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.Logging;
namespace Impostor.Api.Innersloth.Net.Objects
{
public class InnerShipStatus : InnerNetObject
{
+ private readonly ILogger<InnerShipStatus> _logger;
private readonly IGame _game;
private readonly Dictionary<SystemTypes, ISystemType> _systems;
- public InnerShipStatus(IGame game)
+ public InnerShipStatus(ILogger<InnerShipStatus> logger, IGame game)
{
+ _logger = logger;
_game = game;
_systems = new Dictionary<SystemTypes, ISystemType>
Components.Add(this);
}
- public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
- IMessageReader reader)
+ public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
{
switch (call)
{
break;
}
+
+ default:
+ {
+ _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerShipStatus), call);
+ break;
+ }
}
}
</Rules>
<Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.CSharp.DocumentationRules">
<Rule Id="SA1600" Action="None" />
+ <Rule Id="SA1601" Action="None" />
+ <Rule Id="SA1602" Action="None" />
<Rule Id="SA1633" Action="None" />
</Rules>
<Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.CSharp.ReadabilityRules">
using System;
using System.Collections.Generic;
-using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
-using Impostor.Api;
using Impostor.Api.Innersloth.Data;
using Impostor.Api.Innersloth.Net;
using Impostor.Api.Innersloth.Net.Objects;
using Impostor.Api.Innersloth.Net.Objects.Components;
using Impostor.Api.Net.Messages;
-using Impostor.Api.Net.Messages.C2S;
using Impostor.Api.Net.Messages.S2C;
using Impostor.Hazel;
using Microsoft.Extensions.DependencyInjection;
private int _gamedataInitialized;
private bool _gamedataFakeReceived;
- internal void OnSpawn(InnerNetObject netObj)
+ private void OnSpawn(InnerNetObject netObj)
{
switch (netObj)
{
}
// Hook up InnerPlayerControl <-> InnerPlayerControl.PlayerInfo.
- control.PlayerInfo = GameNet.GameData.GetPlayerById(control.PlayerId);
+ control.PlayerInfo = GameNet.GameData.GetPlayerById(control.PlayerId)!;
if (control.PlayerInfo == null)
{
GameNet.GameData.AddPlayer(control);
}
+ if (control.PlayerInfo != null)
+ {
+ control.PlayerInfo!.Controller = control;
+ }
+
break;
}
}
}
- internal void OnDestroy(InnerNetObject netObj)
+ private void OnDestroy(InnerNetObject netObj)
{
switch (netObj)
{
var netId = reader.ReadPackedUInt32();
if (_allObjectsFast.TryGetValue(netId, out var obj))
{
- // TODO: Remove try catch.
- try
- {
- obj.HandleRpc(sender, target, (RpcCalls) reader.ReadByte(), reader);
- }
- catch (NotImplementedException)
- {
- }
+ obj.HandleRpc(sender, target, (RpcCalls) reader.ReadByte(), reader);
}
else
{