connected = false;
}
return;
}
LoginServerPacket pa = null;
loginCrypt.decrypt(raw, 2, raw.length - 2);
switch (status) {
case INIT:
loginCrypt = new LoginCrypt();
// init packet must be dexored in addition
byte[] tmp = new byte[raw.length - 2];
System.arraycopy(raw, 2, tmp, 0, raw.length - 2);
loginCrypt.decXORPass(tmp, 0, tmp.length);
System.arraycopy(tmp, 0, raw, 2, tmp.length);
log.info("Received Init packet, requesting Auth GameGuard...");
pa = new Init();
status = LoginStatus.AUTHGAMEGUARD;
break;
case AUTHGAMEGUARD:
if (raw[2] == 0x0B) {
log
.info("Received Auth GameGuard, requesting AuthLogin...");
pa = new AuthLogin(user, password, rsaKey);
status = LoginStatus.AUTHENTIFICATED;
selectedServer = -1;
}
break;
case AUTHENTIFICATED:
switch (raw[2]) {
case 0x01:// login fail
case 0x02:
log.info("Received login failed:" + raw[2] + ":" + raw[3]);
pa = new LoginFailed();
doDisconnect(false, "", -1);
break;
case 0x03:// login ok
log.info("Login ok, requesting server list...");
pa = new LoginOk();
break;
case 0x04:// server list
log.info("Received server list...");
pa = new ServerList();
break;
case 0x06:// play fail
log.info("Received play fail:" + raw[2] + ":" + raw[3]);
pa = new PlayFailed();
// TODO what to do next, back to server list?
break;
case 0x07:
log.info("Received play ok");
pa = new PlayOK(gameServers[selectedServer]);
break;
default:
log.severe("Unhandled packet in Loginserver with id:"
+ raw[2]);
}
}
if (pa != null) {
pa.setBytes(raw);
pa.setHandler(this);
try {
pa.handlePacket();
} catch (Exception e) {
log.log(Level.SEVERE, "Failed to handle login packet"
+ pa.getClass().getSimpleName() + " Check packet code!", e);
}
}
}
}