public static void Postfix([HarmonyArgument(0)] NewConnectionEventArgs evt) { var writer = MessageWriter.Get(SendOption.Reliable); ModdedHandshakeS2C.Serialize(writer, "Among Us", Application.version, 0); evt.Connection.Send(writer); writer.Recycle(); }
public async ValueTask OnClientConnectedEventAsync(IClientConnectedEvent e) { var clientInfo = e.Connection.GetReactor(); if (clientInfo == null) { return; } if (clientInfo.Version < ReactorProtocolVersion.Initial || clientInfo.Version > ReactorProtocolVersion.Latest) { await e.Client.DisconnectAsync(DisconnectReason.Custom, "Unsupported Reactor.Networking protocol version"); return; } using var writer = _messageWriterProvider.Get(MessageType.Reliable); ModdedHandshakeS2C.Serialize(writer, "Impostor", _serverEnvironment.Version, 0); await e.Connection.SendAsync(writer); }
public async ValueTask RegisterConnectionAsync(IHazelConnection connection, string name, int clientVersion, ISet <Mod>?mods) { if (!SupportedVersions.Contains(clientVersion)) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.IncorrectVersion); await connection.SendAsync(packet); return; } if (name.Length > 10) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameLength); await connection.SendAsync(packet); return; } if (string.IsNullOrWhiteSpace(name) || !name.All(TextBox.IsCharAllowed)) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameIllegalCharacters); await connection.SendAsync(packet); return; } var client = _clientFactory.Create(connection, name, clientVersion, mods ?? new HashSet <Mod>(0)); var id = NextId(); client.Id = id; _logger.LogTrace("Client connected."); _clients.TryAdd(id, client); using var writer = MessageWriter.Get(MessageType.Reliable); ModdedHandshakeS2C.Serialize(writer, ServerBrand); await connection.SendAsync(writer); }
public static bool Prefix(InnerNetClient __instance, [HarmonyArgument(0)] MessageReader reader) { if (reader.Tag == byte.MaxValue) { var flag = (ReactorMessageFlags)reader.ReadByte(); switch (flag) { case ReactorMessageFlags.Handshake: { ModdedHandshakeS2C.Deserialize(reader, out var serverName, out var serverVersion, out var pluginCount); Logger <ReactorPlugin> .Info($"Connected to a modded server ({serverName} {serverVersion}, {pluginCount} plugins), sending mod declarations"); var mods = ModList.Current; var writer = MessageWriter.Get(SendOption.Reliable); var expected = 0; var got = 0; void Send() { expected++; __instance.connection.Send(writer, () => { got++; if (got >= expected) { Logger <ReactorPlugin> .Debug("Received all acks"); __instance.connection.State = ConnectionState.Connected; } }); writer.Recycle(); } foreach (var mod in mods) { ModDeclaration.Serialize(writer, mod); if (writer.Length >= 500) { writer.CancelMessage(); Send(); writer = MessageWriter.Get(SendOption.Reliable); ModDeclaration.Serialize(writer, mod); } writer.EndMessage(); } Send(); break; } case ReactorMessageFlags.PluginDeclaration: { // TODO break; } default: throw new ArgumentOutOfRangeException(); } return(false); } return(true); }