Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
468
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.36 KB | None | 0 0
  1. package org.redrune.network.world.codec.io;
  2.  
  3. import io.netty.buffer.ByteBuf;
  4. import io.netty.buffer.Unpooled;
  5. import io.netty.channel.ChannelHandlerContext;
  6. import io.netty.handler.codec.ByteToMessageDecoder;
  7. import org.redrune.cache.crypto.ISAACCipher;
  8. import org.redrune.network.NetworkConstants;
  9. import org.redrune.network.NetworkSession;
  10. import org.redrune.network.world.WorldSession;
  11. import org.redrune.network.world.packet.Packet;
  12. import org.redrune.network.world.packet.Packet.PacketType;
  13. import org.redrune.utility.rs.NetworkUtils;
  14.  
  15. import java.util.List;
  16.  
  17. /**
  18.  * Decodes a received packet.
  19.  *
  20.  * @author Tyluur <itstyluur@gmail.com>
  21.  * @author Emperor
  22.  * @since 7/19/17
  23.  */
  24. public class RSPacketDecoder extends ByteToMessageDecoder {
  25.    
  26.     /**
  27.      * Constructs a new {@code RS2GameDecoder} {@code Object}.
  28.      *
  29.      * @param session
  30.      *      The networkSession.
  31.      */
  32.     public RSPacketDecoder(NetworkSession session) {
  33.         session.getChannel().attr(NetworkConstants.SESSION_KEY).setIfAbsent(session);
  34.     }
  35.    
  36.     @Override
  37.     protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
  38.         while (in.readableBytes() > 0 && session.getChannel().isActive()) {
  39.             // the session
  40.             WorldSession session = (WorldSession) ctx.channel().attr(NetworkConstants.SESSION_KEY).get();
  41.            
  42.             // the cipher
  43.             final ISAACCipher cipher = session.getInCipher();
  44.            
  45.             // the opcode of the packet
  46.             int opcode = (in.readByte() - cipher.take()) & 0xFF;
  47.            
  48.             if (opcode < 0 || opcode >= NetworkUtils.PACKET_SIZES.length) {
  49.                 System.err.println("packet_opcode [" + opcode + "] out of bounds");
  50.                 in.discardReadBytes();
  51.                 return;
  52.             }
  53.             int length = NetworkUtils.PACKET_SIZES[opcode];
  54.             System.err.println("received_packet [opcode=" + opcode + ", length=" + length + "]");
  55.             switch (length) {
  56.                 case -1:
  57.                     length = in.readByte() & 0xFF;
  58.                     break;
  59.                 case -2:
  60.                     length = in.readShort() & 0xFFFF;
  61.                     break;
  62.                 case -3:
  63.                     length = in.readInt();
  64.                     break;
  65.                 case -4:
  66.                     length = in.readableBytes();
  67.                     System.err.println("unknown_packet_size [opcode=" + opcode + ", length=" + length + ", guessedLength=" + in.readableBytes() + "]");
  68.                     break;
  69.             }
  70.             byte[] payload = new byte[length];
  71.             in.readBytes(payload);
  72.             out.add(new Packet(opcode, PacketType.STANDARD, Unpooled.wrappedBuffer(payload)));
  73.         }
  74.     }
  75.    
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement