public void CopySubMessage()
        {
            const byte Test1 = 12;
            const byte Test2 = 146;

            var msg = new MessageWriter(2048);

            msg.StartMessage(1);

            msg.StartMessage(2);
            msg.Write(Test1);
            msg.Write(Test2);
            msg.EndMessage();

            msg.EndMessage();

            var readerPool   = CreateReaderPool();
            var handleReader = readerPool.Get();

            handleReader.Update(msg.Buffer);
            var handleMessage = handleReader.ReadMessage();

            Assert.Equal(1, handleMessage.Tag);

            using var parentReader = handleMessage.Copy();

            Assert.Equal(1, parentReader.Tag);

            var reader = parentReader.ReadMessage();

            Assert.Equal(2, reader.Tag);
            Assert.Equal(Test1, reader.ReadByte());
            Assert.Equal(Test2, reader.ReadByte());
        }
示例#2
0
        public void ReadMessageLength()
        {
            var msg = new MessageWriter(2048);

            msg.StartMessage(1);
            msg.Write(65534);
            msg.StartMessage(2);
            msg.Write("HO");
            msg.EndMessage();
            msg.StartMessage(2);
            msg.Write("NO");
            msg.EndMessage();
            msg.EndMessage();

            Assert.AreEqual(msg.Length, msg.Position);

            MessageReader reader = MessageReader.Get(msg.Buffer, 0);

            Assert.AreEqual(1, reader.Tag);
            Assert.AreEqual(65534, reader.ReadInt32()); // Content

            var sub = reader.ReadMessage();

            Assert.AreEqual(3, sub.Length);
            Assert.AreEqual(2, sub.Tag);
            Assert.AreEqual("HO", sub.ReadString());

            sub = reader.ReadMessage();
            Assert.AreEqual(3, sub.Length);
            Assert.AreEqual(2, sub.Tag);
            Assert.AreEqual("NO", sub.ReadString());
        }
示例#3
0
        public static void Serialize(MessageWriter writer, IEnumerable <Game> games)
        {
            writer.StartMessage(MessageFlags.GetGameListV2);

            // Count
            writer.StartMessage(1);
            writer.Write(123); // The Skeld
            writer.Write(456); // Mira HQ
            writer.Write(789); // Polus
            writer.EndMessage();

            // Listing
            writer.StartMessage(0);
            foreach (var game in games)
            {
                writer.StartMessage(0);
                writer.Write(game.PublicIp.Address.GetAddressBytes());
                writer.Write((ushort)game.PublicIp.Port);
                writer.Write(game.Code);
                writer.Write(game.Host.Client.Name);
                writer.Write((byte)game.PlayerCount);
                writer.WritePacked(1); // TODO: What does Age do?
                writer.Write((byte)game.Options.MapId);
                writer.Write((byte)game.Options.NumImpostors);
                writer.Write((byte)game.Options.MaxPlayers);
                writer.EndMessage();
            }
            writer.EndMessage();

            writer.EndMessage();
        }
示例#4
0
        public static void Postfix(Il2CppReferenceArray <GameData.Nested_1> FMAOEJEHPAO)
        {
            if (!Jester.jesterEnabled)
            {
                return;
            }

            Jester.introDone = false;

            PlayerController.InitPlayers();

            List <Player> crewmates = getCrewMates(FMAOEJEHPAO);
            var           jesterid  = new System.Random().Next(0, crewmates.Count);

            Player        jester = crewmates[jesterid];
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetJester, Hazel.SendOption.Reliable);

            writer.Write(jester.playerdata.PlayerId);
            writer.EndMessage();
            jester.components.Add("Jester");

            Jester.localPlayers.Clear();
            Jester.localPlayer = PlayerControl.LocalPlayer;

            foreach (var player in PlayerControl.AllPlayerControls)
            {
                Jester.localPlayers.Add(player);
            }

            writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetLocalPlayersJester, Hazel.SendOption.Reliable);
            writer.WriteBytesAndSize(Jester.localPlayers.Select(player => player.PlayerId).ToArray());
            writer.EndMessage();
        }
        public void CopyMessage()
        {
            var readerPool = CreateReaderPool();

            // Create message.
            const int  msgLength = 18;
            const byte Test1     = 12;
            const byte Test2     = 146;

            var msg = new MessageWriter(2048);

            msg.StartMessage(1);
            msg.StartMessage(2);
            msg.Write(Test1);
            msg.Write(Test2);
            msg.StartMessage(2);
            msg.Write(Test1);
            msg.Write(Test2);
            msg.StartMessage(2);
            msg.Write(Test1);
            msg.Write(Test2);
            msg.EndMessage();
            msg.EndMessage();
            msg.EndMessage();
            msg.EndMessage();

            // Read message.
            using var reader = readerPool.Get();

            reader.Update(msg.Buffer);

            // Read first message.
            using var messageOne = reader.ReadMessage();

            Assert.Equal(1, messageOne.Tag);
            Assert.Equal(0, messageOne.Position);
            Assert.Equal(3, messageOne.Offset);
            Assert.Equal(msgLength - 3, messageOne.Length);

            using var messageTwo = messageOne.ReadMessage();

            Assert.Equal(2, messageTwo.Tag);
            Assert.Equal(0, messageTwo.Position);
            Assert.Equal(6, messageTwo.Offset);
            Assert.Equal(msgLength - 6, messageTwo.Length);
            Assert.Equal(Test1, messageTwo.ReadByte());
            Assert.Equal(Test2, messageTwo.ReadByte());

            using var messageThree = messageTwo.ReadMessage();

            Assert.Equal(2, messageThree.Tag);
            Assert.Equal(0, messageThree.Position);
            Assert.Equal(11, messageThree.Offset);
            Assert.Equal(msgLength - 11, messageThree.Length);
            Assert.Equal(Test1, messageThree.ReadByte());
            Assert.Equal(Test2, messageThree.ReadByte());
        }
