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(); }
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; }
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); }
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); }