From e6937d010f1c764822271acee55f66f9dd6feb05 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 14 Jul 2022 21:54:06 -0500 Subject: [PATCH] Start setting up the DhApi world generator overriding --- .../external/events/DhApiEventRegister.java | 1 - .../DhApiWorldGeneratorOverrideRegister.java | 70 ++++++++++++++++++ .../enums/EDhApiWorldGenerationStep.java | 30 ++++++++ .../interfaces/IDhApiOverrideable.java | 11 +++ .../interfaces/IDhApiWorldGenerator.java | 19 +++++ .../enums/EDhApiWorldGenThreadMode.java | 31 ++++++++ .../shared/interfaces/IDhApiChunkWrapper.java | 74 +++++++++++++++++++ .../IDhApiDimensionTypeWrapper.java | 4 +- .../shared/interfaces/IDhApiLevelWrapper.java | 4 +- .../interfaces/IDhApiUnsafeWrapper.java | 25 +++++++ 10 files changed, 264 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/seibel/lod/core/api/external/override/DhApiWorldGeneratorOverrideRegister.java create mode 100644 src/main/java/com/seibel/lod/core/api/external/override/enums/EDhApiWorldGenerationStep.java create mode 100644 src/main/java/com/seibel/lod/core/api/external/override/interfaces/IDhApiOverrideable.java create mode 100644 src/main/java/com/seibel/lod/core/api/external/override/interfaces/IDhApiWorldGenerator.java create mode 100644 src/main/java/com/seibel/lod/core/api/external/shared/enums/EDhApiWorldGenThreadMode.java create mode 100644 src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiChunkWrapper.java create mode 100644 src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiUnsafeWrapper.java diff --git a/src/main/java/com/seibel/lod/core/api/external/events/DhApiEventRegister.java b/src/main/java/com/seibel/lod/core/api/external/events/DhApiEventRegister.java index 78078412b..8b4d8a80f 100644 --- a/src/main/java/com/seibel/lod/core/api/external/events/DhApiEventRegister.java +++ b/src/main/java/com/seibel/lod/core/api/external/events/DhApiEventRegister.java @@ -32,5 +32,4 @@ public class DhApiEventRegister throw new UnsupportedOperationException(); } - } diff --git a/src/main/java/com/seibel/lod/core/api/external/override/DhApiWorldGeneratorOverrideRegister.java b/src/main/java/com/seibel/lod/core/api/external/override/DhApiWorldGeneratorOverrideRegister.java new file mode 100644 index 000000000..6725ed457 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/api/external/override/DhApiWorldGeneratorOverrideRegister.java @@ -0,0 +1,70 @@ +package com.seibel.lod.core.api.external.override; + +import com.seibel.lod.core.api.external.override.interfaces.IDhApiWorldGenerator; +import com.seibel.lod.core.api.external.shared.interfaces.IDhApiLevelWrapper; +import com.seibel.lod.core.api.external.shared.objects.DhApiResult; + +/** + * Handles adding/removing world generator overrides. + * + * @author James Seibel + * @version 2022-7-14 + */ +public class DhApiWorldGeneratorOverrideRegister +{ + /** + * Registers the given world generator.

+ * + * This registers a backup world generator for all levels and will be overridden if there + * is a world generator for the specific level.
+ * If another world generator has already been registered, DhApiResult will return + * the name of the previously registered generator and success = false. + */ + public static DhApiResult RegisterWorldGeneratorOverride(IDhApiWorldGenerator worldGenerator) + { + throw new UnsupportedOperationException(); + } + + /** + * Registers the given world generator for the given level.

+ * + * Only one world generator can be registered for a specific level at a given time.
+ * If another world generator has already been registered, DhApiResult will return + * the name of the previously registered generator and success = false. + */ + public static DhApiResult RegisterWorldGeneratorOverride(IDhApiLevelWrapper levelWrapper, IDhApiWorldGenerator worldGenerator) + { + throw new UnsupportedOperationException(); + } + + + + /** + * Removes the given world generator for the given level if it has been registered.
+ * If the world generator wasn't registered, the result will return success = false. + */ + public static DhApiResult UnRegisterWorldGeneratorOverride(IDhApiLevelWrapper levelWrapper, IDhApiWorldGenerator worldGenerator) + { + throw new UnsupportedOperationException(); + } + + /** + * Removes the registered world generator for the given level if one has been registered.
+ * If no world generator was registered, the result will return success = false. + */ + public static DhApiResult UnRegisterWorldGeneratorOverride(IDhApiLevelWrapper levelWrapper) + { + throw new UnsupportedOperationException(); + } + + /** + * Removes the registered world generator for each level it was registered.
+ * If this world generator wasn't registered for any level, the result will return success = false. + */ + public static DhApiResult UnRegisterWorldGeneratorOverride(IDhApiWorldGenerator worldGenerator) + { + throw new UnsupportedOperationException(); + } + + +} diff --git a/src/main/java/com/seibel/lod/core/api/external/override/enums/EDhApiWorldGenerationStep.java b/src/main/java/com/seibel/lod/core/api/external/override/enums/EDhApiWorldGenerationStep.java new file mode 100644 index 000000000..9d831f424 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/api/external/override/enums/EDhApiWorldGenerationStep.java @@ -0,0 +1,30 @@ +package com.seibel.lod.core.api.external.override.enums; + +/** + * EMPTY,
+ * STRUCTURE_START,
+ * STRUCTURE_REFERENCE,
+ * BIOMES,
+ * NOISE,
+ * SURFACE,
+ * CARVERS,
+ * LIQUID_CARVERS,
+ * FEATURES,
+ * LIGHT,
+ * + * @author James Seibel + * @version 2022-7-14 + */ +public enum EDhApiWorldGenerationStep +{ + EMPTY, + STRUCTURE_START, + STRUCTURE_REFERENCE, + BIOMES, + NOISE, + SURFACE, + CARVERS, + LIQUID_CARVERS, + FEATURES, + LIGHT, +} diff --git a/src/main/java/com/seibel/lod/core/api/external/override/interfaces/IDhApiOverrideable.java b/src/main/java/com/seibel/lod/core/api/external/override/interfaces/IDhApiOverrideable.java new file mode 100644 index 000000000..17f203ce4 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/api/external/override/interfaces/IDhApiOverrideable.java @@ -0,0 +1,11 @@ +package com.seibel.lod.core.api.external.override.interfaces; + +/** + * Implemented by all DhApi objects that can be overridden. + * + * @author James Seibel + * @version 2022-7-14 + */ +public interface IDhApiOverrideable +{ +} diff --git a/src/main/java/com/seibel/lod/core/api/external/override/interfaces/IDhApiWorldGenerator.java b/src/main/java/com/seibel/lod/core/api/external/override/interfaces/IDhApiWorldGenerator.java new file mode 100644 index 000000000..f8082cfd9 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/api/external/override/interfaces/IDhApiWorldGenerator.java @@ -0,0 +1,19 @@ +package com.seibel.lod.core.api.external.override.interfaces; + +import com.seibel.lod.core.api.external.override.enums.EDhApiWorldGenerationStep; +import com.seibel.lod.core.api.external.shared.enums.EDhApiWorldGenThreadMode; +import com.seibel.lod.core.api.external.shared.interfaces.IDhApiChunkWrapper; +import com.seibel.lod.core.api.external.shared.interfaces.IDhApiLevelWrapper; + +/** + * @author James Seibel + * @version 2022-7-14 + */ +public interface IDhApiWorldGenerator extends IDhApiOverrideable +{ + /** Returns where chunk generation requests can be generated. */ + EDhApiWorldGenThreadMode getThreadingMode(); + + IDhApiChunkWrapper generateChunk(int chunkPosX, int chunkPosZ, IDhApiLevelWrapper serverLevelWrapper, EDhApiWorldGenerationStep maxStepToGenerate); + +} diff --git a/src/main/java/com/seibel/lod/core/api/external/shared/enums/EDhApiWorldGenThreadMode.java b/src/main/java/com/seibel/lod/core/api/external/shared/enums/EDhApiWorldGenThreadMode.java new file mode 100644 index 000000000..2d213bbe1 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/api/external/shared/enums/EDhApiWorldGenThreadMode.java @@ -0,0 +1,31 @@ +package com.seibel.lod.core.api.external.shared.enums; + +/** + * MULTI_THREADED,
+ * SINGLE_THREADED,
+ * SERVER_THREAD,
+ * + * @author James Seibel + * @version 7-14-2022 + */ +public enum EDhApiWorldGenThreadMode +{ + /** + * This world generator can be run on an unlimited number + * of concurrent threads. + */ + MULTI_THREADED, + + /** + * This world generator can only be run on one thread at + * a time, however that thread can run concurrently + * to Minecraft's server thread. + */ + SINGLE_THREADED, + + /** + * This world generator can only be run on Minecraft's + * server thread. + */ + SERVER_THREAD, +} diff --git a/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiChunkWrapper.java b/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiChunkWrapper.java new file mode 100644 index 000000000..939bb840c --- /dev/null +++ b/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiChunkWrapper.java @@ -0,0 +1,74 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU LGPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.core.api.external.shared.interfaces; + +import com.seibel.lod.core.enums.ELodDirection; +import com.seibel.lod.core.handlers.dependencyInjection.IBindable; +import com.seibel.lod.core.objects.DHChunkPos; +import com.seibel.lod.core.util.LodUtil; +import com.seibel.lod.core.wrapperInterfaces.block.IBlockDetailWrapper; +import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper; + +/** + * @author James Seibel + * @version 2022-7-14 + */ +public interface IDhApiChunkWrapper extends IDhApiUnsafeWrapper +{ + /** Returns the absolute Y coordinate of the highest block for the given relative X and Z coordinates. */ + int getMaxY(int relativeX, int relativeZ); + /** Returns the maximum absolute block position in the X direction. */ + int getMaxX(); + /** Returns the maximum absolute block position in the Z direction. */ + int getMaxZ(); + + /** Returns the absolute Y coordinate of the lowest block for the given relative X and Z coordinates. */ + int getMinY(int relativeX, int relativeZ); + /** Returns the minimum absolute block position in the X direction. */ + int getMinX(); + /** Returns the minimum absolute block position in the Z direction. */ + int getMinZ(); + + /** + * Returns true if this chunk's lighting has been built.
+ * Note: for some versions of Minecraft this value may be unreliable. + */ + boolean isLightCorrect(); + + /** TODO what side of the block should this return the light for? */ + default int getBlockLight(int x, int y, int z) {return -1;} + /** TODO what side of the block should this return the light for? */ + default int getSkyLight(int x, int y, int z) {return -1;} + + /** + * Returns true if chunks exist in all 4 cardinal and 4 ordinal directions + * relative to this chunk.
+ * IE: returns true if there are chunks to the North, South, East, West, NE, SE, SW, and NW + * of this chunk. + */ + boolean doNearbyChunksExist(); + + + // TODO these will probably need replacing once 1.7's ID system is done + //IBlockStateWrapper getBlockState(int x, int y, int z); + //IBiomeWrapper getBiome(int x, int y, int z); + +} diff --git a/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiDimensionTypeWrapper.java b/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiDimensionTypeWrapper.java index bf16c135e..d7e035414 100644 --- a/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiDimensionTypeWrapper.java +++ b/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiDimensionTypeWrapper.java @@ -21,9 +21,9 @@ package com.seibel.lod.core.api.external.shared.interfaces; /** * @author James Seibel - * @version 2022-7-13 + * @version 2022-7-14 */ -public interface IDhApiDimensionTypeWrapper +public interface IDhApiDimensionTypeWrapper extends IDhApiUnsafeWrapper { String getDimensionName(); diff --git a/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiLevelWrapper.java b/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiLevelWrapper.java index b3c323f2b..f0da3bd61 100644 --- a/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiLevelWrapper.java +++ b/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiLevelWrapper.java @@ -25,9 +25,9 @@ import com.seibel.lod.core.api.external.shared.enums.EDhApiLevelType; * Can be either a Server or Client level. * * @author James Seibel - * @version 2022-7-13 + * @version 2022-7-14 */ -public interface IDhApiLevelWrapper +public interface IDhApiLevelWrapper extends IDhApiUnsafeWrapper { IDhApiDimensionTypeWrapper getDimensionType(); diff --git a/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiUnsafeWrapper.java b/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiUnsafeWrapper.java new file mode 100644 index 000000000..74f798931 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/api/external/shared/interfaces/IDhApiUnsafeWrapper.java @@ -0,0 +1,25 @@ +package com.seibel.lod.core.api.external.shared.interfaces; + +/** + * The Distant Horizons' API objects can't cover + * every potential use case. Sometimes developers just need + * the base Minecraft Objects. + * + * @author James Seibel + * @version 2022-7-14 + */ +public interface IDhApiUnsafeWrapper +{ + /** + * This returns the Minecraft object this wrapper is containing.
+ * Warning: This object will be Minecraft + * version dependent and may change without notice.

+ * + * In order to cast this object to something usable, you may want + * to use obj.getClass() when in your IDE + * in order to determine what object this method returns for + * specific version of Minecraft you are developing for. + */ + public Object getWrappedMcObject_UNSAFE(); + +}