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);
            }
        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();
        }
Exemple #3
0
        private static HatBehaviour CreateHat(string name)
        {
            System.Console.WriteLine($"Creating Hat {name}");
            var sprite = TownOfUs.CreateSprite($"TownOfUs.Resources.Hats.{name}.png", true);
            var newHat = ScriptableObject.CreateInstance <HatBehaviour>();

            newHat.MainImage = sprite;
            newHat.ProductId = name;
            newHat.Order     = -1;
            newHat.InFront   = true;
            newHat.NoBounce  = false;

            return(newHat);
        }
Exemple #4
0
        private static HatBehaviour CreateHat(HatData hat, int id)
        {
            System.Console.WriteLine($"Creating Hat {hat.name}");
            var sprite = TownOfUs.CreateSprite($"TownOfUs.Resources.Hats.hat_{hat.name}.png", true);
            var newHat = ScriptableObject.CreateInstance <HatBehaviour>();

            newHat.MainImage  = sprite;
            newHat.ProductId  = hat.name;
            newHat.Order      = 99 + id;
            newHat.InFront    = true;
            newHat.NoBounce   = !hat.bounce;
            newHat.ChipOffset = hat.offset;

            return(newHat);
        }
Exemple #5
0
        private static HatBehaviour GenerateHatBehaviour(byte[] mainImg)
        {
            //TODO: Move to Graphics Utils class
            var tex2D = new Texture2D(1, 1, TextureFormat.ARGB32, false);

            TownOfUs.LoadImage(tex2D, mainImg, false);
            var sprite = Sprite.Create(tex2D, new Rect(0.0f, 0.0f, tex2D.width, tex2D.height), new Vector2(0.5f, 0.5f), 100);

            var hat = ScriptableObject.CreateInstance <HatBehaviour>();

            hat.MainImage  = sprite;
            hat.ChipOffset = new Vector2(-0.1f, 0.35f);

            hat.InFront  = true;
            hat.NoBounce = true;

            return(hat);
        }
            public static void Postfix(AmongUsClient __instance)
            {
                if (AmongUsClient.Instance.AmHost)
                {
                    return;
                }

                // If I am client, send handshake
                PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"AmongUsClient.OnGameJoined.Postfix - Am client, sending handshake");

                var messageWriter = MessageWriter.Get(SendOption.Reliable);

                messageWriter.StartMessage(6);
                messageWriter.Write(__instance.GameId);
                messageWriter.WritePacked(__instance.HostId);
                messageWriter.StartMessage(TOU_ROOT_HANDSHAKE_TAG);
                messageWriter.Write(AmongUsClient.Instance.ClientId);
                messageWriter.Write(TownOfUs.GetVersion());
                messageWriter.EndMessage();
                messageWriter.EndMessage();
                __instance.SendOrDisconnect(messageWriter);
                messageWriter.Recycle();
            }