diff --git a/src/main/java/org/betterx/betterend/registry/EndStructures.java b/src/main/java/org/betterx/betterend/registry/EndStructures.java index 867014c2..e6ce754b 100644 --- a/src/main/java/org/betterx/betterend/registry/EndStructures.java +++ b/src/main/java/org/betterx/betterend/registry/EndStructures.java @@ -5,6 +5,7 @@ import org.betterx.bclib.api.v2.levelgen.structures.BCLStructureBuilder; import org.betterx.betterend.BetterEnd; import org.betterx.betterend.world.structures.features.*; import org.betterx.betterend.world.structures.piece.*; +import org.betterx.betterend.world.structures.village.VillagePools; import org.betterx.worlds.together.tag.v3.TagManager; import net.minecraft.core.Holder; @@ -13,7 +14,12 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.heightproviders.ConstantHeight; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.structures.JigsawStructure; public class EndStructures { public static final StructurePieceType VOXEL_PIECE = register("voxel", VoxelPiece::new); @@ -65,6 +71,17 @@ public class EndStructures { .randomPlacement(16, 8) .build(); + public static final BCLStructure END_VILLAGE = BCLStructureBuilder + .jigsaw(BetterEnd.makeID("end_village")) + .startPool(VillagePools.START) + .adjustment(TerrainAdjustment.BEARD_THIN) + .projectStartToHeightmap(Heightmap.Types.WORLD_SURFACE_WG) + .maxDepth(6) + .startHeight(ConstantHeight.of(VerticalAnchor.absolute(0))) + .step(Decoration.SURFACE_STRUCTURES) + .randomPlacement(34, 8) + .build(); + public static void register() { } diff --git a/src/main/java/org/betterx/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/org/betterx/betterend/world/biome/land/DustWastelandsBiome.java index 4be2f5f8..93884346 100644 --- a/src/main/java/org/betterx/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/org/betterx/betterend/world/biome/land/DustWastelandsBiome.java @@ -5,6 +5,7 @@ import org.betterx.bclib.api.v2.levelgen.surface.SurfaceRuleBuilder; import org.betterx.bclib.interfaces.SurfaceMaterialProvider; import org.betterx.betterend.registry.EndBlocks; import org.betterx.betterend.registry.EndSounds; +import org.betterx.betterend.registry.EndStructures; import org.betterx.betterend.world.biome.EndBiome; import net.minecraft.core.particles.ParticleTypes; @@ -31,6 +32,7 @@ public class DustWastelandsBiome extends EndBiome.Config { .loop(EndSounds.AMBIENT_DUST_WASTELANDS) .music(EndSounds.MUSIC_OPENSPACE) .structure(BiomeTags.HAS_END_CITY) + .structure(EndStructures.END_VILLAGE.biomeTag) .spawn(EntityType.ENDERMAN, 50, 1, 2); } diff --git a/src/main/java/org/betterx/betterend/world/structures/village/VillagePools.java b/src/main/java/org/betterx/betterend/world/structures/village/VillagePools.java new file mode 100644 index 00000000..8ab9de07 --- /dev/null +++ b/src/main/java/org/betterx/betterend/world/structures/village/VillagePools.java @@ -0,0 +1,138 @@ +package org.betterx.betterend.world.structures.village; + +import org.betterx.bclib.api.v2.levelgen.structures.StructurePools; +import org.betterx.betterend.BetterEnd; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.Pools; +import net.minecraft.data.worldgen.ProcessorLists; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement; +import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList; + +import com.google.common.collect.ImmutableList; + +public class VillagePools { + public static ResourceKey TERMINATORS_KEY = StructurePools + .createKey(BetterEnd.makeID("village/terminators")); + public static ResourceKey START = StructurePools + .createKey(BetterEnd.makeID("village/center_piece")); + public static ResourceKey HOUSES_KEY = StructurePools + .createKey(BetterEnd.makeID("village/houses")); + public static ResourceKey STREET_KEY = StructurePools + .createKey(BetterEnd.makeID("village/streets")); + public static ResourceKey STREET_DECO_KEY = StructurePools + .createKey(BetterEnd.makeID("village/street_decorations")); + public static ResourceKey DECORATIONS_KEY = StructurePools + .createKey(BetterEnd.makeID("village/decorations")); + + public static void bootstrap(BootstapContext ctx) { + final HolderGetter processorGetter = ctx.lookup(Registries.PROCESSOR_LIST); + final HolderGetter featureGetter = ctx.lookup(Registries.PLACED_FEATURE); + final HolderGetter poolGetter = ctx.lookup(Registries.TEMPLATE_POOL); + HolderGetter biomeGetter = ctx.lookup(Registries.BIOME); + + final Holder.Reference emptyPool = poolGetter.getOrThrow(Pools.EMPTY); + final Holder.Reference terminatorPool = poolGetter.getOrThrow(VillagePools.TERMINATORS_KEY); + + final Holder.Reference emptyProcessor = processorGetter.getOrThrow(ProcessorLists.EMPTY); + ctx.register(VillagePools.TERMINATORS_KEY, new StructureTemplatePool( + emptyPool, + ImmutableList.of(Pair.of( + StructurePools.single( + BetterEnd.makeID("village/terminators/stree_terminator_01"), + emptyProcessor + ), + 1 + )), + StructureTemplatePool.Projection.TERRAIN_MATCHING + )); + ctx.register(VillagePools.START, new StructureTemplatePool( + terminatorPool, + ImmutableList.of(Pair.of( + StructurePools.single(BetterEnd.makeID("village/center/light_pyramid_01"), emptyProcessor), + 1 + )), + StructureTemplatePool.Projection.RIGID + )); + ctx.register(VillagePools.HOUSES_KEY, new StructureTemplatePool( + terminatorPool, + ImmutableList.of(Pair.of(StructurePoolElement.empty(), 5), Pair.of( + StructurePools.single(BetterEnd.makeID("village/houses/small_house_01"), emptyProcessor), + 1 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/houses/small_house_02"), emptyProcessor), + 1 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/houses/small_house_03"), emptyProcessor), + 1 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/houses/small_house_04"), emptyProcessor), + 1 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/houses/small_house_05"), emptyProcessor), + 1 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/houses/small_house_06"), emptyProcessor), + 1 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/houses/small_house_07"), emptyProcessor), + 1 + )), + StructureTemplatePool.Projection.RIGID + )); + ctx.register(VillagePools.STREET_KEY, new StructureTemplatePool( + terminatorPool, + ImmutableList.of(Pair.of( + StructurePools.single(BetterEnd.makeID("village/streets/street_01"), emptyProcessor), + 6 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/streets/street_02"), emptyProcessor), + 4 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/streets/curve_01"), emptyProcessor), + 3 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/streets/t_crossing_01"), emptyProcessor), + 1 + ), Pair.of( + StructurePools.single(BetterEnd.makeID("village/streets/t_crossing_02"), emptyProcessor), + 2 + )), + StructureTemplatePool.Projection.TERRAIN_MATCHING + )); + ctx.register(VillagePools.STREET_DECO_KEY, new StructureTemplatePool( + terminatorPool, + ImmutableList.of( + Pair.of(StructurePoolElement.empty(), 5), + Pair.of( + StructurePools.single( + BetterEnd.makeID("village/street_decoration/lamp_02"), + emptyProcessor + ), + 2 + ), + Pair.of( + StructurePools.single( + BetterEnd.makeID("village/street_decoration/lamp_05"), + emptyProcessor + ), + 1 + ) + ), + StructureTemplatePool.Projection.RIGID + )); + ctx.register(VillagePools.DECORATIONS_KEY, new StructureTemplatePool( + terminatorPool, + ImmutableList.of(), + StructureTemplatePool.Projection.RIGID + )); + } +} diff --git a/src/main/java/org/betterx/datagen/betterend/BetterEndDatagen.java b/src/main/java/org/betterx/datagen/betterend/BetterEndDatagen.java index b6708fd9..485191e8 100644 --- a/src/main/java/org/betterx/datagen/betterend/BetterEndDatagen.java +++ b/src/main/java/org/betterx/datagen/betterend/BetterEndDatagen.java @@ -4,6 +4,7 @@ import org.betterx.datagen.betterend.advancement.EndAdvancementDataProvider; import org.betterx.datagen.betterend.recipes.EndRecipeDataProvider; import org.betterx.datagen.betterend.worldgen.EndBiomesDataProvider; import org.betterx.datagen.betterend.worldgen.EndRegistriesDataProvider; +import org.betterx.datagen.betterend.worldgen.TemplatePoolDataProvider; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.Registries; @@ -16,6 +17,7 @@ public class BetterEndDatagen implements DataGeneratorEntrypoint { public void onInitializeDataGenerator(FabricDataGenerator dataGenerator) { EndBiomesDataProvider.ensureStaticallyLoaded(); EndRecipeDataProvider.buildRecipes(); + TemplatePoolDataProvider.buildStructures(); final FabricDataGenerator.Pack pack = dataGenerator.createPack(); pack.addProvider(EndBiomesDataProvider::new); @@ -27,8 +29,10 @@ public class BetterEndDatagen implements DataGeneratorEntrypoint { pack.addProvider(EndItemTagDataProvider::new); } + @Override public void buildRegistry(RegistrySetBuilder registryBuilder) { + EndBiomesDataProvider.ensureStaticallyLoaded(); EndRegistrySupplier.INSTANCE.bootstrapRegistries(registryBuilder); registryBuilder.add(Registries.BIOME, EndBiomesDataProvider::bootstrap); } diff --git a/src/main/java/org/betterx/datagen/betterend/EndRegistrySupplier.java b/src/main/java/org/betterx/datagen/betterend/EndRegistrySupplier.java index 72f0a9bf..e0a2cd02 100644 --- a/src/main/java/org/betterx/datagen/betterend/EndRegistrySupplier.java +++ b/src/main/java/org/betterx/datagen/betterend/EndRegistrySupplier.java @@ -4,10 +4,7 @@ import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeData; import org.betterx.bclib.api.v3.datagen.RegistrySupplier; import org.betterx.betterend.BetterEnd; -import org.betterx.datagen.betterend.worldgen.ConfiguredFeatureDataProvider; -import org.betterx.datagen.betterend.worldgen.EndBiomesDataProvider; -import org.betterx.datagen.betterend.worldgen.PlacedFeatureDataProvider; -import org.betterx.datagen.betterend.worldgen.StructureDataProvider; +import org.betterx.datagen.betterend.worldgen.*; import org.betterx.worlds.together.surfaceRules.AssignedSurfaceRule; import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry; @@ -17,6 +14,7 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.structure.Structure; import net.minecraft.world.level.levelgen.structure.StructureSet; +import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; import java.util.List; import org.jetbrains.annotations.Nullable; @@ -54,6 +52,11 @@ public class EndRegistrySupplier extends RegistrySupplier { PlacedFeature.DIRECT_CODEC, PlacedFeatureDataProvider::bootstrap ), + new RegistryInfo<>( + Registries.TEMPLATE_POOL, + StructureTemplatePool.DIRECT_CODEC, + TemplatePoolDataProvider::bootstrap + ), new RegistryInfo<>( Registries.BIOME, Biome.DIRECT_CODEC, diff --git a/src/main/java/org/betterx/datagen/betterend/worldgen/TemplatePoolDataProvider.java b/src/main/java/org/betterx/datagen/betterend/worldgen/TemplatePoolDataProvider.java new file mode 100644 index 00000000..a5ce6618 --- /dev/null +++ b/src/main/java/org/betterx/datagen/betterend/worldgen/TemplatePoolDataProvider.java @@ -0,0 +1,17 @@ +package org.betterx.datagen.betterend.worldgen; + +import org.betterx.betterend.world.structures.village.VillagePools; + +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; + +public class TemplatePoolDataProvider { + + public static void buildStructures() { + + } + + public static void bootstrap(BootstapContext ctx) { + VillagePools.bootstrap(ctx); + } +} diff --git a/src/main/resources/data/betterend/structures/village/center/light_pyramid_01.nbt b/src/main/resources/data/betterend/structures/village/center/light_pyramid_01.nbt new file mode 100644 index 00000000..db4feb04 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/center/light_pyramid_01.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/houses/small_house_01.nbt b/src/main/resources/data/betterend/structures/village/houses/small_house_01.nbt new file mode 100644 index 00000000..33fe0cf6 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/houses/small_house_01.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/houses/small_house_02.nbt b/src/main/resources/data/betterend/structures/village/houses/small_house_02.nbt new file mode 100644 index 00000000..de39109a Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/houses/small_house_02.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/houses/small_house_03.nbt b/src/main/resources/data/betterend/structures/village/houses/small_house_03.nbt new file mode 100644 index 00000000..80b41805 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/houses/small_house_03.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/houses/small_house_04.nbt b/src/main/resources/data/betterend/structures/village/houses/small_house_04.nbt new file mode 100644 index 00000000..c052cb64 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/houses/small_house_04.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/houses/small_house_05.nbt b/src/main/resources/data/betterend/structures/village/houses/small_house_05.nbt new file mode 100644 index 00000000..fad43bf5 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/houses/small_house_05.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/houses/small_house_06.nbt b/src/main/resources/data/betterend/structures/village/houses/small_house_06.nbt new file mode 100644 index 00000000..c88c1b07 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/houses/small_house_06.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/houses/small_house_07.nbt b/src/main/resources/data/betterend/structures/village/houses/small_house_07.nbt new file mode 100644 index 00000000..c534bf52 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/houses/small_house_07.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/street_decoration/lamp_02.nbt b/src/main/resources/data/betterend/structures/village/street_decoration/lamp_02.nbt new file mode 100644 index 00000000..f289c38e Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/street_decoration/lamp_02.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/street_decoration/lamp_05.nbt b/src/main/resources/data/betterend/structures/village/street_decoration/lamp_05.nbt new file mode 100644 index 00000000..ceb63084 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/street_decoration/lamp_05.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/streets/curve_01.nbt b/src/main/resources/data/betterend/structures/village/streets/curve_01.nbt new file mode 100644 index 00000000..5ff3b3bb Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/streets/curve_01.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/streets/street_01.nbt b/src/main/resources/data/betterend/structures/village/streets/street_01.nbt new file mode 100644 index 00000000..82312f80 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/streets/street_01.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/streets/street_02.nbt b/src/main/resources/data/betterend/structures/village/streets/street_02.nbt new file mode 100644 index 00000000..3eef3efb Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/streets/street_02.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/streets/t_crossing_01.nbt b/src/main/resources/data/betterend/structures/village/streets/t_crossing_01.nbt new file mode 100644 index 00000000..e93116cb Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/streets/t_crossing_01.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/streets/t_crossing_02.nbt b/src/main/resources/data/betterend/structures/village/streets/t_crossing_02.nbt new file mode 100644 index 00000000..b7c7d1d1 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/streets/t_crossing_02.nbt differ diff --git a/src/main/resources/data/betterend/structures/village/terminators/street_terminator_01.nbt b/src/main/resources/data/betterend/structures/village/terminators/street_terminator_01.nbt new file mode 100644 index 00000000..f9da95c9 Binary files /dev/null and b/src/main/resources/data/betterend/structures/village/terminators/street_terminator_01.nbt differ