示例#6
0
        public static bool Prefix(Vent __instance)
        {
            bool flag;
            bool flag2;

            __instance.CanUse(PlayerControl.LocalPlayer.PPMOEEPBHJO, out flag, out flag2);

            if (!flag)
            {
                return(true);        // Continue with default method
            }
            bool isEnter = !PlayerControl.LocalPlayer.inVent;

            if (isEnter)
            {
                localVentEnterTimePoint = DateTime.UtcNow;
            }

            if (!__instance.name.StartsWith("JackInTheBoxVent_"))
            {
                return(true);                                                  // Continue with default method
            }
            __instance.SetButtons(isEnter);
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UseUncheckedVent, Hazel.SendOption.Reliable);

            writer.WritePacked(__instance.Id);
            writer.Write(PlayerControl.LocalPlayer.PlayerId);
            writer.Write(isEnter ? byte.MaxValue : (byte)0);
            writer.EndMessage();
            RPCProcedure.useUncheckedVent(__instance.Id, PlayerControl.LocalPlayer.PlayerId, isEnter ? byte.MaxValue : (byte)0);

            return(false);
        }
示例#7
0
        public static void Postfix(Il2CppReferenceArray <PlayerInfo> BHNEINNHPIJ)
        {
            Metamorphosis.Logger.LogDebug($"RcpSetInfected postfix start");
            InitMetamorphs();

            List <byte>          infectedIds = new List <byte>();
            List <PlayerControl> infected    = GetInfected(BHNEINNHPIJ, ref infectedIds);

            foreach (PlayerControl playerControl in infected)
            {
                Metamorph metamorph = new Metamorph(playerControl);
                Metamorphs.Add(metamorph);
                Metamorphosis.Logger.LogDebug($"RcpSetInfected postfix: {metamorph.PlayerId} added");
                if (playerControl.PlayerId == PlayerControl.LocalPlayer.PlayerId)
                {
                    Metamorphosis.Logger.LogDebug($"RcpSetInfected postfix: Metamorph is a local player {metamorph.PlayerId}");
                    Metamorph.LocalMetamorph = metamorph;
                    if (HudManagerPatch.MorphButton != null)
                    {
                        HudManagerPatch.MorphButton.StartCooldown(CustomGameOptions.MorphCooldown + 9.0f);
                        HudManagerPatch.MorphButton.EffectDuration   = CustomGameOptions.MorphDuration;
                        HudManagerPatch.MorphButton.CooldownDuration = CustomGameOptions.MorphCooldown;
                    }
                }
            }

            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetMetamorphs, Hazel.SendOption.Reliable);

            writer.WriteBytesAndSize(infectedIds.ToArray());

            writer.EndMessage();

            Metamorphosis.Logger.LogDebug("RcpSetInfected postfix");
        }
