diff --git a/src/main/java/mc/core/Packet.java b/src/main/java/mc/core/Packet.java index 11d9a46..2eac348 100644 --- a/src/main/java/mc/core/Packet.java +++ b/src/main/java/mc/core/Packet.java @@ -7,4 +7,7 @@ package mc.core; public interface Packet { int getSize(); int getId(); + + void readSelf(NetStream netStream); + void writeSelf(NetStream netStream); } diff --git a/src/main/java/mc/core/netty/NettyPacket.java b/src/main/java/mc/core/netty/NettyPacket.java deleted file mode 100644 index 73c114f..0000000 --- a/src/main/java/mc/core/netty/NettyPacket.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * DmitriyMX - * 2018-03-25 - */ -package mc.core.netty; - -import io.netty.buffer.ByteBuf; -import mc.core.Packet; - -public interface NettyPacket extends Packet { - void writeSelf(ByteBuf byteBuf); - void fillFromByteBuf(ByteBuf byteBuf); -} diff --git a/src/main/java/mc/core/netty/PacketDecoder.java b/src/main/java/mc/core/netty/PacketDecoder.java index 9e75969..d2b8a4a 100644 --- a/src/main/java/mc/core/netty/PacketDecoder.java +++ b/src/main/java/mc/core/netty/PacketDecoder.java @@ -9,12 +9,13 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ReplayingDecoder; import lombok.extern.slf4j.Slf4j; import mc.core.NetStream; +import mc.core.Packet; import java.util.List; import java.util.Optional; @Slf4j -public class PacketDecoder extends ReplayingDecoder { +public class PacketDecoder extends ReplayingDecoder { @Override protected void decode(ChannelHandlerContext context, ByteBuf byteBuf, List list) throws Exception { NetStream netStream = new WrapperByteBufNetStream(byteBuf); @@ -23,11 +24,11 @@ public class PacketDecoder extends ReplayingDecoder { int id = netStream.readVarInt(); log.debug("PktLEN: {} | PktID: {}", length, id); - Optional> packetClass = context.channel().attr(State.ATTR_STATE).get().getPacketClass(id); + Optional> packetClass = context.channel().attr(State.ATTR_STATE).get().getPacketClass(id); if (packetClass.isPresent()) { - NettyPacket packet = packetClass.get().newInstance(); - packet.fillFromByteBuf(byteBuf); + Packet packet = packetClass.get().newInstance(); + packet.readSelf(netStream); list.add(packet); if (length < packet.getSize()) { log.warn("WTF?! length < packet.getSize() !!"); diff --git a/src/main/java/mc/core/netty/PacketEncoder.java b/src/main/java/mc/core/netty/PacketEncoder.java index d185bf5..9c241c1 100644 --- a/src/main/java/mc/core/netty/PacketEncoder.java +++ b/src/main/java/mc/core/netty/PacketEncoder.java @@ -7,10 +7,11 @@ package mc.core.netty; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; +import mc.core.Packet; -public class PacketEncoder extends MessageToByteEncoder { +public class PacketEncoder extends MessageToByteEncoder { @Override - protected void encode(ChannelHandlerContext context, NettyPacket packet, ByteBuf byteBuf) throws Exception { - packet.writeSelf(byteBuf); + protected void encode(ChannelHandlerContext context, Packet packet, ByteBuf byteBuf) throws Exception { + packet.writeSelf(new WrapperByteBufNetStream(byteBuf)); } } diff --git a/src/main/java/mc/core/netty/PacketHandler.java b/src/main/java/mc/core/netty/PacketHandler.java index 6159d42..226a7e0 100644 --- a/src/main/java/mc/core/netty/PacketHandler.java +++ b/src/main/java/mc/core/netty/PacketHandler.java @@ -7,20 +7,21 @@ package mc.core.netty; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.extern.slf4j.Slf4j; +import mc.core.Packet; import mc.core.netty.packets.HandshakeRequestPacket; import mc.core.netty.packets.HandshakeResponsePacket; import static mc.core.netty.Utils.equalsPacket; @Slf4j -public class PacketHandler extends SimpleChannelInboundHandler { +public class PacketHandler extends SimpleChannelInboundHandler { @Override public void channelActive(ChannelHandlerContext context) throws Exception { context.channel().attr(State.ATTR_STATE).set(State.Handshaking); } @Override - protected void channelRead0(ChannelHandlerContext context, NettyPacket packet) throws Exception { + protected void channelRead0(ChannelHandlerContext context, Packet packet) throws Exception { log.info("Packet: {} | Data: {}", packet.getClass().getSimpleName(), packet.toString()); diff --git a/src/main/java/mc/core/netty/State.java b/src/main/java/mc/core/netty/State.java index e884835..58e7f4f 100644 --- a/src/main/java/mc/core/netty/State.java +++ b/src/main/java/mc/core/netty/State.java @@ -7,6 +7,7 @@ package mc.core.netty; import com.google.common.collect.ImmutableMap; import io.netty.util.AttributeKey; import lombok.Getter; +import mc.core.Packet; import mc.core.netty.packets.HandshakeRequestPacket; import mc.core.netty.packets.PingPacket; @@ -29,14 +30,14 @@ public enum State { @Getter private final int id; - private final Map> requestMap; + private final Map> requestMap; - State(int id, Map> requestMap) { + State(int id, Map> requestMap) { this.id = id; this.requestMap = requestMap; } - public Optional> getPacketClass(int id) { + public Optional> getPacketClass(int id) { return Optional.ofNullable(requestMap.get(id)); } } diff --git a/src/main/java/mc/core/netty/UnknownPacket.java b/src/main/java/mc/core/netty/UnknownPacket.java index aa5c874..1fad041 100644 --- a/src/main/java/mc/core/netty/UnknownPacket.java +++ b/src/main/java/mc/core/netty/UnknownPacket.java @@ -4,30 +4,32 @@ */ package mc.core.netty; -import io.netty.buffer.ByteBuf; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import mc.core.NetStream; import mc.core.NotSupportException; +import mc.core.Packet; @RequiredArgsConstructor @Getter @ToString -class UnknownPacket implements NettyPacket { +class UnknownPacket implements Packet { private final int length; private final int id; - public void writeSelf(ByteBuf byteBuf) { - throw new NotSupportException(); - } - - @Override - public void fillFromByteBuf(ByteBuf byteBuf) { - throw new NotSupportException(); - } - @Override public int getSize() { return length; } + + @Override + public void readSelf(NetStream netStream) { + throw new NotSupportException(); + } + + @Override + public void writeSelf(NetStream netStream) { + throw new NotSupportException(); + } } diff --git a/src/main/java/mc/core/netty/Utils.java b/src/main/java/mc/core/netty/Utils.java index c248151..595a413 100644 --- a/src/main/java/mc/core/netty/Utils.java +++ b/src/main/java/mc/core/netty/Utils.java @@ -5,6 +5,7 @@ package mc.core.netty; import lombok.extern.slf4j.Slf4j; +import mc.core.Packet; @Slf4j public class Utils { @@ -38,7 +39,7 @@ public class Utils { return lengthVarInt(value.length()) + value.length(); } - public static boolean equalsPacket(NettyPacket packet, String name) { + public static boolean equalsPacket(Packet packet, String name) { return packet.getClass().getSimpleName().equals(name); } } diff --git a/src/main/java/mc/core/netty/packets/HandshakeRequestPacket.java b/src/main/java/mc/core/netty/packets/HandshakeRequestPacket.java index a401c19..4bbb774 100644 --- a/src/main/java/mc/core/netty/packets/HandshakeRequestPacket.java +++ b/src/main/java/mc/core/netty/packets/HandshakeRequestPacket.java @@ -4,21 +4,19 @@ */ package mc.core.netty.packets; -import io.netty.buffer.ByteBuf; import lombok.Getter; import lombok.ToString; import mc.core.NetStream; import mc.core.NotSupportException; -import mc.core.netty.NettyPacket; +import mc.core.Packet; import mc.core.netty.State; import mc.core.netty.UnknowState; -import mc.core.netty.WrapperByteBufNetStream; import static mc.core.netty.Utils.*; @Getter @ToString -public class HandshakeRequestPacket implements NettyPacket { +public class HandshakeRequestPacket implements Packet { private static final int id = 0; private int protocolVersion; private String serverAddress; @@ -26,29 +24,6 @@ public class HandshakeRequestPacket implements NettyPacket { private State nextState; private int size; - @Override - public void writeSelf(ByteBuf byteBuf) { - throw new NotSupportException(); - } - - @Override - public void fillFromByteBuf(ByteBuf byteBuf) { - NetStream netStream = new WrapperByteBufNetStream(byteBuf); - - protocolVersion = netStream.readVarInt(); - serverAddress = netStream.readString(); - serverPort = netStream.readUnsignedShort(); - final int nextStateInt = netStream.readVarInt(); - nextState = State.getById(nextStateInt).orElseThrow(() -> new UnknowState(nextStateInt)); - byteBuf.skipBytes(2); //TODO magic - - size = lengthVarInt(id) - + lengthVarInt(protocolVersion) - + lengthString(serverAddress) - + lengthUnsignedShort(serverPort) - + lengthVarInt(nextState.getId()); - } - @Override public int getSize() { return size; @@ -58,4 +33,25 @@ public class HandshakeRequestPacket implements NettyPacket { public int getId() { return id; } + + @Override + public void readSelf(NetStream netStream) { + protocolVersion = netStream.readVarInt(); + serverAddress = netStream.readString(); + serverPort = netStream.readUnsignedShort(); + final int nextStateInt = netStream.readVarInt(); + nextState = State.getById(nextStateInt).orElseThrow(() -> new UnknowState(nextStateInt)); + netStream.skipBytes(2); //TODO magic + + size = lengthVarInt(id) + + lengthVarInt(protocolVersion) + + lengthString(serverAddress) + + lengthUnsignedShort(serverPort) + + lengthVarInt(nextState.getId()); + } + + @Override + public void writeSelf(NetStream netStream) { + throw new NotSupportException(); + } } diff --git a/src/main/java/mc/core/netty/packets/HandshakeResponsePacket.java b/src/main/java/mc/core/netty/packets/HandshakeResponsePacket.java index 3c4074b..da99bdf 100644 --- a/src/main/java/mc/core/netty/packets/HandshakeResponsePacket.java +++ b/src/main/java/mc/core/netty/packets/HandshakeResponsePacket.java @@ -5,15 +5,13 @@ package mc.core.netty.packets; import com.google.gson.JsonObject; -import io.netty.buffer.ByteBuf; import mc.core.NetStream; import mc.core.NotSupportException; -import mc.core.netty.NettyPacket; -import mc.core.netty.WrapperByteBufNetStream; +import mc.core.Packet; import static mc.core.netty.Utils.*; -public class HandshakeResponsePacket implements NettyPacket { +public class HandshakeResponsePacket implements Packet { private static final int id = 0; private static String json; private static int size; @@ -41,20 +39,6 @@ public class HandshakeResponsePacket implements NettyPacket { + lengthString(json); } - @Override - public void writeSelf(ByteBuf byteBuf) { - NetStream netStream = new WrapperByteBufNetStream(byteBuf); - - netStream.writeVarInt(getSize()); - netStream.writeVarInt(getId()); - netStream.writeString(json); - } - - @Override - public void fillFromByteBuf(ByteBuf byteBuf) { - throw new NotSupportException(); - } - @Override public int getSize() { return size; @@ -64,4 +48,16 @@ public class HandshakeResponsePacket implements NettyPacket { public int getId() { return id; } + + @Override + public void readSelf(NetStream netStream) { + throw new NotSupportException(); + } + + @Override + public void writeSelf(NetStream netStream) { + netStream.writeVarInt(getSize()); + netStream.writeVarInt(getId()); + netStream.writeString(json); + } } diff --git a/src/main/java/mc/core/netty/packets/PingPacket.java b/src/main/java/mc/core/netty/packets/PingPacket.java index 2485118..c7642d0 100644 --- a/src/main/java/mc/core/netty/packets/PingPacket.java +++ b/src/main/java/mc/core/netty/packets/PingPacket.java @@ -4,41 +4,18 @@ */ package mc.core.netty.packets; -import io.netty.buffer.ByteBuf; import lombok.ToString; import mc.core.NetStream; -import mc.core.netty.NettyPacket; -import mc.core.netty.WrapperByteBufNetStream; +import mc.core.Packet; import static mc.core.netty.Utils.*; @ToString -public class PingPacket implements NettyPacket { +public class PingPacket implements Packet { private static final int id = 1; private long payload; private int size; - @Override - public void writeSelf(ByteBuf byteBuf) { - NetStream netStream = new WrapperByteBufNetStream(byteBuf); - - long payload = System.currentTimeMillis(); - int size = lengthVarLong(payload); - - netStream.writeVarInt(size); - netStream.writeVarInt(id); - netStream.writeVarLong(payload); - } - - @Override - public void fillFromByteBuf(ByteBuf byteBuf) { - NetStream netStream = new WrapperByteBufNetStream(byteBuf); - - payload = netStream.readVarLong(); - size = lengthVarInt(id) - + lengthVarLong(payload); - } - @Override public int getSize() { return size; @@ -48,4 +25,21 @@ public class PingPacket implements NettyPacket { public int getId() { return id; } + + @Override + public void readSelf(NetStream netStream) { + payload = netStream.readVarLong(); + size = lengthVarInt(id) + + lengthVarLong(payload); + } + + @Override + public void writeSelf(NetStream netStream) { + long payload = System.currentTimeMillis(); + int size = lengthVarLong(payload); + + netStream.writeVarInt(size); + netStream.writeVarInt(id); + netStream.writeVarLong(payload); + } }