Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package tom.rsps.nio.io.log;
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.logging.Logger;
- import java.nio.ByteBuffer;
- import tom.rsps.nio.Constants;
- import tom.rsps.nio.World;
- import tom.rsps.nio.io.ActionSender;
- import tom.rsps.nio.io.manager.CharacterManager;
- import tom.rsps.nio.model.Player;
- import tom.rsps.nio.util.Utils;
- public class Login implements Runnable {
- private static Queue<LoginRequest> logins = new LinkedList<LoginRequest>();
- private static final Logger logger = Logger.getLogger(Login.class.getName());
- @Override
- public void run() {
- try {
- while(true) {
- synchronized(logins) {
- if (!logins.isEmpty()) {
- LoginRequest lq = null;
- while ((lq = logins.poll()) != null) {
- ByteBuffer in = (ByteBuffer) lq.get("buffer");
- while (doDecoder(lq, in, ByteBuffer.allocateDirect(8192)));
- }
- }
- }
- Thread.sleep(300);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void add(LoginRequest lq) {
- logins.add(lq);
- }
- private static boolean doDecoder(LoginRequest lq, ByteBuffer in, ByteBuffer out) {
- try {
- int stage = 0;
- if (lq.get("stage") != null) {
- stage = (Integer) lq.get("stage");
- }
- switch (stage) {
- case -3:
- if (in.remaining() > 1) {
- /*short opcode = in.getShort();
- if (opcode == 0) {
- } else {
- }*/
- for(int data : Constants.WORLD_LIST_DATA) {
- out.put((byte) data);
- }
- lq.send(out);
- }
- break;
- case -2:
- if (in.remaining() > 7) {
- for(int i = 0; i < 8; i++) {
- in.get();
- }
- out.put(Constants.CRC_KEYS);
- lq.send(out);
- }
- break;
- case -1:
- /*while (in.remaining() > 3) { for update server...
- int type = in.get() & 0xff, cache in.get() & 0xff, id = in.getShort() & 0xff;
- }*/
- if (in.remaining() > 2) {
- in.get();
- if (in.getShort() == Constants.CLIENT_VERSION) {
- out.put((byte)0);
- lq.send(out);
- lq.set("stage", -2);
- return true;
- } else {
- out.put((byte)6);
- lq.send(out);
- }
- }
- break;
- case 0:
- if (in.remaining() > 1) {
- int protocolId = in.get() & 0xff;
- int hash = in.get() & 0xff;
- switch (protocolId) {
- case 23:
- lq.set("stage", -3);
- return true;
- case 15:
- lq.set("stage", -1);
- return true;
- case 14:
- long key = ((long) (java.lang.Math.random() * 99999999D) << 32) + (long) (java.lang.Math.random() * 99999999D);
- out.put((byte)0).putLong(key);
- lq.send(out);
- lq.set("key", key);
- lq.set("hash", hash);
- lq.set("stage", 1);
- return true;
- default:
- logger.info("Unhandled protocolId: "+protocolId);
- return false;
- }
- }
- break;
- case 1:
- if (in.remaining() > 2) {
- in.get();
- int size = in.getShort();
- if (size == in.remaining()) {
- int version = in.getInt();
- if (version == Constants.CLIENT_VERSION) {
- in.get();
- byte screen = in.get();
- short width = in.getShort();
- short height = in.getShort();
- for (int i = 0; i < 24; i++) {
- if (in.get() == 0) {
- //bot
- }
- }
- Utils.getRS2String(in); // 127
- for (int i = 0; i < 28; i++) { // 112
- in.getInt();
- }
- for (int i = 0; i < 12; i++) {
- in.get();
- }
- for (int i = 0; i < 4; i++) {
- in.getInt();
- }
- long name = in.getLong();
- String username = Utils.longToPlayerName(name), password = Utils.getRS2String(in);
- byte returnCode = 2;
- byte right = 0;
- if (returnCode == 2) {
- out.put((byte)returnCode).put((byte)right).put((byte)0).put((byte)0).put((byte)0).put((byte)1).put((byte)0).put((byte)0).putShort((short)0).put((byte)1).put((byte)(Constants.IS_MEMBER_WORLD ? 1 : 0));
- lq.send(out);
- Player player = new Player(lq.getSocketChannel(), username, password, name, right, screen, width, height);
- ActionSender.sendLogin(player);
- World.register(player);
- lq.set("player", player);
- logger.info("Username: "+username+", password: "+password+", right: "+right+", screen: "+screen);
- CharacterManager.saveCharacter(player);
- } else {
- out.put((byte)returnCode);
- lq.send(out);
- }
- }
- }
- }
- break;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement