From 6bd7f54a8edef9097593237c3af4728a78426d09 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 8 Dec 2022 21:36:44 -0600 Subject: [PATCH] Add WrapperFactory.createChunkWrapper() --- .../lod/common/wrappers/WrapperFactory.java | 106 +++++++++++++++--- .../BatchGenerationEnvironment.java | 3 +- coreSubProjects | 2 +- 3 files changed, 94 insertions(+), 17 deletions(-) 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