diff --git a/protocol-new/src/main/java/mc/protocol/codec/ProtocolDecoder.java b/protocol-new/src/main/java/mc/protocol/codec/ProtocolDecoder.java new file mode 100644 index 0000000..e02b60d --- /dev/null +++ b/protocol-new/src/main/java/mc/protocol/codec/ProtocolDecoder.java @@ -0,0 +1,44 @@ +package mc.protocol.codec; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import lombok.extern.slf4j.Slf4j; +import mc.protocol.NettyAttributes; +import mc.protocol.State; +import mc.protocol.io.NetByteBuf; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.pool.PacketObjectPool; + +import java.util.List; + +@Slf4j +public class ProtocolDecoder extends ByteToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { + State state = ctx.channel().attr(NettyAttributes.STATE).get(); + NetByteBuf netByteBuf = new NetByteBuf(in); + + int packetId = netByteBuf.readVarInt(); + Class packetClass = state.getClientSidePacketById(packetId); + if (packetClass == null) { + log.warn("Unknown packet: State {} ; Id 0x{}", state, packetIdAsHexcode(packetId)); + netByteBuf.skipBytes(netByteBuf.readableBytes()); + } else { + ClientSidePacket packet = PacketObjectPool.getInstance().getPool(packetClass).borrowObject(); + packet.readSelf(netByteBuf); + if (log.isDebugEnabled()) { + log.debug("IN: {}:{}", state, packet); + } + out.add(packet); + } + } + + private static String packetIdAsHexcode(int packetId) { + String hexPacketId = Integer.toHexString(packetId).toUpperCase(); + if (hexPacketId.length() == 1) hexPacketId = "0" + hexPacketId; + + return hexPacketId; + } +} diff --git a/protocol-new/src/main/java/mc/protocol/pool/PacketObjectPool.java b/protocol-new/src/main/java/mc/protocol/pool/PacketObjectPool.java new file mode 100644 index 0000000..e012587 --- /dev/null +++ b/protocol-new/src/main/java/mc/protocol/pool/PacketObjectPool.java @@ -0,0 +1,14 @@ +package mc.protocol.pool; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import mc.protocol.packets.ClientSidePacket; +import mc.utils.pool.WideClassObjectPool; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class PacketObjectPool extends WideClassObjectPool { + + @Getter + private static final PacketObjectPool instance = new PacketObjectPool(); +} diff --git a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java deleted file mode 100644 index 5f4f7b8..0000000 --- a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java +++ /dev/null @@ -1,95 +0,0 @@ -package mc.protocol.io.codec; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import mc.protocol.NettyConnectionContext; -import mc.protocol.NetworkAttributes; -import mc.protocol.State; -import mc.protocol.api.ConnectionContext; -import mc.protocol.io.NetByteBuf; -import mc.protocol.packets.ClientSidePacket; -import mc.protocol.packets.UnknownPacket; -import mc.protocol.pool.PacketPool; -import org.apache.commons.pool2.ObjectPool; - -import javax.annotation.Nonnull; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; - -@RequiredArgsConstructor -@Slf4j -public class ProtocolDecoder extends ByteToMessageDecoder { - - private final boolean readUnknownPackets; - private final ObjectPool poolNettyConnectionContext; - private final PacketPool poolPackets; - - @Setter - private Consumer consumerNewConnection; - @Setter - private Consumer consumerDisconnect; - - @Override - public void channelActive(@Nonnull ChannelHandlerContext ctx) throws Exception { - ctx.channel().attr(NetworkAttributes.CUSTOM_PROPERTIES).set(new HashMap<>()); - - NettyConnectionContext context = poolNettyConnectionContext.borrowObject().setCtx(ctx); - consumerNewConnection.accept(context); - - poolNettyConnectionContext.returnObject(context); - super.channelActive(ctx); - } - - @Override - public void channelInactive(@Nonnull ChannelHandlerContext ctx) throws Exception { - NettyConnectionContext context = poolNettyConnectionContext.borrowObject().setCtx(ctx); - consumerDisconnect.accept(context); - - ctx.channel().attr(NetworkAttributes.CUSTOM_PROPERTIES).get().clear(); - ctx.channel().attr(NetworkAttributes.CUSTOM_PROPERTIES).set(null); - - poolNettyConnectionContext.returnObject(context); - super.channelInactive(ctx); - } - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - State state = Objects.requireNonNull(ctx.channel().attr(NetworkAttributes.STATE).get()); - NetByteBuf netByteBuf = new NetByteBuf(in); - - int packetId = netByteBuf.readVarInt(); - Class packetClass = state.getClientSidePacketById(packetId); - if (packetClass == null) { - log.warn("Unknown packet: State {} ; Id 0x{}", state, packetIdAsHexcode(packetId)); - - if (readUnknownPackets) { - UnknownPacket unknownPacket = poolPackets.borrowObject(UnknownPacket.class); - unknownPacket.setState(state); - unknownPacket.setId(packetId); - unknownPacket.setDataSize(netByteBuf.readableBytes()); - unknownPacket.readSelf(netByteBuf); - out.add(unknownPacket); - } else { - netByteBuf.skipBytes(netByteBuf.readableBytes()); - } - } else { - ClientSidePacket packet = poolPackets.borrowObject(packetClass); - packet.readSelf(netByteBuf); - log.debug("IN: {}:{}", state, packet); - out.add(packet); - } - } - - private String packetIdAsHexcode(int packetId) { - String hexPacketId = Integer.toHexString(packetId).toUpperCase(); - if (hexPacketId.length() == 1) hexPacketId = "0" + hexPacketId; - - return hexPacketId; - } -} diff --git a/protocol/src/main/java/mc/protocol/pool/PacketFactory.java b/protocol/src/main/java/mc/protocol/pool/PacketFactory.java deleted file mode 100644 index f0caf1a..0000000 --- a/protocol/src/main/java/mc/protocol/pool/PacketFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -package mc.protocol.pool; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import mc.protocol.packets.ClientSidePacket; -import org.apache.commons.pool2.BasePooledObjectFactory; -import org.apache.commons.pool2.PooledObject; -import org.apache.commons.pool2.impl.DefaultPooledObject; - -@Slf4j -@RequiredArgsConstructor -public class PacketFactory