示例#8
0
        static bool Prefix(PlayerPhysics __instance)
        {
            ModdedPlayerClass moddedController = Main.Instance.ModdedPlayerById(__instance.myPlayer.PlayerId);

            if (__instance.myPlayer != PlayerControl.LocalPlayer || moddedController?.Role?.RoleName != "Bellatrix" || ((Bellatrix)moddedController.Role).MindControlledPlayer == null)
            {
                return(true);
            }

            PlayerPhysics controlledPlayer = ((Bellatrix)moddedController.Role).MindControlledPlayer._Object.MyPhysics;

            GameData.PlayerInfo data = moddedController._Object.Data;
            bool flag = data != null && data.IsDead;

            Vector2 vel = HudManager.Instance.joystick.Delta * __instance.TrueSpeed;

            controlledPlayer.body.velocity = vel;

            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.MoveControlledPlayer, Hazel.SendOption.Reliable);

            writer.Write(controlledPlayer.myPlayer.PlayerId);
            writer.Write(vel.x);
            writer.Write(vel.y);
            writer.EndMessage();
            return(false);
        }
示例#9
0
        public void RpcDestroyCrucio()
        {
            DestroyCrucio();
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.DestroyCrucio, SendOption.Reliable);

            writer.EndMessage();
        }
示例#10
0
        public override void Use()
        {
            System.Console.WriteLine("Used Deluminator");
            this.Delete();

            switch (Main.Instance.IsLightsSabotaged())
            {
            case true:
                var switchSystem = ShipStatus.Instance.Systems[SystemTypes.Electrical].Cast <SwitchSystem>();
                switchSystem.ActualSwitches = switchSystem.ExpectedSwitches;
                MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.FixLightsRpc, SendOption.Reliable);
                writer.EndMessage();
                break;

            case false:
                byte b = 4;
                for (var i = 0; i < 5; i++)
                {
                    if (new System.Random().Next(0, 2) == 0)
                    {
                        b |= (byte)(1 << i);
                    }
                }
                ShipStatus.Instance.RpcRepairSystem(SystemTypes.Electrical, b | 128);
                break;
            }
        }
        public void Setup()
        {
            var message = new MessageWriter(1024);

            message.StartMessage(1);
            message.Write((ushort)3100);
            message.Write((byte)100);
            message.Write((int)int.MaxValue);
            message.WritePacked(int.MaxValue);
            message.EndMessage();

            _data = message.ToByteArray(true);

            MessageReader_Bytes_Pooled.Return(MessageReader_Bytes_Pooled.Get(_data));

            // Services
            var services = new ServiceCollection();

            services.AddSingleton <ObjectPoolProvider>(new DefaultObjectPoolProvider());
            services.AddSingleton(serviceProvider =>
            {
                var provider = serviceProvider.GetRequiredService <ObjectPoolProvider>();
                var policy   = new MessageReader_Bytes_Pooled_ImprovedPolicy(serviceProvider);
                return(provider.Create(policy));
            });

            _pool = services
                    .BuildServiceProvider()
                    .GetRequiredService <ObjectPool <MessageReader_Bytes_Pooled_Improved> >();
        }
示例#12
0
        public void ReadProperInt()
        {
            const int Test1 = int.MaxValue;
            const int Test2 = int.MinValue;

            var msg = new MessageWriter(128);

            msg.StartMessage(1);
            msg.Write(Test1);
            msg.Write(Test2);
            msg.EndMessage();

            Assert.Equal(11, msg.Length);
            Assert.Equal(msg.Length, msg.Position);

            var readerPool = CreateReaderPool();
            var reader     = readerPool.Get();

            reader.Update(msg.Buffer);
            Assert.Equal(byte.MaxValue, reader.Tag);
            var message = reader.ReadMessage();

            Assert.Equal(1, message.Tag);
            Assert.Equal(Test1, message.ReadInt32());
            Assert.Equal(Test2, message.ReadInt32());
        }
示例#13
0
 static bool Prefix(MeetingHud __instance)
 {
     if (__instance.DHCOPOOJCLN.All((PlayerVoteArea ps) => ps.isDead || ps.didVote))
     {
         byte[] self = calculateVotes(__instance);
         bool   tie;
         int    maxIdx = IndexOfMax(self, (byte p) => (int)p, out tie) - 1;
         GameData.OFKOJOKOOAK exiled = null;
         foreach (GameData.OFKOJOKOOAK pi in GameData.Instance.AllPlayers)
         {
             if (pi.GMBAIPNOKLP == maxIdx)
             {
                 exiled = pi;
                 break;
             }
         }
         byte[] array = new byte[10];
         for (int i = 0; i < __instance.DHCOPOOJCLN.Length; i++)
         {
             PlayerVoteArea playerVoteArea = __instance.DHCOPOOJCLN[i];
             array[(int)playerVoteArea.HMPHKKGPLAG] = playerVoteArea.GetState();
         }
         // RPCVotingComplete
         if (AmongUsClient.Instance.HNMILJEOEKN)
         {
             __instance.MJIJGEBBMAO(array, exiled, tie);
         }
         MessageWriter messageWriter = AmongUsClient.Instance.StartRpc(__instance.NetId, 23, Hazel.SendOption.Reliable);
         messageWriter.WriteBytesAndSize(array);
         messageWriter.Write((exiled != null) ? exiled.GMBAIPNOKLP : byte.MaxValue);
         messageWriter.Write(tie);
         messageWriter.EndMessage();
     }
     return(false);
 }
