Esempio n. 1
0
            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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
            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);
            }