Fixed Worldgen

This commit is contained in:
2025-11-17 23:26:06 +01:00
parent 34394aabc6
commit 880647f1e2
8 changed files with 182 additions and 29 deletions
@@ -5,6 +5,8 @@ import net.fretux.ascend.config.AscendConfig;
import net.fretux.ascend.network.PacketHandler; import net.fretux.ascend.network.PacketHandler;
import net.fretux.ascend.registry.ModBlocks; import net.fretux.ascend.registry.ModBlocks;
import net.fretux.ascend.registry.ModItems; 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.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; 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); net.minecraftforge.fml.ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AscendConfig.COMMON_SPEC);
ModItems.register(modBus); ModItems.register(modBus);
ModBlocks.register(modBus); ModBlocks.register(modBus);
ModStructures.STRUCTURE_TYPES.register(modBus);
ModStructurePieces.PIECES.register(modBus);
} }
private void onCommonSetup(final FMLCommonSetupEvent event) { private void onCommonSetup(final FMLCommonSetupEvent event) {
@@ -19,10 +19,9 @@ public class AscendDataGenerators {
public static void gatherData(GatherDataEvent event) { public static void gatherData(GatherDataEvent event) {
DataGenerator generator = event.getGenerator(); DataGenerator generator = event.getGenerator();
PackOutput output = generator.getPackOutput(); PackOutput output = generator.getPackOutput();
ExistingFileHelper helper = event.getExistingFileHelper(); ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
generator.addProvider(event.includeClient(), new ModBlockStateProvider(output, existingFileHelper));
generator.addProvider(event.includeClient(), new ModBlockStateProvider(output, helper)); generator.addProvider(event.includeClient(), new AscendItemModelProvider(output, existingFileHelper));
generator.addProvider(event.includeClient(), new AscendItemModelProvider(output, helper));
generator.addProvider(event.includeServer(), new ModLootTableProvider(output)); generator.addProvider(event.includeServer(), new ModLootTableProvider(output));
generator.addProvider(event.includeServer(), new ModWorldGenProvider(output, event.getLookupProvider())); generator.addProvider(event.includeServer(), new ModWorldGenProvider(output, event.getLookupProvider()));
} }
@@ -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<StructurePieceType> PIECES =
DeferredRegister.create(Registries.STRUCTURE_PIECE, AscendMod.MODID);
public static final RegistryObject<StructurePieceType> SHRINE_PIECE =
PIECES.register("shrine_piece",
() -> ShrinePiece::new);
}
@@ -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<StructureType<?>> STRUCTURE_TYPES =
DeferredRegister.create(Registries.STRUCTURE_TYPE, AscendMod.MODID);
public static final RegistryObject<StructureType<SimpleShrineStructure>> SHRINE =
STRUCTURE_TYPES.register("shrine_of_remembrance",
() -> () -> SimpleShrineStructure.CODEC);
}
@@ -1,26 +1,26 @@
package net.fretux.ascend.worldgen; package net.fretux.ascend.worldgen;
import com.mojang.serialization.Codec;
import net.fretux.ascend.AscendMod; import net.fretux.ascend.AscendMod;
import net.fretux.ascend.registry.ModBlocks;
import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.data.PackOutput; import net.minecraft.data.PackOutput;
import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; 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.GenerationStep;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.structure.StructureSet;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.structure.TerrainAdjustment;
import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement;
import net.minecraft.world.level.levelgen.placement.RarityFilter;
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; 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.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CompletableFuture; 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. * Generates structure and worldgen JSON entries for the Shrine of Remembrance.
*/ */
public class ModWorldGenProvider extends DatapackBuiltinEntriesProvider { public class ModWorldGenProvider extends DatapackBuiltinEntriesProvider {
public static final ResourceKey<ConfiguredFeature<?, ?>> SHRINE_CONFIGURED =
ResourceKey.create(Registries.CONFIGURED_FEATURE, new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance")); public static final ResourceKey<Structure> SHRINE =
public static final ResourceKey<PlacedFeature> SHRINE_PLACED = ResourceKey.create(Registries.STRUCTURE,
ResourceKey.create(Registries.PLACED_FEATURE, new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance")); new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance"));
public static final ResourceKey<StructureSet> SHRINE_SET =
ResourceKey.create(Registries.STRUCTURE_SET,
new ResourceLocation(AscendMod.MODID, "shrine_set"));
public ModWorldGenProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) { public ModWorldGenProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries, new RegistrySetBuilder() super(output, registries, new RegistrySetBuilder()
.add(Registries.CONFIGURED_FEATURE, ModWorldGenProvider::bootstrapConfigured) .add(Registries.STRUCTURE, ModWorldGenProvider::bootstrapStructures)
.add(Registries.PLACED_FEATURE, ModWorldGenProvider::bootstrapPlaced), .add(Registries.STRUCTURE_SET, ModWorldGenProvider::bootstrapStructureSets),
Set.of(AscendMod.MODID)); Set.of(AscendMod.MODID));
} }
private static void bootstrapConfigured(BootstapContext<ConfiguredFeature<?, ?>> ctx) { private static void bootstrapStructures(BootstapContext<Structure> ctx) {
ctx.register(SHRINE_CONFIGURED, ctx.register(
new ConfiguredFeature<>(Feature.NO_OP, NoneFeatureConfiguration.INSTANCE)); 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<PlacedFeature> ctx) { private static void bootstrapStructureSets(BootstapContext<StructureSet> ctx) {
var configured = ctx.lookup(Registries.CONFIGURED_FEATURE).getOrThrow(SHRINE_CONFIGURED); ctx.register(
ctx.register(SHRINE_PLACED, SHRINE_SET,
new PlacedFeature(configured, List.of( new StructureSet(
RarityFilter.onAverageOnceEvery(400) // roughly like mineshafts List.of(new StructureSet.StructureSelectionEntry(
))); ctx.lookup(Registries.STRUCTURE).getOrThrow(SHRINE), 1)),
new RandomSpreadStructurePlacement(
32,
8,
RandomSpreadType.LINEAR,
1234567
)
)
);
} }
} }
@@ -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);
}
}
}
@@ -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<SimpleShrineStructure> CODEC =
simpleCodec(SimpleShrineStructure::new);
public SimpleShrineStructure(StructureSettings settings) {
super(settings);
}
@Override
public StructureType<?> type() {
return ModStructures.SHRINE.get();
}
@Override
protected Optional<GenerationStub> 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));
}));
}
}