{
+
+ @Getter
+ private final ChannelHandlerContext ctx;
+
+ @Getter
+ private final P packet;
+
+ public void setState(State state) {
+ ctx.channel().attr(NetworkAttributes.STATE).set(state);
+ }
+}
diff --git a/protocol/src/main/java/mc/protocol/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java
new file mode 100644
index 0000000..b2f20fc
--- /dev/null
+++ b/protocol/src/main/java/mc/protocol/NettyServer.java
@@ -0,0 +1,43 @@
+package mc.protocol;
+
+import io.netty.bootstrap.ServerBootstrap;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import mc.protocol.di.DaggerProtocolComponent;
+import mc.protocol.di.ProtocolComponent;
+import mc.protocol.packets.Packet;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Sinks;
+
+import java.util.Map;
+
+@SuppressWarnings("rawtypes")
+@Slf4j
+@RequiredArgsConstructor
+public class NettyServer {
+
+ private final ServerBootstrap serverBootstrap;
+ private final Map Flux packetClass) {
+ return observedMap.get(packetClass).asFlux().map(ChannelContext.class::cast);
+ }
+
+ public static NettyServer createServer() {
+ ProtocolComponent component = DaggerProtocolComponent.create();
+ return component.getNettyServer();
+ }
+}
diff --git a/protocol/src/main/java/mc/protocol/NetworkAttributes.java b/protocol/src/main/java/mc/protocol/NetworkAttributes.java
new file mode 100644
index 0000000..0be033c
--- /dev/null
+++ b/protocol/src/main/java/mc/protocol/NetworkAttributes.java
@@ -0,0 +1,10 @@
+package mc.protocol;
+
+import io.netty.util.AttributeKey;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class NetworkAttributes {
+
+ public static final AttributeKey