diff --git a/build.gradle b/build.gradle index 03e379fcf..8c8e47f19 100644 --- a/build.gradle +++ b/build.gradle @@ -203,7 +203,9 @@ subprojects { p -> // SVG shadowMe("com.formdev:svgSalamander:${rootProject.svgSalamander_version}") shadowMe("com.formdev:flatlaf-extras:${rootProject.flatlaf_version}") - + + // Netty + shadowMe("io.netty:netty-all:4.1.94.Final") // Remember, for lwjgl dependancies that arent included in Minecraft, you need to also need to add it to the ShadowJar thing shadowMe("org.lwjgl:lwjgl-jawt:3.2.2") { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java index 4ba98ce9f..a3d513e41 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java @@ -20,9 +20,9 @@ package com.seibel.distanthorizons.common.wrappers; import com.seibel.distanthorizons.common.wrappers.gui.LangWrapper; -import com.seibel.distanthorizons.common.wrappers.level.EnhancedServerManager; +import com.seibel.distanthorizons.common.wrappers.level.KeyedClientLevelManager; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper; -import com.seibel.distanthorizons.core.level.IEnhancedServerManager; +import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager; import com.seibel.distanthorizons.core.wrapperInterfaces.config.ILangWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; @@ -51,7 +51,7 @@ public class DependencySetup { SingletonInjector.INSTANCE.bind(ILangWrapper.class, LangWrapper.INSTANCE); SingletonInjector.INSTANCE.bind(IVersionConstants.class, VersionConstants.INSTANCE); SingletonInjector.INSTANCE.bind(IWrapperFactory.class, WrapperFactory.INSTANCE); - SingletonInjector.INSTANCE.bind(IEnhancedServerManager.class, EnhancedServerManager.INSTANCE); + SingletonInjector.INSTANCE.bind(IKeyedClientLevelManager.class, KeyedClientLevelManager.INSTANCE); DependencySetupDoneCheck.isDone = true; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/EnhancedServerManager.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/EnhancedServerManager.java deleted file mode 100644 index 374fbfc0d..000000000 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/EnhancedServerManager.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.seibel.distanthorizons.common.wrappers.level; - -import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; -import com.seibel.distanthorizons.core.level.IServerEnhancedClientLevel; -import com.seibel.distanthorizons.core.level.IEnhancedServerManager; -import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; -import net.minecraft.client.multiplayer.ClientLevel; - -import java.util.Objects; - -public class EnhancedServerManager implements IEnhancedServerManager { - - public static EnhancedServerManager INSTANCE = new EnhancedServerManager(); - - @Override - public void registerServerEnhancedLevel(IServerEnhancedClientLevel clientLevel) { - ClientLevelWrapper.setWrappedLevel(clientLevel); - } - - - - @Override - public IServerEnhancedClientLevel getServerEnhancedLevel(ILevelWrapper level, String worldKey) { - Objects.requireNonNull(level); - Objects.requireNonNull(worldKey); - return new ServerEnhancedClientLevel((ClientLevel) level.getWrappedMcObject(), worldKey); - } - - @Override - public void setUseOverrideWrapper(boolean useOverrideWrapper) { - ClientLevelWrapper.setUseOverrideWrapper(useOverrideWrapper); - } -} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/KeyedClientLevelManager.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/KeyedClientLevelManager.java new file mode 100644 index 000000000..b0de02033 --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/KeyedClientLevelManager.java @@ -0,0 +1,54 @@ +package com.seibel.distanthorizons.common.wrappers.level; + +import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; +import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel; +import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import net.minecraft.client.multiplayer.ClientLevel; + +import java.util.Objects; + +public class KeyedClientLevelManager implements IKeyedClientLevelManager +{ + public static final KeyedClientLevelManager INSTANCE = new KeyedClientLevelManager(); + + /** This is set and managed by the ClientApi for servers with support for DH. */ + private IServerKeyedClientLevel overrideWrapper = null; + private boolean useOverrideWrapper = false; + + + //=============// + // constructor // + //=============// + + private KeyedClientLevelManager() { } + + + + //======================// + // level override logic // + //======================// + + @Override + public void setServerKeyedLevel(IServerKeyedClientLevel clientLevel) { this.overrideWrapper = clientLevel; } + @Override + public IServerKeyedClientLevel getOverrideWrapper() { return this.overrideWrapper; } + + @Override + public IServerKeyedClientLevel getServerKeyedLevel(ILevelWrapper level, String serverLevelKey) + { + Objects.requireNonNull(level); + Objects.requireNonNull(serverLevelKey); + return new ServerKeyedClientLevel((ClientLevel) level.getWrappedMcObject(), serverLevelKey); + } + + + @Override + public void setUseOverrideWrapper(boolean useOverrideWrapper) { this.useOverrideWrapper = useOverrideWrapper; } + @Override + public boolean getUseOverrideWrapper() { return this.useOverrideWrapper; } + + + +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/ServerEnhancedClientLevel.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/ServerEnhancedClientLevel.java deleted file mode 100644 index 024e0603d..000000000 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/ServerEnhancedClientLevel.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.seibel.distanthorizons.common.wrappers.level; - -import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; -import com.seibel.distanthorizons.core.level.IServerEnhancedClientLevel; -import net.minecraft.client.multiplayer.ClientLevel; - -public class ServerEnhancedClientLevel extends ClientLevelWrapper implements IServerEnhancedClientLevel { - - private final String serverKey; - - public ServerEnhancedClientLevel(ClientLevel level, String serverKey) { - super(level); - this.serverKey = serverKey; - } - - @Override - public String getServerWorldKey() { - return this.serverKey; - } -} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/ServerKeyedClientLevel.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/ServerKeyedClientLevel.java new file mode 100644 index 000000000..86048c145 --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/ServerKeyedClientLevel.java @@ -0,0 +1,21 @@ +package com.seibel.distanthorizons.common.wrappers.level; + +import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; +import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel; +import net.minecraft.client.multiplayer.ClientLevel; + +public class ServerKeyedClientLevel extends ClientLevelWrapper implements IServerKeyedClientLevel +{ + /** A unique identifier (generally the level's name) for differentiating multiverse levels */ + private final String serverLevelKey; + + public ServerKeyedClientLevel(ClientLevel level, String serverLevelKey) + { + super(level); + this.serverLevelKey = serverLevelKey; + } + + @Override + public String getServerLevelKey() { return this.serverLevelKey; } + +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/FriendlyByteBufWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/FriendlyByteBufWrapper.java deleted file mode 100644 index e9a9a7623..000000000 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/FriendlyByteBufWrapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.seibel.distanthorizons.common.wrappers.minecraft; - -import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IFriendlyByteBuf; -import net.minecraft.network.FriendlyByteBuf; - -import java.nio.charset.Charset; - -public class FriendlyByteBufWrapper implements IFriendlyByteBuf -{ - private final FriendlyByteBuf buf; - - public FriendlyByteBufWrapper(FriendlyByteBuf buf) { - this.buf = buf; - } - - @Override - public short readShort() - { - return buf.readShort(); - } - - public CharSequence readCharSequence(int length, Charset charset) - { - return buf.readCharSequence(length, charset); - } -} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java index 6b07425c5..bc9aa7930 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java @@ -180,7 +180,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra return null; } - return ClientLevelWrapper.getOriginalWrapper(mc.level); + return ClientLevelWrapper.getWrapperIgnoringOverride(this.mc.level); } /** Please move over to getInstallationDirectory() */ @@ -263,7 +263,6 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra } @Override - public void execute(Runnable runnable) { - mc.execute(runnable); - } + public void executeOnRenderThread(Runnable runnable) { this.mc.execute(runnable); } + } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java index 4eca3012f..53158f0cd 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java @@ -8,6 +8,8 @@ import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; import com.seibel.distanthorizons.common.wrappers.block.cache.ClientBlockDetailMap; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; @@ -28,59 +30,48 @@ import org.jetbrains.annotations.Nullable; import java.util.concurrent.ConcurrentHashMap; -/** - * - * @version 2023-6-3 - */ public class ClientLevelWrapper implements IClientLevelWrapper { private static final Logger LOGGER = DhLoggerBuilder.getLogger(ClientLevelWrapper.class.getSimpleName()); - private static final ConcurrentHashMap - levelWrapperMap = new ConcurrentHashMap<>(); - - /** - * This is set and managed by the ClientApi for servers with support for DH. - */ - private static IClientLevelWrapper overrideWrapper = null; - private static boolean useOverrideWrapper = false; - - public static void setWrappedLevel(IClientLevelWrapper wrapper) { - overrideWrapper = wrapper; - } - - public static void setUseOverrideWrapper(boolean useOverrideWrapper) { - ClientLevelWrapper.useOverrideWrapper = useOverrideWrapper; - } - - public static IClientLevelWrapper getWrapper(ClientLevel level) { - if(useOverrideWrapper) { - return overrideWrapper; - } - return getOriginalWrapper(level); - } - - /** - * Gets the original level wrapper, regardless of whether or not the server is overriding the - * level wrapper. - * @param level - * @return - */ - public static IClientLevelWrapper getOriginalWrapper(ClientLevel level) { - return levelWrapperMap.computeIfAbsent(level, ClientLevelWrapper::new); - } - public static void closeWrapper(ClientLevel level) - { - levelWrapperMap.remove(level); - } - - protected ClientLevelWrapper(ClientLevel level) { - this.level = level; - } - - - final ClientLevel level; - ClientBlockDetailMap blockMap = new ClientBlockDetailMap(this); - @Nullable + private static final ConcurrentHashMap LEVEL_WRAPPER_BY_CLIENT_LEVEL = new ConcurrentHashMap<>(); + private static final IKeyedClientLevelManager KEYED_CLIENT_LEVEL_MANAGER = SingletonInjector.INSTANCE.get(IKeyedClientLevelManager.class); + + private final ClientLevel level; + private final ClientBlockDetailMap blockMap = new ClientBlockDetailMap(this); + + + + //=============// + // constructor // + //=============// + + protected ClientLevelWrapper(ClientLevel level) { this.level = level; } + + + + //===============// + // wrapper logic // + //===============// + + public static IClientLevelWrapper getWrapper(ClientLevel level) + { + // used if the client is connected to a server that defines the currently loaded level + if (KEYED_CLIENT_LEVEL_MANAGER.getUseOverrideWrapper()) + { + return KEYED_CLIENT_LEVEL_MANAGER.getOverrideWrapper(); + } + + return getWrapperIgnoringOverride(level); + } + public static IClientLevelWrapper getWrapperIgnoringOverride(ClientLevel level) + { + return LEVEL_WRAPPER_BY_CLIENT_LEVEL.computeIfAbsent(level, ClientLevelWrapper::new); + } + + public static void closeLevel(ClientLevel level) { LEVEL_WRAPPER_BY_CLIENT_LEVEL.remove(level); } + + + @Nullable @Override public IServerLevelWrapper tryGetServerSideWrapper() { @@ -118,12 +109,18 @@ public class ClientLevelWrapper implements IClientLevelWrapper } } public static void cleanCheck() { - if (!levelWrapperMap.isEmpty()) { - LOGGER.warn("{} client levels havn't been freed!", levelWrapperMap.size()); - levelWrapperMap.clear(); + if (!LEVEL_WRAPPER_BY_CLIENT_LEVEL.isEmpty()) { + LOGGER.warn("{} client levels havn't been freed!", LEVEL_WRAPPER_BY_CLIENT_LEVEL.size()); + LEVEL_WRAPPER_BY_CLIENT_LEVEL.clear(); } } - + + + + //====================// + // base level methods // + //====================// + @Override public int computeBaseColor(DhBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper blockState) { return blockMap.getColor(((BlockStateWrapper)blockState).blockState, @@ -212,11 +209,14 @@ public class ClientLevelWrapper implements IClientLevelWrapper } @Override - public String toString() { - if(level == null) { - return "Wrapped{null}"; - } - return "Wrapped{" + level.toString() + "@" + getDimensionType().getDimensionName() + "}"; - } + public String toString() + { + if (this.level == null) + { + return "Wrapped{null}"; + } + + return "Wrapped{" + this.level.toString() + "@" + this.getDimensionType().getDimensionName() + "}"; + } } diff --git a/coreSubProjects b/coreSubProjects index 55f39996c..2b0ee29a8 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 55f39996cbd2f0aa4e4b30166e445acff00c77ee +Subproject commit 2b0ee29a8cc0aaa763eb9f8a2c68bc928271502c diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java index 3d92474e1..3bf1cd435 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java @@ -2,7 +2,6 @@ package com.seibel.distanthorizons.fabric; import com.seibel.distanthorizons.common.networking.Networking; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; -import com.seibel.distanthorizons.common.wrappers.minecraft.FriendlyByteBufWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment; @@ -131,11 +130,11 @@ public class FabricServerProxy }); // ServerChunkSaveEvent - Done in MixinChunkMap - ClientPlayNetworking.registerGlobalReceiver(new ResourceLocation("distant_horizons", "world_control"), - (Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) -> - { - ClientApi.INSTANCE.serverMessageReceived(new FriendlyByteBufWrapper(buf)); - }); + ClientPlayNetworking.registerGlobalReceiver(new ResourceLocation("distant_horizons", "world_control"), // TODO move these strings into a constant somewhere + (Minecraft client, ClientPacketListener handler, FriendlyByteBuf byteBuffer, PacketSender responseSender) -> + { + ClientApi.INSTANCE.serverMessageReceived(byteBuffer); + }); } // This just exists here for testing purposes, it'll be removed in the future