extends BasePooledObjectFactory

{ - - private final Class

clazz; - - @Override - public P create() throws Exception { - return clazz.getDeclaredConstructor().newInstance(); - } - - @Override - public PooledObject

wrap(P packet) { - return new DefaultPooledObject<>(packet); - } - - @Override - public void passivateObject(PooledObject

pooledPacket) { - pooledPacket.getObject().passivate(); - } -} diff --git a/protocol/src/main/java/mc/protocol/pool/PacketPool.java b/protocol/src/main/java/mc/protocol/pool/PacketPool.java deleted file mode 100644 index 932fec1..0000000 --- a/protocol/src/main/java/mc/protocol/pool/PacketPool.java +++ /dev/null @@ -1,26 +0,0 @@ -package mc.protocol.pool; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import mc.protocol.packets.ClientSidePacket; -import org.apache.commons.pool2.ObjectPool; - -import java.util.Map; - -@Slf4j -@RequiredArgsConstructor -public class PacketPool { - - @SuppressWarnings("rawtypes") - private final Map, ObjectPool> mapPoolPackets; - - @SuppressWarnings("unchecked") - public

P borrowObject(Class

packetClass) throws Exception { - return (P) mapPoolPackets.get(packetClass).borrowObject(); - } - - @SuppressWarnings("unchecked") - public

void returnObject(P packet) throws Exception { - mapPoolPackets.get(packet.getClass()).returnObject(packet); - } -} diff --git a/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java b/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java index 1b61f91..2b7cfcc 100644 --- a/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java +++ b/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java @@ -8,17 +8,17 @@ import java.util.HashMap; import java.util.Map; @SuppressWarnings({ "rawtypes", "unchecked" }) -public class WideClassObjectPool { +public abstract class WideClassObjectPool { private final Map mapPool = new HashMap<>(); @SuppressWarnings("unused") - public ObjectPool getPool(Class clazz) { + public ObjectPool getPool(Class clazz) { return mapPool.computeIfAbsent(clazz, tClass -> new GenericObjectPool(new WideClassFactory(clazz))); } @RequiredArgsConstructor - private static class WideClassFactory extends PassivablePooledObjectFactory { + private class WideClassFactory extends PassivablePooledObjectFactory { private final Class clazz;