diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/WrapperFactory.java b/common/src/main/java/com/seibel/lod/common/wrappers/WrapperFactory.java
index 9c87bd0c9..d407cd5ba 100644
--- a/common/src/main/java/com/seibel/lod/common/wrappers/WrapperFactory.java
+++ b/common/src/main/java/com/seibel/lod/common/wrappers/WrapperFactory.java
@@ -19,30 +19,38 @@
package com.seibel.lod.common.wrappers;
+import com.seibel.lod.api.interfaces.override.worldGenerator.IDhApiWorldGenerator;
import com.seibel.lod.common.wrappers.block.BlockStateWrapper;
import com.seibel.lod.common.wrappers.block.BiomeWrapper;
+import com.seibel.lod.common.wrappers.chunk.ChunkWrapper;
import com.seibel.lod.core.level.IDhLevel;
import com.seibel.lod.core.level.IDhServerLevel;
import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper;
+import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.lod.core.wrapperInterfaces.worldGeneration.AbstractBatchGenerationEnvionmentWrapper;
import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment;
+import net.minecraft.world.level.LevelReader;
+import net.minecraft.world.level.chunk.ChunkAccess;
import java.io.IOException;
/**
* This handles creating abstract wrapper objects.
- *
* @author James Seibel
- * @version 11-20-2021
+ * @version 2022-12-5
*/
public class WrapperFactory implements IWrapperFactory
{
public static final WrapperFactory INSTANCE = new WrapperFactory();
-
+
+
+
+
@Override
- public AbstractBatchGenerationEnvionmentWrapper createBatchGenerator(IDhLevel targetLevel) {
+ public AbstractBatchGenerationEnvionmentWrapper createBatchGenerator(IDhLevel targetLevel)
+ {
if (targetLevel instanceof IDhServerLevel)
{
return new BatchGenerationEnvironment((IDhServerLevel) targetLevel);
@@ -52,19 +60,87 @@ public class WrapperFactory implements IWrapperFactory
throw new IllegalArgumentException("The target level must be a server-side level.");
}
}
-
+
@Override
- public IBiomeWrapper deserializeBiomeWrapper(String str) throws IOException {
- return BiomeWrapper.deserialize(str);
- }
-
+ public IBiomeWrapper deserializeBiomeWrapper(String str) throws IOException { return BiomeWrapper.deserialize(str); }
+
@Override
- public IBlockStateWrapper deserializeBlockStateWrapper(String str) throws IOException {
- return BlockStateWrapper.deserialize(str);
- }
-
+ public IBlockStateWrapper deserializeBlockStateWrapper(String str) throws IOException { return BlockStateWrapper.deserialize(str); }
+
@Override
- public IBlockStateWrapper getAirBlockStateWrapper() {
- return BlockStateWrapper.AIR;
+ public IBlockStateWrapper getAirBlockStateWrapper() { return BlockStateWrapper.AIR; }
+
+
+ /**
+ * Note: when this is updated for different MC versions, make sure you also update the documentation in
+ * {@link IDhApiWorldGenerator#generateChunks} and the type list in {@link WrapperFactory#createChunkWrapperErrorMessage}.
+ *
+ * For full method documentation please see: {@link IWrapperFactory#createChunkWrapper}
+ * @see IWrapperFactory#createChunkWrapper
+ */
+ public IChunkWrapper createChunkWrapper(Object[] objectArray) throws ClassCastException
+ {
+ if (objectArray.length == 1 && objectArray[0] instanceof IChunkWrapper) // alternate option if "instanceof" can't be compiled down to older JRE versions "IChunkWrapper.class.isInstance(objectArray[0])" Feel free to delete this comment if we've compiled the mod for 1.16 or earlier - James
+ {
+ try
+ {
+ // this path should only happen when called by Distant Horizons code
+ // API implementors should never hit this path
+ return (IChunkWrapper) objectArray[0];
+ }
+ catch (Exception e)
+ {
+ throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
+ }
+ }
+ // correct number of parameters from the API
+ else if (objectArray.length == 2)
+ {
+ // chunk
+ if (!(objectArray[0] instanceof ChunkAccess chunk))
+ {
+ throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
+ }
+
+ // light source
+ if (!(objectArray[1] instanceof LevelReader lightSource))
+ {
+ throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
+ }
+
+
+ return new ChunkWrapper(chunk, lightSource, /*A DH wrapped level isn't necessary*/null);
+ }
+ // incorrect number of parameters from the API
+ else
+ {
+ throw new ClassCastException(createChunkWrapperErrorMessage(objectArray));
+ }
}
+ /** Note: when this is updated for different MC versions, make sure you also update the documentation in {@link IDhApiWorldGenerator#generateChunks}. */
+ private static String createChunkWrapperErrorMessage(Object[] objectArray)
+ {
+ StringBuilder message = new StringBuilder(
+ "Chunk wrapper creation failed. \n" +
+ "Expected parameters: " +
+ "[" + ChunkAccess.class.getName() + "], " +
+ "[" + LevelReader.class.getName() + "]. \n");
+
+ if (objectArray.length != 0)
+ {
+ message.append("Given parameters: ");
+ for (Object obj : objectArray)
+ {
+ message.append("[").append(obj.getClass().getName()).append("], ");
+ }
+ }
+ else
+ {
+ message.append(" No parameters given.");
+ }
+
+ return message.toString();
+ }
+
+
}
diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java
index 7c740b6c7..563878b43 100644
--- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java
+++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/BatchGenerationEnvironment.java
@@ -527,7 +527,8 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv
}
@Override
- public CompletableFuture generateChunks(int minX, int minZ, int genSize, Steps targetStep, double runTimeRatio, Consumer resultConsumer) {
+ public CompletableFuture generateChunks(int minX, int minZ, int genSize, Steps targetStep, double runTimeRatio, Consumer resultConsumer)
+ {
// TODO: Check event overlap via e.tooClose()
GenerationEvent e = GenerationEvent.startEvent(new DhChunkPos(minX, minZ), genSize, this, targetStep, runTimeRatio, resultConsumer);
events.add(e);
diff --git a/coreSubProjects b/coreSubProjects
index d6a83c8b6..1489cb0bd 160000
--- a/coreSubProjects
+++ b/coreSubProjects
@@ -1 +1 @@
-Subproject commit d6a83c8b61beb7837ea247f80decd3118a491dd0
+Subproject commit 1489cb0bdb1452aa64a9e25882165f7af4ebea59