From af5bb351e8a99344321ec2c0ebb0fd9dcffb35d6 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 23 Jul 2023 17:35:05 -0500 Subject: [PATCH] Add a config to disable multiverse networking --- .../distanthorizons/core/config/Config.java | 11 ++++ .../core/network/NetworkClient.java | 2 + .../core/world/DhClientWorld.java | 55 ++++++++++++++----- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java index 5f247c80c..ee36c6e8f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java @@ -736,6 +736,17 @@ public class Config + "") .build(); + public static ConfigEntry enableMultiverseNetworking = new ConfigEntry.Builder() + .set(true) + .comment("" + + "If true Distant Horizons will attempt to communicate with the connected \n" + + "server in order to improve multiverse support. \n" + + "If you experience network issues when attempting to join a server, disable this option. \n" + + "\n" + + "Note: this requires setup on the server in order to function. \n" + + "") + .build(); + } public static class MultiThreading diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/NetworkClient.java b/core/src/main/java/com/seibel/distanthorizons/core/network/NetworkClient.java index f9b4b9dbc..e2ccb098e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/NetworkClient.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/NetworkClient.java @@ -85,6 +85,8 @@ public class NetworkClient extends NetworkEventSource implements AutoCloseable LOGGER.info("Connecting to server: "+this.address); this.connectionState = EConnectionState.OPEN; + // FIXME sometimes this causes the MC connection to crash + // this might happen if the URL can't be converted to a IP (IE UnknownHostException) ChannelFuture connectFuture = this.clientBootstrap.connect(this.address); connectFuture.addListener((ChannelFuture channelFuture) -> { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/world/DhClientWorld.java b/core/src/main/java/com/seibel/distanthorizons/core/world/DhClientWorld.java index 6a159bfd4..601da7877 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/world/DhClientWorld.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/world/DhClientWorld.java @@ -1,5 +1,6 @@ package com.seibel.distanthorizons.core.world; +import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.file.structure.ClientOnlySaveStructure; import com.seibel.distanthorizons.core.level.IDhLevel; @@ -32,9 +33,13 @@ public class DhClientWorld extends AbstractDhWorld implements IDhClientWorld // TODO why does this executor have 2 threads? public ExecutorService dhTickerThread = ThreadUtil.makeSingleThreadPool("DH Client World Ticker Thread", 2); public EventLoop eventLoop = new EventLoop(this.dhTickerThread, this::_clientTick); - - - + + + + //==============// + // constructors // + //==============// + public DhClientWorld() { super(EWorldEnvironment.Client_Only); @@ -42,32 +47,50 @@ public class DhClientWorld extends AbstractDhWorld implements IDhClientWorld this.saveStructure = new ClientOnlySaveStructure(); this.levels = new ConcurrentHashMap<>(); - // TODO server specific configs - this.networkClient = new NetworkClient(MC_CLIENT.getCurrentServerIp(), 25049); - registerNetworkHandlers(); + if (Config.Client.Advanced.Multiplayer.enableMultiverseNetworking.get()) + { + // TODO server specific configs + this.networkClient = new NetworkClient(MC_CLIENT.getCurrentServerIp(), 25049); + this.registerNetworkHandlers(); + } + else + { + this.networkClient = null; + } LOGGER.info("Started DhWorld of type "+this.environment); } - private void registerNetworkHandlers() { - networkClient.registerHandler(HelloMessage.class, (msg, ctx) -> { + private void registerNetworkHandlers() + { + this.networkClient.registerHandler(HelloMessage.class, (msg, ctx) -> + { ctx.writeAndFlush(new PlayerUUIDMessage(MC_CLIENT.getPlayerUUID())); }); // TODO Proper payload handling - networkClient.registerAckHandler(PlayerUUIDMessage.class, ctx -> { + this.networkClient.registerAckHandler(PlayerUUIDMessage.class, ctx -> + { ctx.writeAndFlush(new RemotePlayerConfigMessage(new RemotePlayer.Payload())); }); - networkClient.registerHandler(RemotePlayerConfigMessage.class, (msg, ctx) -> { + this.networkClient.registerHandler(RemotePlayerConfigMessage.class, (msg, ctx) -> + { }); - - networkClient.registerAckHandler(RemotePlayerConfigMessage.class, ctx -> { + + this.networkClient.registerAckHandler(RemotePlayerConfigMessage.class, ctx -> + { // TODO Actually request chunks ctx.writeAndFlush(new RequestChunksMessage()); }); } - + + + + //=========// + // methods // + //=========// + @Override public DhClientLevel getOrLoadLevel(ILevelWrapper wrapper) { @@ -134,7 +157,11 @@ public class DhClientWorld extends AbstractDhWorld implements IDhClientWorld @Override public void close() { - this.networkClient.close(); + if (this.networkClient != null) + { + this.networkClient.close(); + } + this.saveAndFlush(); for (DhClientLevel dhClientLevel : this.levels.values())