public override async ValueTask DeserializeAsync(IClientPlayer sender, IClientPlayer?target, IMessageReader reader, bool initialState) { if (!await ValidateHost(CheatContext.Deserialize, sender)) { return; } if (initialState) { var num = reader.ReadPackedInt32(); for (var i = 0; i < num; i++) { var playerId = reader.ReadByte(); var playerInfo = new InnerPlayerInfo(playerId); playerInfo.Deserialize(reader); if (!_allPlayers.TryAdd(playerInfo.PlayerId, playerInfo)) { throw new ImpostorException("Failed to add player to InnerGameData."); } } } else { throw new NotImplementedException("This shouldn't happen, according to Among Us disassembly."); } }
internal void AddPlayer(InnerPlayerControl control) { var playerId = control.PlayerId; var playerInfo = new InnerPlayerInfo(control.PlayerId); if (_allPlayers.TryAdd(playerId, playerInfo)) { control.PlayerInfo = playerInfo; } }
internal InnerPlayerInfo?AddPlayer(InnerPlayerControl control) { var playerId = control.PlayerId; var playerInfo = new InnerPlayerInfo(control.PlayerId); if (_allPlayers.TryAdd(playerId, playerInfo)) { return(playerInfo); } return(null); }
public override async ValueTask <bool> HandleRpcAsync(ClientPlayer sender, ClientPlayer?target, RpcCalls call, IMessageReader reader) { if (!await ValidateHost(call, sender)) { return(false); } switch (call) { case RpcCalls.SetTasks: { Rpc29SetTasks.Deserialize(reader, out var playerId, out var taskTypeIds); SetTasks(playerId, taskTypeIds); break; } case RpcCalls.UpdateGameData: { while (reader.Position < reader.Length) { using var message = reader.ReadMessage(); var player = GetPlayerById(message.Tag); if (player != null) { player.Deserialize(message); } else { var playerInfo = new InnerPlayerInfo(message.Tag); playerInfo.Deserialize(reader); if (!_allPlayers.TryAdd(playerInfo.PlayerId, playerInfo)) { throw new ImpostorException("Failed to add player to InnerGameData."); } } } break; } case RpcCalls.CustomRpc: return(await HandleCustomRpc(reader, _game)); default: return(await UnregisteredCall(call, sender)); } return(true); }
public override async ValueTask DeserializeAsync(IClientPlayer sender, IClientPlayer?target, IMessageReader reader, bool initialState) { if (!await ValidateHost(CheatContext.Deserialize, sender)) { return; } if (initialState) { var num = reader.ReadPackedInt32(); for (var i = 0; i < num; i++) { var playerId = reader.ReadByte(); var playerInfo = new InnerPlayerInfo(playerId); playerInfo.Deserialize(reader); if (!_allPlayers.TryAdd(playerInfo.PlayerId, playerInfo)) { throw new ImpostorException("Failed to add player to InnerGameData."); } } } else { while (reader.Position < reader.Length) { var inner = reader.ReadMessage(); var playerInfo = this.GetPlayerById(inner.Tag); if (playerInfo != null) { playerInfo.Deserialize(inner); } else { playerInfo = new InnerPlayerInfo(inner.Tag); playerInfo.Deserialize(inner); if (!_allPlayers.TryAdd(playerInfo.PlayerId, playerInfo)) { throw new ImpostorException("Failed to add player to InnerGameData."); } } } } }
public override ValueTask HandleRpc(ClientPlayer sender, ClientPlayer?target, RpcCalls call, IMessageReader reader) { 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) { using var message = reader.ReadMessage(); var player = GetPlayerById(message.Tag); if (player != null) { player.Deserialize(message); } else { var playerInfo = new InnerPlayerInfo(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; } } return(default);