Merge pull request #123 from lare96/master

This commit is contained in:
Gary Tierney
2016-01-21 11:13:04 +00:00
2 changed files with 15 additions and 30 deletions
@@ -1,21 +1,17 @@
package org.apollo.net.codec.game; package org.apollo.net.codec.game;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder; import io.netty.handler.codec.MessageToByteEncoder;
import java.util.List;
import org.apollo.net.meta.PacketType; import org.apollo.net.meta.PacketType;
import org.apollo.util.security.IsaacRandom; import org.apollo.util.security.IsaacRandom;
/** /**
* A {@link MessageToMessageEncoder} which encodes in-game packets. * A {@link MessageToByteEncoder} which encodes in-game packets.
* *
* @author Graham * @author Graham
*/ */
public final class GamePacketEncoder extends MessageToMessageEncoder<GamePacket> { public final class GamePacketEncoder extends MessageToByteEncoder<GamePacket> {
/** /**
* The random number generator. * The random number generator.
@@ -32,32 +28,26 @@ public final class GamePacketEncoder extends MessageToMessageEncoder<GamePacket>
} }
@Override @Override
protected void encode(ChannelHandlerContext ctx, GamePacket packet, List<Object> out) throws Exception { protected void encode(ChannelHandlerContext ctx, GamePacket packet, ByteBuf out) throws Exception {
PacketType type = packet.getType(); PacketType type = packet.getType();
int headerLength = 1;
int payloadLength = packet.getLength(); int payloadLength = packet.getLength();
if (type == PacketType.VARIABLE_BYTE) { if (type == PacketType.VARIABLE_BYTE) {
headerLength++;
if (payloadLength >= 256) { if (payloadLength >= 256) {
throw new Exception("Payload too long for variable byte packet."); throw new Exception("Payload too long for variable byte packet.");
} }
} else if (type == PacketType.VARIABLE_SHORT) { } else if (type == PacketType.VARIABLE_SHORT) {
headerLength += 2;
if (payloadLength >= 65_536) { if (payloadLength >= 65_536) {
throw new Exception("Payload too long for variable short packet."); throw new Exception("Payload too long for variable short packet.");
} }
} }
ByteBuf buffer = Unpooled.buffer(headerLength + payloadLength); out.writeByte(packet.getOpcode() + random.nextInt() & 0xFF);
buffer.writeByte(packet.getOpcode() + random.nextInt() & 0xFF);
if (type == PacketType.VARIABLE_BYTE) { if (type == PacketType.VARIABLE_BYTE) {
buffer.writeByte(payloadLength); out.writeByte(payloadLength);
} else if (type == PacketType.VARIABLE_SHORT) { } else if (type == PacketType.VARIABLE_SHORT) {
buffer.writeShort(payloadLength); out.writeShort(payloadLength);
} }
buffer.writeBytes(packet.getPayload()); out.writeBytes(packet.getPayload());
out.add(buffer);
} }
} }
@@ -2,16 +2,14 @@ package org.apollo.net.codec.login;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder; import io.netty.handler.codec.MessageToByteEncoder;
import java.util.List;
/** /**
* A {@link MessageToMessageEncoder} which encodes login response messages. * A {@link MessageToByteEncoder} which encodes login response messages.
* *
* @author Graham * @author Graham
*/ */
public final class LoginEncoder extends MessageToMessageEncoder<LoginResponse> { public final class LoginEncoder extends MessageToByteEncoder<LoginResponse> {
/** /**
* Creates the login encoder. * Creates the login encoder.
@@ -21,16 +19,13 @@ public final class LoginEncoder extends MessageToMessageEncoder<LoginResponse> {
} }
@Override @Override
protected void encode(ChannelHandlerContext ctx, LoginResponse response, List<Object> out) { protected void encode(ChannelHandlerContext ctx, LoginResponse response, ByteBuf out) {
ByteBuf buffer = ctx.alloc().buffer(3); out.writeByte(response.getStatus());
buffer.writeByte(response.getStatus());
if (response.getStatus() == LoginConstants.STATUS_OK) { if (response.getStatus() == LoginConstants.STATUS_OK) {
buffer.writeByte(response.getRights()); out.writeByte(response.getRights());
buffer.writeByte(response.isFlagged() ? 1 : 0); out.writeByte(response.isFlagged() ? 1 : 0);
} }
out.add(buffer);
} }
} }