From cc35e50edc53f619bdc562c4d53a33ef7100e5c0 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Mon, 26 Jun 2023 20:59:25 +0500 Subject: [PATCH] Move everything to core --- .../core/level/DhClientServerLevel.java | 2 +- .../core/level/DhServerLevel.java | 2 +- .../core/level/ServerLevelModule.java | 2 +- .../core/network/LodClient.java | 24 +++++++ .../core/network/LodServer.java | 64 +++++++++++++++++++ .../messageHandling/MessageDecoder.java | 23 +++++++ .../messageHandling/MessageHandler.java | 27 ++++++++ .../messageHandling/MessageHandlerSide.java | 6 ++ .../messageHandling/MessageRegistry.java | 35 ++++++++++ .../core/network/messages/HelloMessage.java | 26 ++++++++ .../core/network/messages/Message.java | 19 ++++++ 11 files changed, 227 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/LodClient.java create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/LodServer.java create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageDecoder.java create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandler.java create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandlerSide.java create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageRegistry.java create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/messages/HelloMessage.java create mode 100644 core/src/main/java/com/seibel/distanthorizons/core/network/messages/Message.java diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java index bc037860f..1d0f7ca5c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java @@ -39,7 +39,7 @@ public class DhClientServerLevel extends DhLevel implements IDhClientLevel, IDhS { LOGGER.warn("unable to create data folder."); } - serverside = new ServerLevelModule(this, serverLevelWrapper, saveStructure); + serverside = new ServerLevelModule(this, serverLevelWrapper, saveStructure, false); clientside = new ClientLevelModule(this); LOGGER.info("Started "+DhClientServerLevel.class.getSimpleName()+" for "+ serverLevelWrapper +" with saves at "+saveStructure); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java index 8434d4c8b..b10c10cfd 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java @@ -25,7 +25,7 @@ public class DhServerLevel extends DhLevel implements IDhServerLevel { LOGGER.warn("unable to create data folder."); } - serverside = new ServerLevelModule(this, serverLevelWrapper, saveStructure); + serverside = new ServerLevelModule(this, serverLevelWrapper, saveStructure, true); LOGGER.info("Started DHLevel for {} with saves at {}", serverLevelWrapper, saveStructure); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java b/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java index 81e5be59c..2bfb94322 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java @@ -64,7 +64,7 @@ public class ServerLevelModule { public final AppliedConfigState worldGeneratorEnabledConfig; private final AtomicReference worldGenStateRef = new AtomicReference<>(); - public ServerLevelModule(IDhServerLevel parent, IServerLevelWrapper levelWrapper, AbstractSaveStructure saveStructure) + public ServerLevelModule(IDhServerLevel parent, IServerLevelWrapper levelWrapper, AbstractSaveStructure saveStructure, boolean startLodServer) { this.parent = parent; this.levelWrapper = levelWrapper; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/LodClient.java b/core/src/main/java/com/seibel/distanthorizons/core/network/LodClient.java new file mode 100644 index 000000000..9bab5d702 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/LodClient.java @@ -0,0 +1,24 @@ +package com.seibel.distanthorizons.core.network; + +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +//import net.minecraft.client.Minecraft; + +public class LodClient { +// public static final LodClient INSTANCE = new LodClient(); +// +// private final Minecraft client; +// private final NetworkHandler networkHandler; +// +// private LodClient() { +// client = Minecraft.getInstance(); +// this.networkHandler = new NetworkHandler(); +// } + + public void connect() { + + } + + public void disconnect() { + + } +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/LodServer.java b/core/src/main/java/com/seibel/distanthorizons/core/network/LodServer.java new file mode 100644 index 000000000..3673a0109 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/LodServer.java @@ -0,0 +1,64 @@ +package com.seibel.distanthorizons.core.network; + +import com.seibel.distanthorizons.core.network.messageHandling.MessageDecoder; +import com.seibel.distanthorizons.core.network.messageHandling.MessageHandler; +import com.seibel.distanthorizons.core.network.messageHandling.MessageHandlerSide; +import com.seibel.distanthorizons.core.network.messageHandling.MessageRegistry; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; + +public class LodServer { + // TODO move to config of some sort + static final int PORT = 25049; + + public LodServer(/* initial settings */) { + + } + + public void start() throws InterruptedException { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.INFO)) + .childHandler(getInitializer()); + + b.bind(PORT).sync().channel().closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } + + public void stop() { + + } + + private ChannelInitializer getInitializer() { + return new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { + ChannelPipeline pipeline = ch.pipeline(); + + MessageRegistry messageRegistry = new MessageRegistry(); + + // Encoding + pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 2, 0, 2)); + pipeline.addLast(new MessageDecoder(messageRegistry)); + // TODO packet encoder + + pipeline.addLast(new MessageHandler(MessageHandlerSide.SERVER)); + } + }; + } +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageDecoder.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageDecoder.java new file mode 100644 index 000000000..0a35f4fc0 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageDecoder.java @@ -0,0 +1,23 @@ +package com.seibel.distanthorizons.core.network.messageHandling; + +import com.seibel.distanthorizons.core.network.messages.Message; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class MessageDecoder extends ByteToMessageDecoder { + private MessageRegistry messageRegistry; + + public MessageDecoder(MessageRegistry messageRegistry) { + this.messageRegistry = messageRegistry; + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) { + Message message = messageRegistry.createMessage(in.readShort()); + message.decode(in); + out.add(message); + } +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandler.java new file mode 100644 index 000000000..20817f27b --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandler.java @@ -0,0 +1,27 @@ +package com.seibel.distanthorizons.core.network.messageHandling; + +import com.seibel.distanthorizons.core.network.messages.Message; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class MessageHandler extends SimpleChannelInboundHandler { + private final MessageHandlerSide side; + + public MessageHandler(MessageHandlerSide side) { + this.side = side; + } + + @Override + public void channelRead0(ChannelHandlerContext ctx, Message msg) { + switch (side) { + case CLIENT: + msg.handle_Client(ctx); + break; + case SERVER: + msg.handle_Server(ctx); + break; + default: + throw new IllegalStateException("Invalid handler side"); + } + } +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandlerSide.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandlerSide.java new file mode 100644 index 000000000..36eb6216c --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageHandlerSide.java @@ -0,0 +1,6 @@ +package com.seibel.distanthorizons.core.network.messageHandling; + +public enum MessageHandlerSide { + CLIENT, + SERVER +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageRegistry.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageRegistry.java new file mode 100644 index 000000000..77b849501 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messageHandling/MessageRegistry.java @@ -0,0 +1,35 @@ +package com.seibel.distanthorizons.core.network.messageHandling; + +import com.seibel.distanthorizons.core.network.messages.HelloMessage; +import com.seibel.distanthorizons.core.network.messages.Message; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public class MessageRegistry { + private final Map> idToConstructor = new HashMap>() {{ + // Note: Make sure IDs are unique + // Also note: Removing IDs will break backwards compatibility + put(1, HelloMessage::new); + }}; + + private final Map, Integer> classToId = idToConstructor.entrySet().stream() + .collect(Collectors.toMap( + e -> e.getValue().getClass(), + Map.Entry::getKey + )); + + public Message createMessage(int id) throws IllegalArgumentException { + try { + return idToConstructor.get(id).get(); + } catch (NullPointerException e) { + throw new IllegalArgumentException("Invalid message ID"); + } + } + + public int getMessageId(Message message) { + return classToId.get(message.getClass()); + } +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/HelloMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/HelloMessage.java new file mode 100644 index 000000000..e96673f95 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/HelloMessage.java @@ -0,0 +1,26 @@ +package com.seibel.distanthorizons.core.network.messages; + +import com.seibel.distanthorizons.coreapi.ModInfo; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; + +// This message is critical to maintain backwards compatibility +// as it's used to receive version BEFORE everything else. +public class HelloMessage extends Message { + public int version = ModInfo.PROTOCOL_VERSION; + + @Override + public void encode(ByteBuf out) { + out.writeInt(version); + } + + @Override + public void decode(ByteBuf in) { + version = in.readInt(); + } + + @Override + public void handle_Server(ChannelHandlerContext ctx) { + // TODO Adjust message handling to client's version + } +} diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/Message.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/Message.java new file mode 100644 index 000000000..6be22c006 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/Message.java @@ -0,0 +1,19 @@ +package com.seibel.distanthorizons.core.network.messages; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; + +public abstract class Message { + public Message() { } + + public abstract void encode(ByteBuf out); + public abstract void decode(ByteBuf in); + + public void handle_Server(ChannelHandlerContext ctx) { + throw new UnsupportedOperationException(); + } + public void handle_Client(ChannelHandlerContext ctx) { + throw new UnsupportedOperationException(); + } +} +