try { fillInStream(2); if(inStream.readUnsignedByte() != 14) { shutdownError("Expected Login ID 14 From Client."); disconnected = true; return; } int namePart = inStream.readUnsignedByte(); for(int i = 0; i < 8; i++) out.write(0); out.write(0); outStream.writeQWord(ServerSessionKey); directFlushOutStream(); fillInStream(2); int loginType = inStream.readUnsignedByte(); if(loginType != 16 && loginType != 18) { shutdownError("Unexpected Login Type "+loginType); return; } int loginPacketSize = inStream.readUnsignedByte(); int loginEncryptPacketSize = loginPacketSize-(36+1+1+2); Misc.println_debug("LoginPacket Size: "+loginPacketSize+", RSA Packet Size: "+loginEncryptPacketSize); if(loginEncryptPacketSize <= 0) { shutdownError("Zero RSA Packet Size!"); return; } fillInStream(loginPacketSize); if(inStream.readUnsignedByte() != 255 || inStream.readUnsignedWord() != 377) { shutdownError("Wrong Login Packet Magic ID (Expected 255, 377)"); return; } lowMemoryVersion = inStream.readUnsignedByte(); Misc.println_debug("Client Type: "+((lowMemoryVersion==1) ? "Low" : "High")+" Memory Version"); for(int i = 0; i < 9; i++) { Misc.println_debug("dataFileVersion["+i+"]: 0x"+Integer.toHexString(inStream.readDWord())); } loginEncryptPacketSize--; // don't count length byte int tmp = inStream.readUnsignedByte(); if(loginEncryptPacketSize != tmp) { shutdownError("Encrypted Packet Data Length ("+loginEncryptPacketSize+") Different From Length Byte Thereof ("+tmp+")"); return; } ClientSessionKey = inStream.readQWord(); ServerSessionKey = inStream.readQWord(); Misc.println("UserID: "+inStream.readDWord()); int sessionKey[] = new int[4]; sessionKey[0] = (int)(ClientSessionKey >> 32); sessionKey[1] = (int)ClientSessionKey; sessionKey[2] = (int)(ServerSessionKey >> 32); sessionKey[3] = (int)ServerSessionKey; for(int i = 0; i < 4; i++) Misc.println_debug("inStreamSessionKey["+i+"]: 0x"+Integer.toHexString(sessionKey[i])); inStreamDecryption = new KeySet(sessionKey); for(int i = 0; i < 4; i++) sessionKey[i] += 50; for(int i = 0; i < 4; i++) Misc.println_debug("outStreamSessionKey["+i+"]: 0x"+Integer.toHexString(sessionKey[i])); outStreamDecryption = new KeySet(sessionKey); outStream.packetEncryption = outStreamDecryption; returnCode = 2; if(playerId == -1) out.write(7); else out.write(returnCode); out.write(playerRights); out.write(0);