示例#14
0
 /// <summary>
 /// Writes a join game request to the specified message writer.
 /// </summary>
 private void JoinGame(MessageWriter writer)
 {
     writer.StartMessage((byte)MMTags.JoinGame);
     writer.Write(_lobbyCode);
     writer.WritePacked(0x7); // map ownership flags
     writer.EndMessage();
 }
示例#15
0
        public void ReadProperString()
        {
            const string Test1 = "Hello";
            string       Test2 = new string(' ', 1024);
            var          msg   = new MessageWriter(2048);

            msg.StartMessage(1);
            msg.Write(Test1);
            msg.Write(Test2);
            msg.Write(string.Empty);
            msg.EndMessage();

            Assert.Equal(msg.Length, msg.Position);

            var readerPool = CreateReaderPool();
            var reader     = readerPool.Get();

            reader.Update(msg.Buffer);
            Assert.Equal(byte.MaxValue, reader.Tag);
            var message = reader.ReadMessage();

            Assert.Equal(1, message.Tag);
            Assert.Equal(Test1, message.ReadString());
            Assert.Equal(Test2, message.ReadString());
            Assert.Equal(string.Empty, message.ReadString());
        }
示例#16
0
            public static bool Prefix(MeetingHud __instance)
            {
                if (!__instance.playerStates.All(ps => ps.isDead || ps.didVote))
                {
                    return(false);
                }
                byte[] self = calculateVotes(__instance.playerStates);

                int maxIdx = indexOfMax(self, out bool tie) - 1;

                GameData.PlayerInfo exiled = GameData.Instance.GetPlayerById((byte)maxIdx);
                byte[] states = __instance.playerStates.Select(s => s.GetState()).ToArray();
                byte[] votes  = __instance.playerStates.Select(s => (byte)s.votedFor).ToArray();
                if (AmongUsClient.Instance.AmHost)
                {
                    MessageWriter messageWriter = AmongUsClient.Instance.StartRpc(__instance.NetId, 23, SendOption.Reliable);
                    messageWriter.WriteBytesAndSize(states);
                    messageWriter.WriteBytesAndSize(votes);                     //Added because of the state's 4 bit vote id limit
                    messageWriter.Write(exiled?.PlayerId ?? byte.MaxValue);
                    messageWriter.Write(tie);
                    messageWriter.EndMessage();
                }

                MeetingHudHandleRpcPatch.VotingComplete(__instance, states, votes, exiled, tie);
                return(false);
            }
示例#17
0
 public MessageWriter Write()
 {
     _writer.StartMessage((byte)_flag);
     WriteMessage(_writer);
     _writer.EndMessage();
     return(_writer);
 }
示例#18
0
        public static void RpcSetModActive(bool active)
        {
            MessageWriter messageWriter = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRpc.SetModActive, SendOption.Reliable);

            messageWriter.Write(active);
            messageWriter.EndMessage();
        }
示例#19
0
        public void ReadProperBool()
        {
            const bool Test1 = true;
            const bool Test2 = false;

            var msg = new MessageWriter(128);

            msg.StartMessage(1);
            msg.Write(Test1);
            msg.Write(Test2);
            msg.EndMessage();

            Assert.Equal(5, msg.Length);
            Assert.Equal(msg.Length, msg.Position);

            var readerPool = CreateReaderPool();
            var reader     = readerPool.Get();

            reader.Update(msg.Buffer);
            Assert.Equal(byte.MaxValue, reader.Tag);
            var message = reader.ReadMessage();

            Assert.Equal(1, message.Tag);
            Assert.Equal(Test1, message.ReadBoolean());
            Assert.Equal(Test2, message.ReadBoolean());
        }
示例#20
0
        public void RpcDefensiveDuelist(PlayerControl player)
        {
            DefensiveDuelist(player);
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.DefensiveDuelist, SendOption.Reliable);

            writer.Write(player.PlayerId);
            writer.EndMessage();
        }
示例#21
0
        public static void RpcHostSetSkin(byte playerId, uint skinId)
        {
            MessageWriter messageWriter = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRpc.HostSetSkin, SendOption.Reliable);

            messageWriter.WritePacked(playerId);
            messageWriter.WritePacked(skinId);
            messageWriter.EndMessage();
        }
