From bfea622998b88be0a60b979948347377210ff4c7 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 29 Nov 2021 17:49:38 +0100 Subject: [PATCH 1/5] Revert "Revert "New API to hook into level loading"" This reverts commit bf8368b5153edbb20edfaa0078db101fba59e57b. --- src/main/java/ru/bclib/api/LifeCycleAPI.java | 121 ++++++++++++++++++ .../bclib/mixin/common/ServerLevelMixin.java | 14 +- 2 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ru/bclib/api/LifeCycleAPI.java diff --git a/src/main/java/ru/bclib/api/LifeCycleAPI.java b/src/main/java/ru/bclib/api/LifeCycleAPI.java new file mode 100644 index 00000000..802853dc --- /dev/null +++ b/src/main/java/ru/bclib/api/LifeCycleAPI.java @@ -0,0 +1,121 @@ +package ru.bclib.api; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.world.level.CustomSpawner; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; +import net.minecraft.world.level.storage.ServerLevelData; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executor; + +/** + * provides some lifetime hooks for a Minecraft instance + */ +public class LifeCycleAPI { + private final static List onLoadLevelBiomes = new ArrayList<>(2); + private final static List onLoadLevel = new ArrayList<>(2); + + /** + * A callback function that is used for each new ServerLevel instance + */ + public interface LevelLoadBiomesCall { + void onLoad(ServerLevel world, long seed, Registry registry); + } + + /** + * A callback function that is used for each new ServerLevel instance + */ + public interface LevelLoadCall { + void onLoad( + ServerLevel world, + MinecraftServer minecraftServer, + Executor executor, + LevelStorageSource.LevelStorageAccess levelStorageAccess, + ServerLevelData serverLevelData, + ResourceKey resourceKey, + DimensionType dimensionType, + ChunkProgressListener chunkProgressListener, + ChunkGenerator chunkGenerator, + boolean bl, + long l, + List list, + boolean bl2); + } + + /** + * Register a callback that is called when a new {@code ServerLevel is instantiated}. + * This callback will receive the world seed as well as it's biome registry. + * @param call The calbback Method + */ + public static void onLevelLoad(LevelLoadBiomesCall call){ + onLoadLevelBiomes.add(call); + } + + /** + * Register a callback that is called when a new {@code ServerLevel is instantiated}. + * This callbacl will receiv all parameters that were passed to the ServerLevel's constructor + * @param call The calbback Method + */ + public static void onLevelLoad(LevelLoadCall call){ + onLoadLevel.add(call); + } + + /** + * For internal use, You should not call this method! + * @param minecraftServer + * @param executor + * @param levelStorageAccess + * @param serverLevelData + * @param resourceKey + * @param dimensionType + * @param chunkProgressListener + * @param chunkGenerator + * @param bl + * @param l + * @param list + * @param bl2 + */ + public static void _onLevelLoad(ServerLevel world, + MinecraftServer minecraftServer, + Executor executor, + LevelStorageSource.LevelStorageAccess levelStorageAccess, + ServerLevelData serverLevelData, + ResourceKey resourceKey, + DimensionType dimensionType, + ChunkProgressListener chunkProgressListener, + ChunkGenerator chunkGenerator, + boolean bl, + long l, + List list, + boolean bl2){ + onLoadLevel.forEach(c -> c.onLoad( + world, + minecraftServer, + executor, + levelStorageAccess, + serverLevelData, + resourceKey, + dimensionType, + chunkProgressListener, + chunkGenerator, + bl, + l, + list, + bl2) + ); + + final long seed = world.getSeed(); + final Registry biomeRegistry = world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); + onLoadLevelBiomes.forEach(c -> c.onLoad(world, seed, biomeRegistry)); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java index 8de68864..61ecb78d 100644 --- a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java @@ -1,5 +1,9 @@ package ru.bclib.mixin.common; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.function.Supplier; + import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; @@ -17,10 +21,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.api.BiomeAPI; - -import java.util.List; -import java.util.concurrent.Executor; -import java.util.function.Supplier; +import ru.bclib.api.LifeCycleAPI; @Mixin(ServerLevel.class) public abstract class ServerLevelMixin extends Level { @@ -32,6 +33,9 @@ public abstract class ServerLevelMixin extends Level { @Inject(method = "*", at = @At("TAIL")) private void bclib_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { + ServerLevel world = ServerLevel.class.cast(this); + LifeCycleAPI._onLevelLoad(world, server, workerExecutor, session, properties, registryKey, dimensionType, worldGenerationProgressListener, chunkGenerator, debugWorld, l, list, bl); + BiomeAPI.initRegistry(server); BiomeAPI.applyModifications(ServerLevel.class.cast(this)); @@ -40,5 +44,7 @@ public abstract class ServerLevelMixin extends Level { } bclib_lastWorld = session.getLevelId(); + + } } From 7d04b3c902b4a9005fc8028559a963e2b4b843d6 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 30 Nov 2021 16:27:22 +0100 Subject: [PATCH 2/5] Fix issue with immutable list detection --- src/main/java/ru/bclib/api/BiomeAPI.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/bclib/api/BiomeAPI.java b/src/main/java/ru/bclib/api/BiomeAPI.java index 8ba88385..5a69d8d4 100644 --- a/src/main/java/ru/bclib/api/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/BiomeAPI.java @@ -38,6 +38,8 @@ import ru.bclib.world.features.BCLFeature; import ru.bclib.world.generator.BiomePicker; import ru.bclib.world.structures.BCLStructureFeature; +import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; @@ -507,7 +509,13 @@ public class BiomeAPI { } private static List getMutableList(List input) { - if (input instanceof ImmutableList) { + if (input!=null) { + System.out.println("getMutableList: " + input.getClass().getName()); + for (Class cl : input.getClass().getInterfaces()){ + System.out.println(" - " + cl.getName()); + } + } + if (input instanceof ImmutableList || !(input instanceof ArrayList || input instanceof LinkedList)) { return Lists.newArrayList(input); } return input; From 0d325f76372efb665919e2d93f9b4611fe818904 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 30 Nov 2021 16:27:44 +0100 Subject: [PATCH 3/5] Version and dependency update --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index e12f8ad5..d3887f7c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,11 +7,11 @@ loom_version=0.8-SNAPSHOT # Fabric Properties # check these on https://fabricmc.net/versions.html minecraft_version= 1.17.1 -loader_version= 0.12.4 -fabric_version = 0.41.3+1.17 +loader_version= 0.12.5 +fabric_version = 0.42.1+1.17 # Mod Properties -mod_version = 0.5.4 +mod_version = 0.5.5 maven_group = ru.bclib archives_base_name = bclib From c380f1d2dce9e82656199d27fa9cb9ab8cdcfb9e Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 30 Nov 2021 16:41:36 +0100 Subject: [PATCH 4/5] Removed unneeded test --- src/main/java/ru/bclib/api/BiomeAPI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/bclib/api/BiomeAPI.java b/src/main/java/ru/bclib/api/BiomeAPI.java index 5a69d8d4..e03a53d1 100644 --- a/src/main/java/ru/bclib/api/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/BiomeAPI.java @@ -515,7 +515,7 @@ public class BiomeAPI { System.out.println(" - " + cl.getName()); } } - if (input instanceof ImmutableList || !(input instanceof ArrayList || input instanceof LinkedList)) { + if (/*input instanceof ImmutableList ||*/ !(input instanceof ArrayList || input instanceof LinkedList)) { return Lists.newArrayList(input); } return input; From af8c3ba6e8f6d8c12898fe5a20d44e36065abbb1 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 30 Nov 2021 17:15:18 +0100 Subject: [PATCH 5/5] Name change --- src/main/java/ru/bclib/api/LifeCycleAPI.java | 26 +++++++++---------- .../bclib/mixin/common/ServerLevelMixin.java | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/bclib/api/LifeCycleAPI.java b/src/main/java/ru/bclib/api/LifeCycleAPI.java index 802853dc..eddba849 100644 --- a/src/main/java/ru/bclib/api/LifeCycleAPI.java +++ b/src/main/java/ru/bclib/api/LifeCycleAPI.java @@ -85,19 +85,19 @@ public class LifeCycleAPI { * @param list * @param bl2 */ - public static void _onLevelLoad(ServerLevel world, - MinecraftServer minecraftServer, - Executor executor, - LevelStorageSource.LevelStorageAccess levelStorageAccess, - ServerLevelData serverLevelData, - ResourceKey resourceKey, - DimensionType dimensionType, - ChunkProgressListener chunkProgressListener, - ChunkGenerator chunkGenerator, - boolean bl, - long l, - List list, - boolean bl2){ + public static void _runLevelLoad(ServerLevel world, + MinecraftServer minecraftServer, + Executor executor, + LevelStorageSource.LevelStorageAccess levelStorageAccess, + ServerLevelData serverLevelData, + ResourceKey resourceKey, + DimensionType dimensionType, + ChunkProgressListener chunkProgressListener, + ChunkGenerator chunkGenerator, + boolean bl, + long l, + List list, + boolean bl2){ onLoadLevel.forEach(c -> c.onLoad( world, minecraftServer, diff --git a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java index 61ecb78d..91c2c4d2 100644 --- a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java @@ -34,7 +34,7 @@ public abstract class ServerLevelMixin extends Level { @Inject(method = "*", at = @At("TAIL")) private void bclib_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { ServerLevel world = ServerLevel.class.cast(this); - LifeCycleAPI._onLevelLoad(world, server, workerExecutor, session, properties, registryKey, dimensionType, worldGenerationProgressListener, chunkGenerator, debugWorld, l, list, bl); + LifeCycleAPI._runLevelLoad(world, server, workerExecutor, session, properties, registryKey, dimensionType, worldGenerationProgressListener, chunkGenerator, debugWorld, l, list, bl); BiomeAPI.initRegistry(server); BiomeAPI.applyModifications(ServerLevel.class.cast(this));