diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 26eda445f..60391ca15 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,6 +10,7 @@ stages:
- build_1_19_4
- build_1_20_1
- build_1_19_2
+ - api
- pages
variables:
@@ -155,6 +156,35 @@ build_1_20_1:
allow_failure: true
+api:
+ stage: api
+ script:
+ # this should only run for the API
+ - ./gradlew api:clean --gradle-user-home cache/;
+ # this also runs unit tests
+ - ./gradlew api:build --gradle-user-home cache/;
+ - ./gradlew api:addSourcesToCompiledJar --gradle-user-home cache/;
+ image: eclipse-temurin:17
+ artifacts:
+ name: "Api_NightlyBuild-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
+ paths:
+ - coreSubProjects/api/build/libs/merged/*.jar
+ # can be uncommented if we don't want a jar with the source code
+ # - coreSubProjects/api/build/libs/*.jar
+ exclude:
+ - coreSubProjects/api/build/libs/merged/*-all.jar
+ - coreSubProjects/api/build/libs/merged/*-sources.jar
+ expire_in: 1 day
+ when: always
+ cache:
+ key: "gradleCache"
+ policy: pull-push
+ paths:
+ - .gradle
+ - cache/
+ allow_failure: true
+
+
# generate and publish API javadocs
pages:
stage: pages
diff --git a/build.gradle b/build.gradle
index ab2b9edec..c2d8b7475 100644
--- a/build.gradle
+++ b/build.gradle
@@ -182,9 +182,6 @@ subprojects { p ->
implementation("org.apache.logging.log4j:log4j-api:${rootProject.log4j_version}")
implementation("org.apache.logging.log4j:log4j-core:${rootProject.log4j_version}")
- // Netty
- implementation("io.netty:netty-all:${rootProject.netty_version}")
-
// JOML
implementation("org.joml:joml:${rootProject.joml_version}")
@@ -207,6 +204,8 @@ subprojects { p ->
shadowMe("com.formdev:svgSalamander:${rootProject.svgSalamander_version}")
shadowMe("com.formdev:flatlaf-extras:${rootProject.flatlaf_version}")
+ // Netty
+ shadowMe("io.netty:netty-all:${rootProject.netty_version}")
// 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/buildAll.bat b/buildAll.bat
index 75578f376..cd0d93415 100644
--- a/buildAll.bat
+++ b/buildAll.bat
@@ -1,23 +1,15 @@
-@echo off
+@echo off & setlocal enabledelayedexpansion
-echo Windows build all script needs to be rewritten
-echo I dont use Windows so I cant really make this
-echo So if someone does use Windows and knows how to script stuff then can you please port the "buildall" script I made for Unix
+@rem Loop trough everything in the version properties folder
+for %%f in (versionProperties\*) do (
+ @rem Get the name of the version that is going to be compiled
+ set version=%%~nf
+ @rem Clean out the folders and build it
+ echo Cleaning workspace to build !version!
+ call .\gradlew.bat clean -PmcVer="!version!" --no-daemon
+ echo Building !version!
+ call .\gradlew.bat build -PmcVer="!version!" --no-daemon
+)
-
-
-@REM Old BAT script if you need some help with this task
-
-@REM SETLOCAL
-@REM CALL :buildVersion "1.18.2"
-@REM CALL :buildVersion "1.19.4"
-@REM CALL :buildVersion "1.20.1"
-@REM EXIT /B %ERRORLEVEL%
-@REM
-@REM :buildVersion
-@REM @echo on
-@REM call ./gradlew.bat clean -PmcVer="%~1" --no-daemon
-@REM call ./gradlew.bat build -PmcVer="%~1" --no-daemon
-@REM @echo off
-@REM EXIT /B 0
+endlocal
diff --git a/common/src/main/java/com/seibel/distanthorizons/common/rendering/SeamlessOverdraw.java b/common/src/main/java/com/seibel/distanthorizons/common/rendering/SeamlessOverdraw.java
new file mode 100644
index 000000000..d55b5bf89
--- /dev/null
+++ b/common/src/main/java/com/seibel/distanthorizons/common/rendering/SeamlessOverdraw.java
@@ -0,0 +1,43 @@
+package com.seibel.distanthorizons.common.rendering;
+
+#if PRE_MC_1_19_4
+import com.mojang.math.Matrix4f;
+#else
+import org.joml.Matrix4f;
+#endif
+import com.seibel.distanthorizons.core.config.Config;
+import com.seibel.distanthorizons.core.util.RenderUtil;
+
+import java.nio.FloatBuffer;
+
+public class SeamlessOverdraw
+{
+ /**
+ * Proof-of-concept experimental option, not intended for normal use.
+ * (Poorly) replaces Minecraft's far clip plane so it lines up with DH's near clip plane.
+ */
+ public static FloatBuffer overwriteMinecraftNearFarClipPlanes(Matrix4f minecraftProjectionMatrix, float previousPartialTicks)
+ {
+ FloatBuffer matrixFloatBuffer = FloatBuffer.allocate(16);
+
+ #if PRE_MC_1_19_4
+ minecraftProjectionMatrix.store(matrixFloatBuffer);
+ #else
+ minecraftProjectionMatrix.get(matrixFloatBuffer);
+ #endif
+
+ float[] matrixFloatArray = matrixFloatBuffer.array();
+
+ float dhFarClipPlane = RenderUtil.getNearClipPlaneDistanceInBlocks(previousPartialTicks);
+ float farClip = dhFarClipPlane * 5.1f; // magic number found via trial and error, James has no idea what it represents, except that it makes the seam between DH and vanilla rendering pretty close
+ float nearClip = 0.5f; // this causes issues with some vanilla rendering, specifically the wireframe around selected blocks is slightly off. Unfortunately the ratio between the near and far clip plane can't be easily modified without completely screwing up the rendering.
+
+ // these may be the wrong index locations in any version of MC other than 1.18.2
+ matrixFloatArray[10] = -((farClip + nearClip) / (farClip - nearClip)); // near clip plane
+ matrixFloatArray[11] = -((2 * farClip * nearClip) / (farClip - nearClip)); // far clip plane
+
+ matrixFloatBuffer = FloatBuffer.wrap(matrixFloatArray);
+ return matrixFloatBuffer;
+ }
+
+}
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 ec01f988b..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,7 +20,9 @@
package com.seibel.distanthorizons.common.wrappers;
import com.seibel.distanthorizons.common.wrappers.gui.LangWrapper;
+import com.seibel.distanthorizons.common.wrappers.level.KeyedClientLevelManager;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper;
+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;
@@ -49,6 +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(IKeyedClientLevelManager.class, KeyedClientLevelManager.INSTANCE);
DependencySetupDoneCheck.isDone = true;
}
diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java
index ea931d8bf..8992217d1 100644
--- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java
+++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java
@@ -94,7 +94,7 @@ public class WrapperFactory implements IWrapperFactory
}
}
- // MC 1.18
+ // MC 1.18, 1.19, 1.20
#if POST_MC_1_17_1
else if (objectArray.length == 2)
{
@@ -123,7 +123,11 @@ public class WrapperFactory implements IWrapperFactory
#else
// Intentional compiler error to bring attention to the missing wrapper function.
// If you need to work on an unimplemented version but don't have the ability to implement this yet
- // you can comment it out, but please don't commit it. Someone will have to implement it
+ // you can comment it out, but please don't commit it. Someone will have to implement it .
+
+ // After implementing the new version please read this method's javadocs for instructions
+ // on what other locations also need to be updated, the DhAPI specifically needs to
+ // be updated to state which objects this method accepts.
not implemented for this version of Minecraft!
#endif
}
@@ -137,7 +141,7 @@ public class WrapperFactory implements IWrapperFactory
"Chunk wrapper creation failed. \n" +
"Expected parameters: \n");
- // MC 1.18
+ // MC 1.18, 1.19, 1.20
#if POST_MC_1_17_1
message.append("["+ChunkAccess.class.getName()+"], \n");
message.append("["+LevelReader.class.getName()+"]. \n");
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/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/MinecraftClientWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java
index a92630b4e..bd7385640 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
@@ -186,7 +186,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
return null;
}
- return ClientLevelWrapper.getWrapper(mc.level);
+ return ClientLevelWrapper.getWrapperIgnoringOverride(this.mc.level);
}
/** Please move over to getInstallationDirectory() */
@@ -267,4 +267,8 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
public File getInstallationDirectory() {
return mc.gameDirectory;
}
+
+ @Override
+ 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 89d05d57c..665bf9d7c 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,30 +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<>();
-
- public static ClientLevelWrapper getWrapper(ClientLevel level) {
- return levelWrapperMap.computeIfAbsent(level, ClientLevelWrapper::new);
- }
- public static void closeWrapper(ClientLevel level)
- {
- levelWrapperMap.remove(level);
- }
-
- private 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()
{
@@ -89,58 +109,46 @@ 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,
- (BiomeWrapper)biome, pos);
- }
-
- @Override
- public IDhApiDimensionTypeWrapper getDimensionType()
+ public int computeBaseColor(DhBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper blockState)
{
- return DimensionTypeWrapper.getDimensionTypeWrapper(level.dimensionType());
+ return this.blockMap.getColor(((BlockStateWrapper)blockState).blockState, (BiomeWrapper)biome, pos);
}
+
+ @Override
+ public IDhApiDimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }
@Override
public EDhApiLevelType getLevelType() { return EDhApiLevelType.CLIENT_LEVEL; }
@Override
- public int getBlockLight(int x, int y, int z)
- {
- return level.getBrightness(LightLayer.BLOCK, new BlockPos(x,y,z));
- }
+ public int getBlockLight(int x, int y, int z) { return this.level.getBrightness(LightLayer.BLOCK, new BlockPos(x,y,z)); }
@Override
- public int getSkyLight(int x, int y, int z)
- {
- return level.getBrightness(LightLayer.SKY, new BlockPos(x,y,z));
- }
+ public int getSkyLight(int x, int y, int z) { return this.level.getBrightness(LightLayer.SKY, new BlockPos(x,y,z)); }
- public ClientLevel getLevel()
- {
- return level;
- }
+ public ClientLevel getLevel() { return this.level; }
@Override
- public boolean hasCeiling() {
- return level.dimensionType().hasCeiling();
- }
+ public boolean hasCeiling() { return this.level.dimensionType().hasCeiling(); }
@Override
- public boolean hasSkyLight() {
- return level.dimensionType().hasSkyLight();
- }
+ public boolean hasSkyLight() { return this.level.dimensionType().hasSkyLight(); }
@Override
- public int getHeight() {
- return level.getHeight();
- }
+ public int getHeight() { return this.level.getHeight(); }
@Override
public int getMinHeight()
@@ -148,43 +156,55 @@ public class ClientLevelWrapper implements IClientLevelWrapper
#if PRE_MC_1_17_1
return 0;
#else
- return level.getMinBuildHeight();
+ return this.level.getMinBuildHeight();
#endif
}
@Override
- public IChunkWrapper tryGetChunk(DhChunkPos pos) {
- if (!level.hasChunk(pos.x, pos.z)) return null;
- ChunkAccess chunk = level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.EMPTY, false);
- if (chunk == null) return null;
- return new ChunkWrapper(chunk, level, this);
+ public IChunkWrapper tryGetChunk(DhChunkPos pos)
+ {
+ if (!this.level.hasChunk(pos.x, pos.z))
+ {
+ return null;
+ }
+
+ ChunkAccess chunk = this.level.getChunk(pos.x, pos.z, ChunkStatus.EMPTY, false);
+ if (chunk == null)
+ {
+ return null;
+ }
+
+ return new ChunkWrapper(chunk, this.level, this);
}
@Override
- public boolean hasChunkLoaded(int chunkX, int chunkZ) {
- ChunkSource source = level.getChunkSource();
+ public boolean hasChunkLoaded(int chunkX, int chunkZ)
+ {
+ ChunkSource source = this.level.getChunkSource();
return source.hasChunk(chunkX, chunkZ);
}
@Override
- public IBlockStateWrapper getBlockState(DhBlockPos pos) {
- return BlockStateWrapper.fromBlockState(level.getBlockState(McObjectConverter.Convert(pos)));
- }
+ public IBlockStateWrapper getBlockState(DhBlockPos pos)
+ {
+ return BlockStateWrapper.fromBlockState(this.level.getBlockState(McObjectConverter.Convert(pos)));
+ }
@Override
- public IBiomeWrapper getBiome(DhBlockPos pos) {
- return BiomeWrapper.getBiomeWrapper(level.getBiome(McObjectConverter.Convert(pos)));
- }
+ public IBiomeWrapper getBiome(DhBlockPos pos) { return BiomeWrapper.getBiomeWrapper(this.level.getBiome(McObjectConverter.Convert(pos))); }
@Override
- public ClientLevel getWrappedMcObject()
- {
- return level;
- }
+ public ClientLevel getWrappedMcObject() { return this.level; }
@Override
- public String toString() {
- 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/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java
index 2aefbae8a..e5aa47076 100644
--- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java
+++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java
@@ -111,7 +111,7 @@ public class ServerLevelWrapper implements IServerLevelWrapper
}
@Override
- public EDhApiLevelType getLevelType() { return EDhApiLevelType.CLIENT_LEVEL; }
+ public EDhApiLevelType getLevelType() { return EDhApiLevelType.SERVER_LEVEL; }
@Override
public int getBlockLight(int x, int y, int z)
diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java
index 228ef9e64..924d059df 100644
--- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java
+++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java
@@ -20,6 +20,8 @@
package com.seibel.distanthorizons.common.wrappers.worldGeneration;
+import com.google.common.collect.ImmutableMap;
+import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiDistantGeneratorMode;
import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiWorldGenerationStep;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject.*;
@@ -191,7 +193,21 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
}
public static ThreadLocal isDistantGeneratorThread = new ThreadLocal<>();
+ public static ThreadLocal