示例#22
0
        public void RpcCrucioBlind(PlayerControl target)
        {
            CrucioBlind(target);
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.DeactivatePlayer, SendOption.Reliable);

            writer.Write(target.PlayerId);
            writer.EndMessage();
        }
示例#23
0
        public void RpcInvisPlayer(PlayerControl target)
        {
            InvisPlayer(target);
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.InvisPlayer, SendOption.Reliable);

            writer.Write(target.PlayerId);
            writer.EndMessage();
        }
示例#24
0
        public void RpcControlPlayer(PlayerControl controller, PlayerControl target)
        {
            ControlPlayer(controller, target);
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.StartControlling, SendOption.Reliable);

            writer.Write(controller.PlayerId);
            writer.Write(target.PlayerId);
            writer.EndMessage();
        }
示例#25
0
 public static void Serialize(MessageWriter writer, string serverName, string serverVersion, int pluginCount)
 {
     writer.StartMessage(byte.MaxValue);
     writer.Write((byte)ReactorMessageFlags.Handshake);
     writer.Write(serverName);
     writer.Write(serverVersion);
     writer.WritePacked(pluginCount);
     writer.EndMessage();
 }
示例#26
0
        public void RpcForceAllVotes(sbyte playerId)
        {
            GetLocalModdedPlayer().Inventory.Find(x => x.Id == 3).Delete();
            ForceAllVotes(playerId);
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.ForceAllVotes, SendOption.Reliable);

            writer.Write(playerId);
            writer.EndMessage();
        }
示例#27
0
 public static void Postfix(GameOptionsData OMFKMPLOPPM)
 {
     if (PlayerControl.AllPlayerControls.Count > 1)
     {
         MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncCustomSettingsJester, Hazel.SendOption.Reliable);
         writer.Write(Jester.jesterEnabled);
         writer.EndMessage();
     }
 }
示例#28
0
        public static void Postfix(Il2CppReferenceArray <GameData.LGBOMGHJELL> BHNEINNHPIJ)
        {
            PlayerController.InitPlayers();

            CustomGameObjectManager.deleteAll();

            EndGameManagerPatch.LoveCoupleWins = false;
            List <Player> crewmates = getCrewMates(BHNEINNHPIJ);
            int           lover1idx = (byte)new System.Random().Next(0, crewmates.Count);



            int lover2idx = (byte)new System.Random().Next(0, crewmates.Count);

            if (lover1idx == lover2idx)
            {
                lover2idx = (lover2idx + 1) % crewmates.Count;
            }



            Player[] impostors = PlayerController.getImpostors();
            byte     r         = (byte)new System.Random().Next(0, 3);

            if (r == 0)
            {
                lover2idx = (byte)new System.Random().Next(0, impostors.Length);
            }

            Player lover1 = crewmates[lover1idx];
            Player lover2 = crewmates[lover2idx];

            if (r == 0)
            {
                lover2 = impostors[lover2idx];
            }



            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetCouple, Hazel.SendOption.Reliable);

            writer.Write(lover1.playerdata.PlayerId);

            writer.Write(lover2.playerdata.PlayerId);
            writer.Write(r);
            writer.EndMessage();
            lover1.components.Add(new Love(lover1, lover2));
            lover2.components.Add(new Love(lover2, lover1));
            HudManagerPatch.LoadSprites();
            var localplayer = PlayerController.getLocalPlayer();

            if (lover1 == localplayer | lover2 == localplayer)
            {
                CustomGameObjectManager.AddObject(new Heart(lover1.playerdata.nameText));
                CustomGameObjectManager.AddObject(new Heart(lover2.playerdata.nameText));
            }
        }
示例#29
0
        public void RpcKillPlayer(PlayerControl killer, PlayerControl target, bool isCurseKill = true)
        {
            KillPlayer(killer, target, isCurseKill);
            MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)Packets.KillPlayerUnsafe, SendOption.Reliable);

            writer.Write(killer.PlayerId);
            writer.Write(target.PlayerId);
            writer.Write(isCurseKill);
            writer.EndMessage();
        }
示例#30
0
        public static void Postfix(CEIOGGEDKAN DJGAEEMDIDF)
        {
            if (PlayerControl.AllPlayerControls.Count > 1)
            {
                MessageWriter writer = AmongUsClient.Instance.StartRpc(InnerPlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncCustomSettings, Hazel.SendOption.Reliable);
                writer.Write(CustomGameOptions.BothLoversDie);

                writer.EndMessage();
            }
        }