From 880647f1e28b831090c0f1e1329995cdf636f0be Mon Sep 17 00:00:00 2001 From: fretuks Date: Mon, 17 Nov 2025 23:26:06 +0100 Subject: [PATCH] Fixed Worldgen --- build.gradle | 2 +- .../java/net/fretux/ascend/AscendMod.java | 4 ++ .../ascend/datagen/AscendDataGenerators.java | 7 +- .../ascend/worldgen/ModStructurePieces.java | 17 +++++ .../fretux/ascend/worldgen/ModStructures.java | 17 +++++ .../ascend/worldgen/ModWorldGenProvider.java | 70 ++++++++++++------- .../fretux/ascend/worldgen/ShrinePiece.java | 56 +++++++++++++++ .../worldgen/SimpleShrineStructure.java | 38 ++++++++++ 8 files changed, 182 insertions(+), 29 deletions(-) create mode 100644 src/main/java/net/fretux/ascend/worldgen/ModStructurePieces.java create mode 100644 src/main/java/net/fretux/ascend/worldgen/ModStructures.java create mode 100644 src/main/java/net/fretux/ascend/worldgen/ShrinePiece.java create mode 100644 src/main/java/net/fretux/ascend/worldgen/SimpleShrineStructure.java diff --git a/build.gradle b/build.gradle index e851662..67a5264 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { id 'idea' id 'maven-publish' id 'net.minecraftforge.gradle' version '[6.0,6.2)' -} +} version = mod_version group = mod_group_id diff --git a/src/main/java/net/fretux/ascend/AscendMod.java b/src/main/java/net/fretux/ascend/AscendMod.java index d7acdb9..644b142 100644 --- a/src/main/java/net/fretux/ascend/AscendMod.java +++ b/src/main/java/net/fretux/ascend/AscendMod.java @@ -5,6 +5,8 @@ import net.fretux.ascend.config.AscendConfig; import net.fretux.ascend.network.PacketHandler; import net.fretux.ascend.registry.ModBlocks; import net.fretux.ascend.registry.ModItems; +import net.fretux.ascend.worldgen.ModStructurePieces; +import net.fretux.ascend.worldgen.ModStructures; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -26,6 +28,8 @@ public class AscendMod { net.minecraftforge.fml.ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AscendConfig.COMMON_SPEC); ModItems.register(modBus); ModBlocks.register(modBus); + ModStructures.STRUCTURE_TYPES.register(modBus); + ModStructurePieces.PIECES.register(modBus); } private void onCommonSetup(final FMLCommonSetupEvent event) { diff --git a/src/main/java/net/fretux/ascend/datagen/AscendDataGenerators.java b/src/main/java/net/fretux/ascend/datagen/AscendDataGenerators.java index 2589e9e..9010af3 100644 --- a/src/main/java/net/fretux/ascend/datagen/AscendDataGenerators.java +++ b/src/main/java/net/fretux/ascend/datagen/AscendDataGenerators.java @@ -19,10 +19,9 @@ public class AscendDataGenerators { public static void gatherData(GatherDataEvent event) { DataGenerator generator = event.getGenerator(); PackOutput output = generator.getPackOutput(); - ExistingFileHelper helper = event.getExistingFileHelper(); - - generator.addProvider(event.includeClient(), new ModBlockStateProvider(output, helper)); - generator.addProvider(event.includeClient(), new AscendItemModelProvider(output, helper)); + ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); + generator.addProvider(event.includeClient(), new ModBlockStateProvider(output, existingFileHelper)); + generator.addProvider(event.includeClient(), new AscendItemModelProvider(output, existingFileHelper)); generator.addProvider(event.includeServer(), new ModLootTableProvider(output)); generator.addProvider(event.includeServer(), new ModWorldGenProvider(output, event.getLookupProvider())); } diff --git a/src/main/java/net/fretux/ascend/worldgen/ModStructurePieces.java b/src/main/java/net/fretux/ascend/worldgen/ModStructurePieces.java new file mode 100644 index 0000000..ecd49c6 --- /dev/null +++ b/src/main/java/net/fretux/ascend/worldgen/ModStructurePieces.java @@ -0,0 +1,17 @@ +package net.fretux.ascend.worldgen; + +import net.fretux.ascend.AscendMod; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; + +public class ModStructurePieces { + + public static final DeferredRegister PIECES = + DeferredRegister.create(Registries.STRUCTURE_PIECE, AscendMod.MODID); + + public static final RegistryObject SHRINE_PIECE = + PIECES.register("shrine_piece", + () -> ShrinePiece::new); +} \ No newline at end of file diff --git a/src/main/java/net/fretux/ascend/worldgen/ModStructures.java b/src/main/java/net/fretux/ascend/worldgen/ModStructures.java new file mode 100644 index 0000000..4efdeff --- /dev/null +++ b/src/main/java/net/fretux/ascend/worldgen/ModStructures.java @@ -0,0 +1,17 @@ +package net.fretux.ascend.worldgen; + +import net.fretux.ascend.AscendMod; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; + +public class ModStructures { + + public static final DeferredRegister> STRUCTURE_TYPES = + DeferredRegister.create(Registries.STRUCTURE_TYPE, AscendMod.MODID); + + public static final RegistryObject> SHRINE = + STRUCTURE_TYPES.register("shrine_of_remembrance", + () -> () -> SimpleShrineStructure.CODEC); +} \ No newline at end of file diff --git a/src/main/java/net/fretux/ascend/worldgen/ModWorldGenProvider.java b/src/main/java/net/fretux/ascend/worldgen/ModWorldGenProvider.java index fc59f56..d44e901 100644 --- a/src/main/java/net/fretux/ascend/worldgen/ModWorldGenProvider.java +++ b/src/main/java/net/fretux/ascend/worldgen/ModWorldGenProvider.java @@ -1,26 +1,26 @@ package net.fretux.ascend.worldgen; -import com.mojang.serialization.Codec; import net.fretux.ascend.AscendMod; -import net.fretux.ascend.registry.ModBlocks; import net.minecraft.core.HolderLookup; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.minecraft.data.worldgen.BootstapContext; -import net.minecraft.data.worldgen.placement.PlacementUtils; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BiomeTags; +import net.minecraft.world.level.block.MultifaceSpreader; import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.Feature; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraft.world.level.levelgen.placement.RarityFilter; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; -import net.minecraftforge.registries.ForgeRegistries; +import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement; +import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -28,28 +28,50 @@ import java.util.concurrent.CompletableFuture; * Generates structure and worldgen JSON entries for the Shrine of Remembrance. */ public class ModWorldGenProvider extends DatapackBuiltinEntriesProvider { - public static final ResourceKey> SHRINE_CONFIGURED = - ResourceKey.create(Registries.CONFIGURED_FEATURE, new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance")); - public static final ResourceKey SHRINE_PLACED = - ResourceKey.create(Registries.PLACED_FEATURE, new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance")); + + public static final ResourceKey SHRINE = + ResourceKey.create(Registries.STRUCTURE, + new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance")); + + public static final ResourceKey SHRINE_SET = + ResourceKey.create(Registries.STRUCTURE_SET, + new ResourceLocation(AscendMod.MODID, "shrine_set")); public ModWorldGenProvider(PackOutput output, CompletableFuture registries) { super(output, registries, new RegistrySetBuilder() - .add(Registries.CONFIGURED_FEATURE, ModWorldGenProvider::bootstrapConfigured) - .add(Registries.PLACED_FEATURE, ModWorldGenProvider::bootstrapPlaced), + .add(Registries.STRUCTURE, ModWorldGenProvider::bootstrapStructures) + .add(Registries.STRUCTURE_SET, ModWorldGenProvider::bootstrapStructureSets), Set.of(AscendMod.MODID)); } - private static void bootstrapConfigured(BootstapContext> ctx) { - ctx.register(SHRINE_CONFIGURED, - new ConfiguredFeature<>(Feature.NO_OP, NoneFeatureConfiguration.INSTANCE)); + private static void bootstrapStructures(BootstapContext ctx) { + ctx.register( + SHRINE, + new SimpleShrineStructure( + new Structure.StructureSettings( + ctx.lookup(Registries.BIOME) + .getOrThrow(BiomeTags.IS_OVERWORLD), + Map.of(), + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.NONE + ) + ) + ); } - private static void bootstrapPlaced(BootstapContext ctx) { - var configured = ctx.lookup(Registries.CONFIGURED_FEATURE).getOrThrow(SHRINE_CONFIGURED); - ctx.register(SHRINE_PLACED, - new PlacedFeature(configured, List.of( - RarityFilter.onAverageOnceEvery(400) // roughly like mineshafts - ))); + private static void bootstrapStructureSets(BootstapContext ctx) { + ctx.register( + SHRINE_SET, + new StructureSet( + List.of(new StructureSet.StructureSelectionEntry( + ctx.lookup(Registries.STRUCTURE).getOrThrow(SHRINE), 1)), + new RandomSpreadStructurePlacement( + 32, + 8, + RandomSpreadType.LINEAR, + 1234567 + ) + ) + ); } } diff --git a/src/main/java/net/fretux/ascend/worldgen/ShrinePiece.java b/src/main/java/net/fretux/ascend/worldgen/ShrinePiece.java new file mode 100644 index 0000000..f224cb5 --- /dev/null +++ b/src/main/java/net/fretux/ascend/worldgen/ShrinePiece.java @@ -0,0 +1,56 @@ +package net.fretux.ascend.worldgen; + +import net.fretux.ascend.registry.ModBlocks; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; + +public class ShrinePiece extends StructurePiece { + + private final BlockPos pos; + + public ShrinePiece(BlockPos pos) { + super(ModStructurePieces.SHRINE_PIECE.get(), + 0, + new BoundingBox( + pos.getX(), pos.getY() - 5, pos.getZ(), + pos.getX(), pos.getY() + 5, pos.getZ() + ) + ); + this.pos = pos; + } + + public ShrinePiece(StructurePieceSerializationContext ctx, CompoundTag tag) { + super(ModStructurePieces.SHRINE_PIECE.get(), tag); + this.pos = new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z")); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tag) { + tag.putInt("x", pos.getX()); + tag.putInt("y", pos.getY()); + tag.putInt("z", pos.getZ()); + } + + @Override + public void postProcess( + WorldGenLevel level, + StructureManager manager, + ChunkGenerator generator, + RandomSource random, + BoundingBox box, + ChunkPos chunkPos, + BlockPos structurePos + ) { + if (box.isInside(pos)) { + level.setBlock(pos, ModBlocks.SHRINE_OF_REMEMBRANCE.get().defaultBlockState(), 3); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/fretux/ascend/worldgen/SimpleShrineStructure.java b/src/main/java/net/fretux/ascend/worldgen/SimpleShrineStructure.java new file mode 100644 index 0000000..b3c16fb --- /dev/null +++ b/src/main/java/net/fretux/ascend/worldgen/SimpleShrineStructure.java @@ -0,0 +1,38 @@ +package net.fretux.ascend.worldgen; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.structure.*; + +import java.util.Optional; + +public class SimpleShrineStructure extends Structure { + public static final Codec CODEC = + simpleCodec(SimpleShrineStructure::new); + + public SimpleShrineStructure(StructureSettings settings) { + super(settings); + } + + @Override + public StructureType type() { + return ModStructures.SHRINE.get(); + } + + @Override + protected Optional findGenerationPoint(GenerationContext ctx) { + BlockPos pos = ctx.chunkPos().getMiddleBlockPosition(0); + int y = ctx.chunkGenerator().getFirstFreeHeight( + pos.getX(), + pos.getZ(), + Heightmap.Types.WORLD_SURFACE_WG, + ctx.heightAccessor(), + ctx.randomState() + ); + BlockPos finalPos = new BlockPos(pos.getX(), y, pos.getZ()); + return Optional.of(new GenerationStub(finalPos, builder -> { + builder.addPiece(new ShrinePiece(finalPos)); + })); + } +}