that was so easy to fix... let me grab the code.
EDIT: use my RS2LoginProtocolDecoder server sided in the net package.
Code:
// Decompiled by: Fernflower v0.6
// Date: 15.07.2011 00:19:25
// Copyright: 2008-2009, Stiver
// Home page: http://www.reversed-java.com
package server.net;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoFuture;
import org.apache.mina.common.IoFutureListener;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import server.Server;
import server.ls.LoginResponse;
import server.model.players.Client;
import server.model.players.PlayerHandler;
import server.model.players.PlayerSave;
import server.net.GameCodecFactory;
import server.net.Packet;
import server.net.StaticPacketBuilder;
import server.util.ISAACRandomGen;
import server.util.Misc;
public class RS2LoginProtocolDecoder extends CumulativeProtocolDecoder {
protected boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) {
synchronized(session) {
Object loginStageObj = session.getAttribute("LOGIN_STAGE");
int loginStage = 0;
if(loginStageObj != null) {
loginStage = ((Integer)loginStageObj).intValue();
}
int var27;
int var30;
switch(loginStage) {
case 0:
if(2 <= in.remaining()) {
var30 = in.get() & 255;
var27 = in.get() & 255;
if(var30 == 14) {
long var26 = ((long)(Math.random() * 9.9999999E7D) << 32) + (long)(Math.random() * 9.9999999E7D);
StaticPacketBuilder var25 = new StaticPacketBuilder();
var25.setBare(true).addBytes(new byte[8]).addByte((byte)0).addLong(var26);
session.setAttribute("SERVER_SESSION_KEY", Long.valueOf(var26));
session.write(var25.toPacket());
session.setAttribute("LOGIN_STAGE", Integer.valueOf(1));
}
return true;
}
in.rewind();
return false;
case 1:
boolean loginType = true;
boolean loginPacketSize = true;
boolean loginEncryptPacketSize = true;
if(2 > in.remaining()) {
in.rewind();
return false;
} else {
var30 = in.get() & 255;
var27 = in.get() & 255;
int var24 = var27 - 40;
if(var27 > 0 && var24 > 0) {
if(var27 > in.remaining()) {
in.rewind();
return false;
}
int magic = in.get() & 255;
int version = in.getUnsignedShort();
int lowMem = in.get() & 255;
for(int clientSessionKey = 0; clientSessionKey < 9; ++clientSessionKey) {
in.getInt();
}
--var24;
if(var24 != (in.get() & 255)) {
System.out.println("Encrypted size mismatch.");
session.close();
return false;
}
if((in.get() & 255) != 10) {
System.out.println("Encrypted id != 10.");
session.close();
return false;
}
long var28 = in.getLong();
long serverSessionKey = in.getLong();
int uid = 0/*in.getInt()*/;
if(uid == 0/* && uid != 99735086*/) {
String name = this.readRS2String(in);
String pass = this.readRS2String(in);
int[] sessionKey = new int[]{(int)(var28 >> 32), (int)var28, (int)(serverSessionKey >> 32), (int)serverSessionKey};
ISAACRandomGen inC = new ISAACRandomGen(sessionKey);
for(int outC = 0; outC < 4; ++outC) {
sessionKey[outC] += 50;
}
ISAACRandomGen var29 = new ISAACRandomGen(sessionKey);
this.load(session, uid, name, pass, inC, var29, version, lowMem);
session.getFilterChain().remove("protocolFilter");
session.getFilterChain().addLast("protocolFilter", new ProtocolCodecFilter(new GameCodecFactory(inC)));
return true;
}
session.close();
System.out.println("Zero or negative login size.1");
return false;
}
System.out.println("Zero or negative login size.");
session.close();
return false;
}
default:
return false;
}
}
}
private synchronized void load(IoSession session, int uid, String name, String pass, ISAACRandomGen inC, ISAACRandomGen outC, int version, int lowMem) {
session.setAttribute("opcode", Integer.valueOf(-1));
session.setAttribute("size", Integer.valueOf(-1));
boolean loginDelay = true;
byte returnCode = 2;
boolean close = false;
name = name.trim();
name = name.toLowerCase();
pass = pass.toLowerCase();
if(!name.matches("[A-Za-z0-9 ]+")) {
returnCode = 4;
System.out.print("Name was wrong");
}
if(name.length() > 12) {
returnCode = 8;
System.out.print("Name too long");
}
final Client cl = new Client(session, -1);
cl.playerName = name;
cl.playerName2 = cl.playerName;
cl.playerPass = pass;
cl.nameAsLong = Misc.playerNameToInt64(cl.playerName);
cl.setInStreamDecryption(inC);
cl.setOutStreamDecryption(outC);
cl.outStream.packetEncryption = outC;
cl.inC = inC;
cl.saveCharacter = false;
/*if(Server.infractionManager.banList.contains(cl.playerName.toLowerCase())) {
PlayerSave.loadGame(cl, cl.playerName, cl.playerPass);
if(System.currentTimeMillis() < cl.banEnd) {
returnCode = 4;
} else {
Server.infractionManager.removePlayer(cl.playerName, 3);
cl.banStart = 0;
cl.banEnd = 0;
}
}*/
PlayerHandler var10000 = Server.playerHandler;
if(PlayerHandler.isPlayerOn(name)) {
returnCode = 5;
}
/* if(99144 != uid) {
returnCode = 6;
}*/
if(PlayerHandler.playerCount >= 1024) {
returnCode = 7;
}
if(Server.UpdateServer) {
returnCode = 14;
}
if(returnCode == 2) {
// System.out.print("Made it here");
int bldr = PlayerSave.loadGame(cl, cl.playerName, cl.playerPass);
if(bldr == 0) {
if(!name.contains("admin") && !name.contains("mod")) {
cl.addStarter = true;
} else {
bldr = 3;
}
}
if(bldr == 3) {
returnCode = 3;
cl.saveFile = false;
close = true;
} else {
for(int pkt = 0; pkt < cl.playerEquipment.length; ++pkt) {
if(cl.playerEquipment[pkt] == 0) {
cl.playerEquipment[pkt] = -1;
cl.playerEquipmentN[pkt] = 0;
}
}
}
} else {
close = true;
}
cl.returnCode = returnCode;
if(returnCode != 2) {
StaticPacketBuilder var16 = new StaticPacketBuilder();
var16.setBare(true);
var16.addByte((byte)returnCode);
var16.addByte((byte)0);
var16.addByte((byte)0);
Packet var17 = var16.toPacket();
cl.getSession().write(var17).addListener(new IoFutureListener() {
public void operationComplete(IoFuture arg0) {
cl.getSession().close();
}
});
}
if(returnCode == 2) {
// LoginResponse.pendLogin(cl);
LoginResponse.handleLoginResponse(cl, 2);
}
}
private synchronized String readRS2String(ByteBuffer in) {
StringBuilder sb = new StringBuilder();
byte b;
while((b = in.get()) != 10) {
sb.append((char)b);
}
return sb.toString();
}
public void dispose(IoSession session) throws Exception {
super.dispose(session);
}
}