From 0a5a608b7dd2284f1fdec81b1b9f6f5f4a5e99ac Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 22 May 2022 03:26:03 +0200 Subject: [PATCH] Introduce BCLChunkGenerator class --- src/main/java/org/betterx/bclib/BCLib.java | 2 +- .../betterx/bclib/api/biomes/BiomeAPI.java | 16 ++++---- .../bclib/client/presets/WorldPresetsUI.java | 2 +- .../NoiseGeneratorSettingsProvider.java | 4 ++ .../mixin/client/CreateWorldScreenMixin.java | 2 +- .../mixin/common/ChunkGeneratorsMixin.java | 22 +++++++++++ .../DedicatedServerPropertiesMixin.java | 4 +- .../common/MultiPackResourceManagerMixin.java | 18 ++++----- .../common/NoiseBasedChunkGeneratorMixin.java | 37 +++++-------------- .../bclib/mixin/common/PresetEditorMixin.java | 2 + .../mixin/common/WorldGenPropertiesMixin.java | 2 +- .../common/WorldPresetsBootstrapMixin.java | 8 ++-- .../presets/{ => worldgen}/WorldPresets.java | 7 ++-- .../generator/BCLibNetherBiomeSource.java | 26 ++++++------- src/main/resources/bclib.accesswidener | 2 +- src/main/resources/bclib.mixins.common.json | 1 + src/main/resources/fabric.mod.json | 2 +- 17 files changed, 84 insertions(+), 73 deletions(-) create mode 100644 src/main/java/org/betterx/bclib/mixin/common/ChunkGeneratorsMixin.java rename src/main/java/org/betterx/bclib/presets/{ => worldgen}/WorldPresets.java (96%) diff --git a/src/main/java/org/betterx/bclib/BCLib.java b/src/main/java/org/betterx/bclib/BCLib.java index be232144..1e412b1b 100644 --- a/src/main/java/org/betterx/bclib/BCLib.java +++ b/src/main/java/org/betterx/bclib/BCLib.java @@ -11,7 +11,7 @@ import org.betterx.bclib.api.dataexchange.DataExchangeAPI; import org.betterx.bclib.api.dataexchange.handler.autosync.*; import org.betterx.bclib.api.tag.TagAPI; import org.betterx.bclib.config.Configs; -import org.betterx.bclib.presets.WorldPresets; +import org.betterx.bclib.presets.worldgen.WorldPresets; import org.betterx.bclib.recipes.AnvilRecipe; import org.betterx.bclib.recipes.CraftingRecipes; import org.betterx.bclib.registry.BaseBlockEntities; diff --git a/src/main/java/org/betterx/bclib/api/biomes/BiomeAPI.java b/src/main/java/org/betterx/bclib/api/biomes/BiomeAPI.java index 61e65764..85756c7a 100644 --- a/src/main/java/org/betterx/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/org/betterx/bclib/api/biomes/BiomeAPI.java @@ -124,11 +124,11 @@ public class BiomeAPI { public static final BCLBiome THE_END = registerEndLandBiome(getFromRegistry(Biomes.THE_END)); public static final BCLBiome END_MIDLANDS = registerSubBiome(THE_END, - getFromRegistry(Biomes.END_MIDLANDS).value(), - 0.5F); + getFromRegistry(Biomes.END_MIDLANDS).value(), + 0.5F); public static final BCLBiome END_HIGHLANDS = registerSubBiome(THE_END, - getFromRegistry(Biomes.END_HIGHLANDS).value(), - 0.5F); + getFromRegistry(Biomes.END_HIGHLANDS).value(), + 0.5F); public static final BCLBiome END_BARRENS = registerEndVoidBiome(getFromRegistry(new ResourceLocation("end_barrens"))); public static final BCLBiome SMALL_END_ISLANDS = registerEndVoidBiome(getFromRegistry(new ResourceLocation( @@ -289,7 +289,7 @@ public class BiomeAPI { */ public static BCLBiome registerEndLandBiome(Holder biome, float genChance) { BCLBiome bclBiome = new BCLBiome(biome.value(), - VanillaBiomeSettings.createVanilla().setGenChance(genChance).build()); + VanillaBiomeSettings.createVanilla().setGenChance(genChance).build()); registerBiome(bclBiome, Dimension.END_LAND); return bclBiome; @@ -335,7 +335,7 @@ public class BiomeAPI { */ public static BCLBiome registerEndVoidBiome(Holder biome, float genChance) { BCLBiome bclBiome = new BCLBiome(biome.value(), - VanillaBiomeSettings.createVanilla().setGenChance(genChance).build()); + VanillaBiomeSettings.createVanilla().setGenChance(genChance).build()); registerBiome(bclBiome, Dimension.END_VOID); return bclBiome; @@ -530,7 +530,7 @@ public class BiomeAPI { public static void registerBiomeModification(ResourceKey dimensionID, BiConsumer> modification) { List>> modifications = MODIFICATIONS.computeIfAbsent(dimensionID, - k -> Lists.newArrayList()); + k -> Lists.newArrayList()); modifications.add(modification); } @@ -596,7 +596,7 @@ public class BiomeAPI { public static void onFinishingBiomeTags(ResourceKey dimensionID, BiConsumer> modification) { List>> modifications = TAG_ADDERS.computeIfAbsent(dimensionID, - k -> Lists.newArrayList()); + k -> Lists.newArrayList()); modifications.add(modification); } diff --git a/src/main/java/org/betterx/bclib/client/presets/WorldPresetsUI.java b/src/main/java/org/betterx/bclib/client/presets/WorldPresetsUI.java index 910431f3..586c21a3 100644 --- a/src/main/java/org/betterx/bclib/client/presets/WorldPresetsUI.java +++ b/src/main/java/org/betterx/bclib/client/presets/WorldPresetsUI.java @@ -8,7 +8,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import org.betterx.bclib.gui.worldgen.WorldSetupScreen; -import org.betterx.bclib.presets.WorldPresets; +import org.betterx.bclib.presets.worldgen.WorldPresets; import java.util.Optional; diff --git a/src/main/java/org/betterx/bclib/interfaces/NoiseGeneratorSettingsProvider.java b/src/main/java/org/betterx/bclib/interfaces/NoiseGeneratorSettingsProvider.java index f3818e83..1077c6b1 100644 --- a/src/main/java/org/betterx/bclib/interfaces/NoiseGeneratorSettingsProvider.java +++ b/src/main/java/org/betterx/bclib/interfaces/NoiseGeneratorSettingsProvider.java @@ -1,7 +1,11 @@ package org.betterx.bclib.interfaces; +import net.minecraft.core.Registry; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.synth.NormalNoise; public interface NoiseGeneratorSettingsProvider { NoiseGeneratorSettings bclib_getNoiseGeneratorSettings(); + + Registry bclib_getNoises(); } diff --git a/src/main/java/org/betterx/bclib/mixin/client/CreateWorldScreenMixin.java b/src/main/java/org/betterx/bclib/mixin/client/CreateWorldScreenMixin.java index ba5dd512..73d4d0f8 100644 --- a/src/main/java/org/betterx/bclib/mixin/client/CreateWorldScreenMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/client/CreateWorldScreenMixin.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset; import com.mojang.datafixers.util.Pair; import org.betterx.bclib.api.biomes.BiomeAPI; -import org.betterx.bclib.presets.WorldPresets; +import org.betterx.bclib.presets.worldgen.WorldPresets; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/main/java/org/betterx/bclib/mixin/common/ChunkGeneratorsMixin.java b/src/main/java/org/betterx/bclib/mixin/common/ChunkGeneratorsMixin.java new file mode 100644 index 00000000..504a0a9c --- /dev/null +++ b/src/main/java/org/betterx/bclib/mixin/common/ChunkGeneratorsMixin.java @@ -0,0 +1,22 @@ +package org.betterx.bclib.mixin.common; + +import net.minecraft.core.Registry; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGenerators; + +import com.mojang.serialization.Codec; +import org.betterx.bclib.BCLib; +import org.betterx.bclib.presets.worldgen.BCLChunkGenerator; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ChunkGenerators.class) +public class ChunkGeneratorsMixin { + @Inject(method = "bootstrap", at = @At(value = "HEAD")) + private static void bcl_bootstrap(Registry> registry, + CallbackInfoReturnable> cir) { + Registry.register(registry, BCLib.makeID("betterx"), BCLChunkGenerator.CODEC); + } +} diff --git a/src/main/java/org/betterx/bclib/mixin/common/DedicatedServerPropertiesMixin.java b/src/main/java/org/betterx/bclib/mixin/common/DedicatedServerPropertiesMixin.java index ac658a50..95abbe57 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/DedicatedServerPropertiesMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/DedicatedServerPropertiesMixin.java @@ -2,7 +2,7 @@ package org.betterx.bclib.mixin.common; import net.minecraft.server.dedicated.DedicatedServerProperties; -import org.betterx.bclib.presets.WorldPresets; +import org.betterx.bclib.presets.worldgen.WorldPresets; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; public class DedicatedServerPropertiesMixin { //Make sure the default server properties use our Default World Preset @ModifyArg(method = "", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/dedicated/DedicatedServerProperties$WorldGenProperties;(Ljava/lang/String;Lcom/google/gson/JsonObject;ZLjava/lang/String;)V")) - private String bcl_foo(String levelType) { + private String bcl_init(String levelType) { return WorldPresets.DEFAULT.orElseThrow().location().toString(); } } diff --git a/src/main/java/org/betterx/bclib/mixin/common/MultiPackResourceManagerMixin.java b/src/main/java/org/betterx/bclib/mixin/common/MultiPackResourceManagerMixin.java index f15e0fc3..4cf31f22 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/MultiPackResourceManagerMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/MultiPackResourceManagerMixin.java @@ -22,14 +22,14 @@ public class MultiPackResourceManagerMixin { @Inject(method = "getResource", at = @At("HEAD"), cancellable = true) private void bclib_hasResource(ResourceLocation resourceLocation, CallbackInfoReturnable> info) { - if (resourceLocation.getNamespace().equals("minecraft")) { - for (String key : BCLIB_MISSING_RESOURCES) { - if (resourceLocation.getPath().equals(key)) { - info.setReturnValue(Optional.empty()); - info.cancel(); - return; - } - } - } +// if (resourceLocation.getNamespace().equals("minecraft")) { +// for (String key : BCLIB_MISSING_RESOURCES) { +// if (resourceLocation.getPath().equals(key)) { +// info.setReturnValue(Optional.empty()); +// info.cancel(); +// return; +// } +// } +// } } } diff --git a/src/main/java/org/betterx/bclib/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/org/betterx/bclib/mixin/common/NoiseBasedChunkGeneratorMixin.java index f024e8dc..93647365 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/NoiseBasedChunkGeneratorMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/NoiseBasedChunkGeneratorMixin.java @@ -1,16 +1,14 @@ package org.betterx.bclib.mixin.common; -import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; -import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.Registry; import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.levelgen.*; import net.minecraft.world.level.levelgen.blending.Blender; -import net.minecraft.world.level.levelgen.carver.CarvingContext; +import net.minecraft.world.level.levelgen.synth.NormalNoise; import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider; import org.betterx.bclib.interfaces.SurfaceProvider; @@ -19,7 +17,6 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import java.lang.reflect.Constructor; -import java.util.Optional; @Mixin(NoiseBasedChunkGenerator.class) public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider, NoiseGeneratorSettingsProvider { @@ -27,6 +24,9 @@ public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider, @Shadow protected Holder settings; + @Shadow + @Final + private Registry noises; @Final @Shadow private Aquifer.FluidPicker globalFluidPicker; @@ -39,32 +39,15 @@ public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider, return settings.value(); } + @Override + public Registry bclib_getNoises() { + return noises; + } + @Shadow protected abstract NoiseChunk createNoiseChunk(ChunkAccess chunkAccess, StructureManager structureManager, Blender blender, RandomState randomState); - @Override - @SuppressWarnings("deprecation") - public BlockState bclib_getSurface(BlockPos pos, Holder biome, ServerLevel level) { - ChunkAccess chunkAccess = level.getChunk(pos.getX() >> 4, pos.getZ() >> 4); - StructureManager structureManager = level.structureManager(); - NoiseBasedChunkGenerator generator = NoiseBasedChunkGenerator.class.cast(this); - RandomState randomState = level.getChunkSource().randomState(); - - NoiseChunk noiseChunk = chunkAccess.getOrCreateNoiseChunk(ca -> this.createNoiseChunk(ca, - structureManager, - Blender.empty(), - randomState)); - - CarvingContext carvingContext = new CarvingContext(generator, - level.registryAccess(), - chunkAccess.getHeightAccessorForGeneration(), - noiseChunk, - randomState, - this.settings.value().surfaceRule()); - Optional optional = carvingContext.topMaterial(bpos -> biome, chunkAccess, pos, false); - return optional.isPresent() ? optional.get() : bclib_air; - } } diff --git a/src/main/java/org/betterx/bclib/mixin/common/PresetEditorMixin.java b/src/main/java/org/betterx/bclib/mixin/common/PresetEditorMixin.java index ce0c59de..ff9683a8 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/PresetEditorMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/PresetEditorMixin.java @@ -12,6 +12,8 @@ import java.util.Map; @Mixin(PresetEditor.class) interface PresetEditorMixin { + //Make Sure the PresetEditor.EDITORS Field is a mutable List. Allows us to add new Custom WorldPreset UIs in + //WorldPresetsUI @Redirect(method = "", at = @At(value = "INVOKE", target = "Ljava/util/Map;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;")) private static Map bcl_foo(K k1, V v1, K k2, V v2) { Map a = Maps.newHashMap(); diff --git a/src/main/java/org/betterx/bclib/mixin/common/WorldGenPropertiesMixin.java b/src/main/java/org/betterx/bclib/mixin/common/WorldGenPropertiesMixin.java index a2955e8a..a1dc1ee5 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/WorldGenPropertiesMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/WorldGenPropertiesMixin.java @@ -4,7 +4,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.server.dedicated.DedicatedServerProperties; import net.minecraft.world.level.levelgen.presets.WorldPreset; -import org.betterx.bclib.presets.WorldPresets; +import org.betterx.bclib.presets.worldgen.WorldPresets; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; diff --git a/src/main/java/org/betterx/bclib/mixin/common/WorldPresetsBootstrapMixin.java b/src/main/java/org/betterx/bclib/mixin/common/WorldPresetsBootstrapMixin.java index 7f65ab86..f55cd222 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/WorldPresetsBootstrapMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/WorldPresetsBootstrapMixin.java @@ -51,17 +51,17 @@ public abstract class WorldPresetsBootstrapMixin { @ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;")) private LevelStem bcl_getOverworldStem(LevelStem overworldStem) { - WorldPreset preset = new org.betterx.bclib.presets.WorldPresets.SortableWorldPreset( + WorldPreset preset = new org.betterx.bclib.presets.worldgen.WorldPresets.SortableWorldPreset( Map.of(LevelStem.OVERWORLD, overworldStem, LevelStem.NETHER, - org.betterx.bclib.presets.WorldPresets.getBCLNetherLevelStem(this.biomes, + org.betterx.bclib.presets.worldgen.WorldPresets.getBCLNetherLevelStem(this.biomes, this.netherDimensionType, this.structureSets, this.noises, this.netherNoiseSettings), LevelStem.END, - org.betterx.bclib.presets.WorldPresets.getBCLEndLevelStem(this.biomes, + org.betterx.bclib.presets.worldgen.WorldPresets.getBCLEndLevelStem(this.biomes, this.endDimensionType, this.structureSets, this.noises, @@ -69,7 +69,7 @@ public abstract class WorldPresetsBootstrapMixin { ), 0 ); - BuiltinRegistries.register(this.presets, org.betterx.bclib.presets.WorldPresets.BCL_WORLD, preset); + BuiltinRegistries.register(this.presets, org.betterx.bclib.presets.worldgen.WorldPresets.BCL_WORLD, preset); return overworldStem; } diff --git a/src/main/java/org/betterx/bclib/presets/WorldPresets.java b/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java similarity index 96% rename from src/main/java/org/betterx/bclib/presets/WorldPresets.java rename to src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java index 760746d8..112fb2e2 100644 --- a/src/main/java/org/betterx/bclib/presets/WorldPresets.java +++ b/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java @@ -1,4 +1,4 @@ -package org.betterx.bclib.presets; +package org.betterx.bclib.presets.worldgen; import net.minecraft.core.Holder; import net.minecraft.core.Registry; @@ -11,7 +11,6 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; -import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.presets.WorldPreset; @@ -39,7 +38,7 @@ public class WorldPresets { BCLibNetherBiomeSource netherSource = new BCLibNetherBiomeSource(biomes); LevelStem bclNether = new LevelStem( dimension, - new NoiseBasedChunkGenerator( + new BCLChunkGenerator( structureSets, noiseParameters, netherSource, @@ -57,7 +56,7 @@ public class WorldPresets { BCLibEndBiomeSource netherSource = new BCLibEndBiomeSource(biomes); LevelStem bclEnd = new LevelStem( dimension, - new NoiseBasedChunkGenerator( + new BCLChunkGenerator( structureSets, noiseParameters, netherSource, diff --git a/src/main/java/org/betterx/bclib/world/generator/BCLibNetherBiomeSource.java b/src/main/java/org/betterx/bclib/world/generator/BCLibNetherBiomeSource.java index 323593ba..5a824c0b 100644 --- a/src/main/java/org/betterx/bclib/world/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/org/betterx/bclib/world/generator/BCLibNetherBiomeSource.java @@ -33,18 +33,18 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource { public static final Codec CODEC = RecordCodecBuilder .create(instance -> instance .group(RegistryOps - .retrieveRegistry(Registry.BIOME_REGISTRY) - .forGetter(source -> source.biomeRegistry), - Codec - .LONG - .fieldOf("seed") - .stable() - .forGetter(source -> { - return source.currentSeed; - }) - ) + .retrieveRegistry(Registry.BIOME_REGISTRY) + .forGetter(source -> source.biomeRegistry), + Codec + .LONG + .fieldOf("seed") + .stable() + .forGetter(source -> { + return source.currentSeed; + }) + ) .apply(instance, instance.stable(BCLibNetherBiomeSource::new)) - ); + ); private BiomeMap biomeMap; private final BiomePicker biomePicker; @@ -172,8 +172,8 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource { ); } else { this.biomeMap = mapConstructor.apply(seed, - GeneratorOptions.getBiomeSizeNether(), - biomePicker); + GeneratorOptions.getBiomeSizeNether(), + biomePicker); } } diff --git a/src/main/resources/bclib.accesswidener b/src/main/resources/bclib.accesswidener index ba0a8480..ec86b702 100644 --- a/src/main/resources/bclib.accesswidener +++ b/src/main/resources/bclib.accesswidener @@ -9,4 +9,4 @@ accessible class net/minecraft/world/level/levelgen/SurfaceRules$LazyXZCondition accessible class net/minecraft/world/level/levelgen/SurfaceRules$LazyCondition accessible class net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource accessible class net/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap - +extendable class net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index 65e1496c..7e45db03 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -12,6 +12,7 @@ "BlockStateBaseMixin", "BoneMealItemMixin", "ChunkGeneratorMixin", + "ChunkGeneratorsMixin", "ComposterBlockAccessor", "CraftingMenuMixin", "DedicatedServerPropertiesMixin", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 43d3795d..94a9d1f0 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "id": "bclib", - "version": "${version}", + "version": "2.0.0", "name": "BCLib", "description": "A library for BetterX team mods", "authors": [