Пример #1
0
        public byte[] GetFile(int hash)
        {
            for (var i = 0; i < fileHashes.Length; i++)
            {
                if (fileHashes[i] == hash)
                {
                    if (!extractedAsWhole)
                    {
                        var compressed = new byte[packedSizes[i]];
                        Buffer.BlockCopy(buffer.Array(), positions[i], compressed, 0, compressed.Length);
                        compressed = ReconstructHeader(compressed);

                        var outs = new MemoryStream();
                        BZip2.Decompress(new MemoryStream(compressed), outs, true);
                        return(outs.ToArray());
                    }

                    var decompressed = new byte[unpackedSizes[i]];
                    Buffer.BlockCopy(buffer.Array(), positions[i], decompressed, 0, decompressed.Length);
                    return(decompressed);
                }
            }

            throw new FileNotFoundException();
        }
Пример #2
0
        public void Handle(int opcode, JagexBuffer buf)
        {
            entityUpdateCount = 0;
            entityCount       = 0;

            UpdateLocalPlayerMovement(buf);
            UpdateRemotePlayerMovement(buf);
            UpdateNewPlayers(buf);
            UpdatePlayerMasks(buf);

            for (var i = 0; i < entityUpdateCount; i++)
            {
                var playerIndex = entityUpdateIndices[i];
                if (GameContext.Players[playerIndex].UpdateCycle != GameContext.LoopCycle)
                {
                    GameContext.Players[playerIndex].Destroy();
                    GameContext.Players[playerIndex] = null;
                }
            }

            if (buf.Position() != buf.Array().Length)
            {
                Debug.Log("PLAYER UPDATING ERROR 69");
            }

            for (var i = 0; i < GameContext.PlayerCount; i++)
            {
                if (GameContext.Players[GameContext.PlayerIndices[i]] == null)
                {
                    Debug.Log("PLAYER UPDATING ERROR 777");
                }
            }

            GameContext.ReceivedPlayerUpdate = true;
        }
Пример #3
0
        private byte[] ReconstructHeader(JagexBuffer buffer)
        {
            var existing = buffer.Array();

            if (existing[0] == 'B' && existing[1] == 'Z' && existing[2] == 'h' && existing[3] == '1')
            {
                return(existing);
            }

            var compressed = new byte[buffer.Capacity() + 4];

            buffer.ReadBytes(compressed, 4, buffer.Capacity());
            compressed[0] = (byte)'B';
            compressed[1] = (byte)'Z';
            compressed[2] = (byte)'h';
            compressed[3] = (byte)'1';
            return(compressed);
        }
Пример #4
0
        public LoginResponse WriteAuthBlock(string username, string password)
        {
            var stream = client.GetStream();

            stream.ReadTimeout = 5000;

            var nameHash = StringUtils.StringToLong(username);
            var i        = (int)(nameHash >> 16 & 31L);

            var @out = new DefaultJagexBuffer(5000);

            @out.Position(0);
            @out.WriteByte(14);
            @out.WriteByte(i);
            stream.Write(@out.Array(), 0, @out.Position());
            @out.Position(0);
            stream.Flush();
            for (var j = 0; j < 8; j++)
            {
                stream.ReadByte();
            }

            int response = stream.ReadByte();

            if (response == 0)
            {
                InBuffer.Position(0);
                stream.Read(InBuffer.Array(), 0, 8);
                var serverSeed = InBuffer.ReadLong();

                var seed = new int[4];
                var rand = new System.Random();

                seed[0] = (int)(rand.NextDouble() * 9.9999999E7D);
                seed[1] = (int)(rand.NextDouble() * 9.9999999E7D);
                seed[2] = (int)(serverSeed >> 32);
                seed[3] = (int)(serverSeed);

                @out.Position(0);
                @out.WriteByte(10);
                @out.WriteInt(seed[0]);
                @out.WriteInt(seed[1]);
                @out.WriteInt(seed[2]);
                @out.WriteInt(seed[3]);
                @out.WriteInt(350 >> 2240);
                @out.WriteString(username, 10);
                @out.WriteString(password, 10);
                @out.WriteShort(222);
                @out.WriteByte(0);
                @out.RSA(GameConstants.LoginRsaExp, GameConstants.LoginRsaMod);

                wrapperBuffer.Position(0);
                wrapperBuffer.WriteByte(16);
                wrapperBuffer.WriteByte(@out.Position() + 36 + 1 + 2);
                wrapperBuffer.WriteByte(255);
                wrapperBuffer.WriteShort(13);
                wrapperBuffer.WriteByte(1);
                for (var j = 0; j < 9; j++)
                {
                    wrapperBuffer.WriteInt(0);
                }

                GameContext.OutCipher = new ISAACCipher(seed);
                for (var j = 0; j < seed.Length; j++)
                {
                    seed[j] += 50;
                }
                GameContext.InCipher = new ISAACCipher(seed);

                wrapperBuffer.WriteBytes(@out.Array(), 0, @out.Position());
                stream.Write(wrapperBuffer.Array(), 0, wrapperBuffer.Position());
                stream.Flush();

                response = stream.ReadByte();
                @out.Position(0);

                if (response == 2)
                {
                    GameContext.LocalRights = stream.ReadByte();
                    stream.ReadByte();
                    Connected = true;
                    return(LoginResponse.SuccessfulLogin);
                }
            }
            return(LoginResponse.Unknown);
        }