Пример #1
0
            private static bool HandleMessage(InnerNetClient __instance, [HarmonyArgument(0)] MessageReader reader)
            {
                if (reader.Tag != 8 || __instance.GameId != reader.ReadInt32() || __instance.GameState == InnerNetClient.GameStates.Ended)
                {
                    return(true);
                }

                __instance.GameState = InnerNetClient.GameStates.Ended;
                lock (__instance.allClients)
                {
                    __instance.allClients.Clear();
                }

                var  reason = (GameOverReason)reader.ReadSByte();
                bool showAd = reader.ReadBoolean();

                if (reason.IsCustom())
                {
                    CustomGameOverReasonManager.EndReason = CustomGameOverReason.Deserialize(reader);
                }

                lock (__instance.Dispatcher)
                {
                    __instance.Dispatcher.Add((Action)(() => __instance.OnGameEnd(reason, showAd)));
                    return(false);
                }
            }
Пример #2
0
            public static bool Prefix(InnerNetClient __instance,
                                      [HarmonyArgument(0)] MessageReader reader)
            {
                // If i am host, respond to handshake
                if (__instance.AmHost && reader.BytesRemaining > 3)
                {
                    var handshakeReader = MessageReader.Get(reader).ReadMessageAsNewBuffer();
                    if (handshakeReader.Tag == TOU_ROOT_HANDSHAKE_TAG)
                    {
                        PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"InnerNetClient.HandleMessage.Prefix - Host recieved TOU handshake");

                        var clientId   = handshakeReader.ReadInt32();
                        var touVersion = handshakeReader.ReadString();

                        // List<int> HandshakedClients - exists to disconnect legacy clients that don't send handshake
                        PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"InnerNetClient.HandleMessage.Prefix - Adding {clientId} with TOU version {touVersion} to List<int>HandshakedClients");

                        HandshakedClients.Add(clientId);

                        if (!TownOfUs.GetVersion().Equals(touVersion))
                        {
                            PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"InnerNetClient.HandleMessage.Prefix - ClientId {clientId} has mismatched TOU version {touVersion}. (Ours is {TownOfUs.GetVersion()})");

                            __instance.SendCustomDisconnect(clientId);
                        }

                        return(false);
                    }
                }

                return(true);
            }
Пример #3
0
        private static void SendCustomDisconnect(this InnerNetClient innerNetClient, int clientId)
        {
            var messageWriter = MessageWriter.Get(SendOption.Reliable);

            messageWriter.StartMessage(11);
            messageWriter.Write(innerNetClient.GameId);
            messageWriter.WritePacked(clientId);
            messageWriter.Write(false);
            messageWriter.Write(8);
            messageWriter.Write($"The host has a different version of Town Of Us ({TownOfUs.GetVersion()})");
            messageWriter.EndMessage();
            innerNetClient.SendOrDisconnect(messageWriter);
            messageWriter.Recycle();
        }
Пример #4
0
            public static bool Prefix(InnerNetClient __instance, [HarmonyArgument(0)] MessageReader reader, [HarmonyArgument(1)] SendOption sendOption)
            {
                if (reader.Tag == byte.MaxValue)
                {
                    var serverBrand = reader.ReadString();

                    __instance.connection.State = ConnectionState.Connected;

                    PluginSingleton <ReactorPlugin> .Instance.Log.LogDebug($"Connected to modded server ({serverBrand})");

                    return(false);
                }

                return(true);
            }
Пример #5
0
            public static void Postfix(InnerNetClient __instance, MessageReader ALMCIJKELCP, SendOption GLLMNHCBIOC)
            {
                MessageReader reader = ALMCIJKELCP;

                if (reader.Tag != 2)
                {
                    return;
                }


                int playersLeft = PlayerControl.AllPlayerControls.ToArray().Count(pc =>
                                                                                  !pc.Data.IsDead && !pc.Data.Disconnected);

                udpateBools(playersLeft);
            }
Пример #6
0
            private static void DisconnectPlayer(InnerNetClient _this, int clientId)
            {
                if (!_this.AmHost)
                {
                    return;
                }
                MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable);

                messageWriter.StartMessage(4);
                messageWriter.Write(_this.GameId);
                messageWriter.WritePacked(clientId);
                messageWriter.Write((byte)DisconnectReasons.GameFull);
                messageWriter.EndMessage();
                _this.SendOrDisconnect(messageWriter);
                messageWriter.Recycle();
            }
            public static bool Prefix(string EMFDKKLLHCL, ushort JOBBGKDMALK, ref InnerNetClient __instance)
            {
                var customServer = customServers.FirstOrDefault(x => x.ToString() == EMFDKKLLHCL);

                if (customServer != default)
                {
                    CustomServersPlugin.Logger.LogDebug($"Setting IP and port for custom server \"{customServer.name}\"!");
                    __instance.HECFEPIMCOE = customServer.ip;
                    __instance.DNGDMFHEJBA = customServer.port;
                }
                else
                {
                    __instance.HECFEPIMCOE = EMFDKKLLHCL;
                    __instance.DNGDMFHEJBA = JOBBGKDMALK;
                }

                return(false);
            }
Пример #8
0
        private static IEnumerator WaitForHandshake(InnerNetClient innerNetClient, int clientId)
        {
            PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"WaitForHandshake(innerNetClient, clientId = {clientId})");

            yield return(new WaitForSeconds(5f));

            PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"WaitForHandshake() - Waited 5 seconds");

            if (!HandshakedClients.Contains(clientId))
            {
                PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"WaitForHandshake() - HandshakedClients did not contain clientId {clientId}");

                if (innerNetClient.allClients.ToArray().Any(x => x.Id == clientId))
                {
                    innerNetClient.SendCustomDisconnect(clientId);
                }
            }
            else
            {
                PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"WaitForHandshake() - HandshakedClients contained clientId {clientId}");
            }
        }
Пример #9
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);
            }
Пример #10
0
 public static void Postfix(out bool __result, InnerNetClient __instance)
 {
     __result = __instance.AmHost;
 }