private void OnReceiveCallback(IAsyncResult result) { if (IsTerminated) { return; } _stream.EndRead(result); byte[] buff = new byte[_buffer.Length]; _buffer.CopyTo(buff, 0); _crypt.decrypt(buff); TrafficUp += _buffer.Length; PacketHandler.handlePacket(this, buff); new System.Threading.Thread(read).Start(); }
public L2Packet handlePacket(byte[] rawPacket, bool fromServer) { if (rawPacket.Length < 3) // Valid data? { return(null); } if (fromServer) { serverCrypt.decrypt(rawPacket, 2, rawPacket.Length); } else { clientCrypt.decrypt(rawPacket, 2, rawPacket.Length); } ByteBuffer binPacket = new ByteBuffer(rawPacket); binPacket.ReadBytes(2); // Read 2 bytes ahead int opcode = binPacket.ReadByte(); int secondOpCode = -1; switch (state) { case GameClientState.CONNECTED: // Vom Server (ServerPacket) if (fromServer) { switch (opcode) { case 0x2e: // KeyPacket (Contains key, NOT Encrypted xD ) this.onKeyPacket(binPacket); break; case 0x09: // CharSelectionInfo this.state = GameClientState.AUTHED; break; } } // Vom Clienten else { } break; case GameClientState.AUTHED: if (fromServer) { switch (opcode) { case 0x73: this.state = GameClientState.IN_GAME; //Console.Out.WriteLine(Util.printData(binPacket)); break; } } else { switch (opcode) { case 0x0d: // get secondOpCode and set secondOpCode = binPacket.ReadInt16(); break; case 0x12: // CharacterSelect break; } } break; case GameClientState.IN_GAME: if (fromServer) { switch (opcode) { case 0xfe: // get secondOpCode secondOpCode = binPacket.ReadInt16(); break; case 0x0b: //CharSelected this.onCharSelected(binPacket); break; } } else { switch (opcode) { case 0x1f: break; case 0xd0: // get secondOpCode secondOpCode = binPacket.ReadInt16(); break; } } break; } if (fromServer) { return(new GameServerPacket(binPacket)); } else { return(new ClientPacket(binPacket)); } }