Advertisement
Guest User

Untitled

a guest
May 14th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 5.78 KB | None | 0 0
  1.     public static void decodePLP(PLPDContext ctx, ChannelBuffer message) {
  2.         ctx.getIncomingVector().setBufferData(message);
  3.         final Channel channel = ctx.getChannel();
  4.         if (ctx.getIncomingVector().readable()) {
  5.             switch (ctx.getProtocolStage()) {
  6.             case -1:
  7.                 if (ctx.getIncomingVector().readableBytes() >= 8) {
  8.                     ctx.getIncomingVector().skip(8);
  9.                     for (int key : Constants.UPDATE_KEYS)
  10.                         ctx.getOutgoingVector().writeByte(key);
  11.                     ctx.getOutgoingVector().write(ctx.getChannel()).addListener(new ChannelFutureListener() {
  12.                         @Override
  13.                         public void operationComplete(ChannelFuture arg0)
  14.                                 throws Exception {
  15.                             logger.info("[-1][15] Update keys written");
  16.                             ConnectionHandler.close(channel);
  17.                         }
  18.                     });
  19.                     break;
  20.                 } else {
  21.                     break;
  22.                 }
  23.             case 0:
  24.                 int opcode = ctx.getIncomingVector().readByte() & 0xff;
  25.                 switch (opcode) {
  26.                 case 14:
  27.                     long l = ((long) (java.lang.Math.random() * 99999999D) << 32) + (long) (java.lang.Math.random() * 99999999D);
  28.                     ctx.getOutgoingVector().writeByte(0).writeLong(l).write(channel);
  29.                     break;
  30.                 case 15:
  31.                     if (ctx.getIncomingVector().readableBytes() >= 4) {
  32.                         if (ctx.getIncomingVector().readInt() == Constants.REVISION) {
  33.                             ctx.getOutgoingVector().writeByte(0).write(ctx.getChannel());
  34.                             logger.info("[0][15] Status code 0 written");
  35.                             ctx.setProtocolStage(-1);
  36.                             break;
  37.                         } else {
  38.                             ctx.getOutgoingVector().writeByte(1).write(ctx.getChannel()).addListener(new ChannelFutureListener() {
  39.                                 @Override
  40.                                 public void operationComplete(ChannelFuture arg0)
  41.                                         throws Exception {
  42.                                     ConnectionHandler.close(channel);
  43.                                 }
  44.                             });
  45.                             break;
  46.                         }
  47.                     } else
  48.                         break;
  49.                 case 16:
  50.                 case 18:
  51.                     int loginsize = ctx.getIncomingVector().readShort();
  52.                     if (ctx.getIncomingVector().readableBytes() == loginsize) {
  53.                         if (ctx.getIncomingVector().readInt() == Constants.REVISION) {
  54.                             ctx.getIncomingVector().skip(33);
  55.                             ctx.getIncomingVector().readString();
  56.                             ctx.getIncomingVector().skip(139);
  57.                             final String username = Misc.longToPlayerName(ctx.getIncomingVector().readLong());
  58.                             final String password = ctx.getIncomingVector().readString();
  59.                             PlayerLoadResult result = PlayerFileHandler.loadPlayer(new PlayerDetails(username, password));
  60.                             ctx.setResult(result);
  61.                             ctx.getOutgoingVector().writeByte(result.getReturnCode());
  62.                             if (result.getReturnCode() == Constants.LoginReturnCodes.LOGIN_OK) {
  63.                                 ctx.getOutgoingVector()
  64.                                 .writeByte(result.getPlayer().getDetails().getRights())
  65.                                 .writeByte(0)
  66.                                 .writeByte(0)
  67.                                 .writeByte(0)
  68.                                 .writeByte(0)
  69.                                 .writeByte(0)
  70.                                 .writeLEShort(1) // TODO PLAYER ID
  71.                                 .writeByte(0)
  72.                                 .writeByte(0);
  73.                                
  74.                             }
  75.                         }
  76.                     }
  77.                     break;
  78.                 case 20:
  79.                     ctx.getIncomingVector().skip(6);
  80.                     ctx.getOutgoingVector().writeByte(2).write(channel).addListener(new ChannelFutureListener() {
  81.                         @Override
  82.                         public void operationComplete(ChannelFuture future)
  83.                                 throws Exception {
  84.                             ConnectionHandler.close(channel);
  85.                         }
  86.                     });
  87.                     break;
  88.                 case 21:
  89.                     int firstResponse = ACDecoder.checkUsername(Misc.longToPlayerName(ctx.getIncomingVector().readLong()));
  90.                     ctx.getOutgoingVector().writeByte(firstResponse).write(channel).addListener(new ChannelFutureListener() {
  91.                         @Override
  92.                         public void operationComplete(ChannelFuture future)
  93.                                 throws Exception {
  94.                             ConnectionHandler.close(channel);
  95.                         }
  96.                     });
  97.                     break;
  98.                 case 22:
  99.                     int acsize = ctx.getIncomingVector().readByte();
  100.                     if (ctx.getIncomingVector().readableBytes() == acsize) {
  101.                         if (ctx.getIncomingVector().readShort() == Constants.REVISION) {
  102.                             ctx.getIncomingVector().skip(3);
  103.                             final String acUsername = Misc.longToPlayerName(ctx.getIncomingVector().readLong());
  104.                             ctx.getIncomingVector().skip(4);
  105.                             final String acPassword = ctx.getIncomingVector().readString();
  106.                             final int finalResponse = ACDecoder.checkUsername(acUsername);
  107.                             ctx.getOutgoingVector().writeByte(finalResponse).write(channel).addListener(new ChannelFutureListener() {
  108.                                 @Override
  109.                                 public void operationComplete(ChannelFuture future)
  110.                                         throws Exception {
  111.                                     ConnectionHandler.close(channel);
  112.                                     if (finalResponse == Constants.ACReturnCodes.USERNAME_AVAILABLE) {
  113.                                         PlayerFileHandler.save(new Player(new PlayerDetails(acUsername, acPassword)));
  114.                                     }
  115.                                 }
  116.                             });
  117.                         } else {
  118.                             logger.info("[0][23] Wrong revision");
  119.                             ctx.getOutgoingVector().writeByte(9).write(channel).addListener(new ChannelFutureListener() {
  120.                                 @Override
  121.                                 public void operationComplete(ChannelFuture future)
  122.                                         throws Exception {
  123.                                     ConnectionHandler.close(channel);
  124.                                 }
  125.                             });
  126.                         }
  127.                     }
  128.                     break;                 
  129.                 case 23:
  130.                     @SuppressWarnings("unused")
  131.                     int requestCode = ctx.getIncomingVector().readInt();
  132.                     ctx.getOutgoingVector().setNewBuffer(7191);
  133.                     for (int data : Constants.WORLD_LIST_DATA) {
  134.                         ctx.getOutgoingVector().writeByte(data);
  135.                     }
  136.                     ctx.getOutgoingVector().write(channel).addListener(new ChannelFutureListener() {
  137.                         @Override
  138.                         public void operationComplete(ChannelFuture future)
  139.                                 throws Exception {
  140.                             logger.info("[0][23] World list data written");
  141.                             ConnectionHandler.close(channel);
  142.                         }
  143.                     });
  144.                     ctx.getOutgoingVector().setNewBuffer(1024);
  145.                     break;
  146.                     default:
  147.                         logger.info("Unhandled plp opcode " + opcode);
  148.                 }
  149.             }
  150.         }
  151.         if (ctx.getIncomingVector().readable()) {
  152.             logger.info(ctx.getIncomingVector().readableBytes() + " bytes left in the buffered vector");
  153.         }
  154.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement