From bc75a07d75c729c8a42f9e576e1460c79a328e8b Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 7 Jun 2023 09:01:32 +0200 Subject: [PATCH] [Feature] New End-Village with some special loot --- .../betterend/registry/EndStructures.java | 17 +++ .../world/biome/land/DustWastelandsBiome.java | 2 + .../structures/village/VillagePools.java | 138 ++++++++++++++++++ .../datagen/betterend/BetterEndDatagen.java | 4 + .../betterend/EndRegistrySupplier.java | 11 +- .../worldgen/TemplatePoolDataProvider.java | 17 +++ .../village/center/light_pyramid_01.nbt | Bin 0 -> 1842 bytes .../village/houses/small_house_01.nbt | Bin 0 -> 3729 bytes .../village/houses/small_house_02.nbt | Bin 0 -> 3442 bytes .../village/houses/small_house_03.nbt | Bin 0 -> 2498 bytes .../village/houses/small_house_04.nbt | Bin 0 -> 3644 bytes .../village/houses/small_house_05.nbt | Bin 0 -> 3093 bytes .../village/houses/small_house_06.nbt | Bin 0 -> 2660 bytes .../village/houses/small_house_07.nbt | Bin 0 -> 2527 bytes .../village/street_decoration/lamp_02.nbt | Bin 0 -> 425 bytes .../village/street_decoration/lamp_05.nbt | Bin 0 -> 436 bytes .../structures/village/streets/curve_01.nbt | Bin 0 -> 497 bytes .../structures/village/streets/street_01.nbt | Bin 0 -> 588 bytes .../structures/village/streets/street_02.nbt | Bin 0 -> 563 bytes .../village/streets/t_crossing_01.nbt | Bin 0 -> 463 bytes .../village/streets/t_crossing_02.nbt | Bin 0 -> 751 bytes .../terminators/street_terminator_01.nbt | Bin 0 -> 258 bytes 22 files changed, 185 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/betterx/betterend/world/structures/village/VillagePools.java create mode 100644 src/main/java/org/betterx/datagen/betterend/worldgen/TemplatePoolDataProvider.java create mode 100644 src/main/resources/data/betterend/structures/village/center/light_pyramid_01.nbt create mode 100644 src/main/resources/data/betterend/structures/village/houses/small_house_01.nbt create mode 100644 src/main/resources/data/betterend/structures/village/houses/small_house_02.nbt create mode 100644 src/main/resources/data/betterend/structures/village/houses/small_house_03.nbt create mode 100644 src/main/resources/data/betterend/structures/village/houses/small_house_04.nbt create mode 100644 src/main/resources/data/betterend/structures/village/houses/small_house_05.nbt create mode 100644 src/main/resources/data/betterend/structures/village/houses/small_house_06.nbt create mode 100644 src/main/resources/data/betterend/structures/village/houses/small_house_07.nbt create mode 100644 src/main/resources/data/betterend/structures/village/street_decoration/lamp_02.nbt create mode 100644 src/main/resources/data/betterend/structures/village/street_decoration/lamp_05.nbt create mode 100644 src/main/resources/data/betterend/structures/village/streets/curve_01.nbt create mode 100644 src/main/resources/data/betterend/structures/village/streets/street_01.nbt create mode 100644 src/main/resources/data/betterend/structures/village/streets/street_02.nbt create mode 100644 src/main/resources/data/betterend/structures/village/streets/t_crossing_01.nbt create mode 100644 src/main/resources/data/betterend/structures/village/streets/t_crossing_02.nbt create mode 100644 src/main/resources/data/betterend/structures/village/terminators/street_terminator_01.nbt 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 0000000000000000000000000000000000000000..db4feb0466b6512c03a2f3324efbc7b7a0dd5335 GIT binary patch literal 1842 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 E0J*3C>;M1& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c052cb6460d128ff023bfafe66d2c557c5b69d0a GIT binary patch literal 3644 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fad43bf50b9bf3df9075f79f35515ab4d7dc8fe5 GIT binary patch literal 3093 zcmYjS4Lp-;8@G_cY5GOxV2+QLL?#KbcHYwBJw?Tg^0BpWD0=giMM%e1taYTO08_y8hSyxo42NNn!o7R-5%x z#8{J7a;C!f@LM~hM|*W{>+{}Slu5- zx8`}uFa*5-kJsVe^M&%9&Z=wIQNLT0RnsMt34}7Mz$@9eO5)VEg1k*yJ{n55}4@WI-Hb~!mERvY7Q?UtMmgJ&I$D<1yUZp%} zbhf#k7P8T}TOC(qf3geAI&=?fL}4KM)H~0Ue?PbtJ=uxxN;jK?8B;caNC$MsL1p7^ z#XvtdP2wqKW8ZBJA79#W^Tj?^u6YQRV<>t>L#hv4+bK4ZD8_78x$o6zqS|D3--CGe z$h)$$Sx#22`3SyQQ(4NTQ?Koa1(gcMOIc=<&6*e{CB$`upa!W6V0qHHR}k#uoP7-i zswj8CJ+(2-9B#Qn`sOk7(u6lQhDJzSOxo4&(+(=}IGeXl;L(x?4IvDzF|XHlo>s0! z2o?4I7D2AZNw-IzZV9Xz7vbfr&6u%8DZ_!`Al$IF#I9lF_gq+CDZ}5L}&k{ z9-~*KLA|fOfbVR(Oz^2kG8J@L&mT!1GfBBrd{&Q**oiMzMo8&RJsZ?xapd!9yO+^2 zy1NphkkANm}ekY7^!d8Poc%)7*qwILb#HuzzbJn>(C>om3iggov}oBTnT_^*G4eY z?nk4|jjbR?z(_vifM8Zart`q$g(S;-&>emodEvg2m_?(8QXlPY@WyYm*T@3}s;Ij6 zO`8)jywRWrYf9M^IMb#LLwTZaCY7n8@PPE1Hq&4gUU>G4?S{Cbot|CWVkc)s2YT2s zWj^DaBR5D~MzEV^A3z+J7Fiy(N&qMDfm*`#`&)=6@TV^iqs@i?XYFLjUhDvQaU!ND zI>dr2dyim<;@aha#G6{j@`=SsX^}upM6bYz$`=?oHDG@ajaX2jiSEE?(?7b6%st1@0?fLSt#f{>!y-6gmK#s8+?zX{bAt zkda9&`ItBe9gzS$3)YBsTOM$N%pV(sSJ^_J-9a*<5(PREN0l6qp z)3_UiykRA11;3a}ELs}$j?G&`{YXk%FN=!NMuP&zp$Mr@1303!8|ne~0Myz&#BUs| zyQ4W!2H)Hfu=#c~@GD2{{$IfkgdiY-He~_N15mS$1^o|yYphfPLFed0(G`jSTJEFz z_Z(YCM2aD*$JL-LSm!|28xhjjbD$Fv`(%ojDYVxe+8dEFMY=(1+qLcy<@R0+WUc=3 z)u2`I0lOS_W}!3pxdGd94gXm%I{3+VPUa%H%wOuc%AM#FwG+BcAC^@0htyuEey1-V zeX|9B<~g1_us=W^c=>4Dfr{UKZ$FF-4e;8Wi_wcdIAsf8TMDE$v+{gw;Ha2r%$4`I z4__#%EYl9C(9N*$7d||ielry-7GL<~@|Z0y==k0}Cw2s1D4GkcjFp%tEdNlkvh>XR z$2gJyS6r1Gk0v;eyN7#@yGvUFvC+O&wUT9r#icTM zOLao~wTyrWQU~5veGva6;rTR&|A8^=Z25Nn(kXI3$6yctA5F8TkA7^S8S%4U_+B1# zvFRNQ;OZYWuqAt6+(RR8ZH}tcHMz*QDU_=W)#ZNitxDK1GUSpzGHALFSv@`YYi_KQ zjp(g@s~@8hj|whIg>4A6cF`y>!E<$gdo^L*R&!8?R%stYk#+hzu1ut6hUCOp{DNBP ztA8xQWfdp9rN&&?+L<)4W$S=i=Q;jbt<|5sSX=o>{AR3P35*~LtT7s#Ntwmf59||# zRShuV7hNf}ncFWEqkRN}>eyE87Y2{nv=DBeEn5`xRjLv)C2eObW`5vEF)D&3$Ob z@6Mr|_&)hR-R?`z-Ttf=f8chMoW~_Pme(?bPRERVHR~~3R-eyIEzCu6Iblepf8kfK zp?R`xOUTfu*!cs6?3D};87w%5)3leLNvN$qo#W52t$2L*lBIim!@F7JHnl1fTNY-S z6Iq_s*$+GHBoFVmxwN-NQL31YxbD>TUb)g Q8h-^|{UwTSc~L>(KPSflD*ylh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c88c1b07f80dcfc25a58e36af1966b07b06e9471 GIT binary patch literal 2660 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f289c38e154c2306f20f00fd8e7b6d3ab3ad81b5 GIT binary patch literal 425 zcmV;a0apGWiwFP!00000|D94jZ`?2prO&=Z_91AHG40+ZTebk%vUCYLbqNB4wrQUd zSu`Xj*YpSUcUQU(AK)`GRDfWMAMcTTEC6!Iy#7Ne0K}VwyNur)6j{-t$wNFjoK=SF zS6{@49MXaPAt{~(Y#&Q6D74R*#-x*&WF{t?#4MnI)K;Qk`NG-?D96TNWk^A0u_w5! zNQ4~O=B{E9?t^1sHt?m_mTHHs+)+Qshk{kBEt+zN{o|O|8hmG?h01{%3U2eXMqdU) zf8V0gx|+F%j?;h=rC{xlU${J*&1dCnYg#0 z#%dEto#C#d2A10~soioxayv47KQe?Hq+m-?5QDWuvKrs1XYc=qZY23S*M>nGY<3E~ zVyDBVqi7DkhBvmf>|{NHo#=W}+F@75uJdtSM$=xCqGt2f+fsNK3BG-{h(XTP0}B2k T=VOI%@fZF91EhQ@w*vqGS$WA- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ceb630840fec87c52ac2a5dd173d84034d9fd650 GIT binary patch literal 436 zcmV;l0ZaZLiwFP!00000|9w);PNYB(t{FgqiCMEJjXr`;VB*b-myM^rY&N7AYM9oh zi*(m4>I3X^Z#N^bVThe{pt`>L>gTH*AcNSc4~hUF+?Bsc_-2rj5haQogp#L@G6Jb(t+CXULTs=hxGYJ8 zESc)QWD#z>qh;3ctx<-y7I$(_O)KvyY<9|^E{@z!Q`{fLnzl-)XsIIa*1z`X3jfeN z>`*(p3#L}}UOw%f;^CO@cM5A&!R3_hMb!?w6wU-~O>$b|LgO%NJQ^Dh#a zAvT@QXFaN>3X*<8UN6T7*$9qbYiQXdxDRps|drC22a;dR|4UT(Q&4_DHZ; z$;f)M#H!KwH!~;RuvLElQ51V$#hodR4Gd%_YM+!gY|uE6Y+R!MX4ET{Z&@E2KWuKt e1h-$Urx$tih=M=Kx=0N>I{8W=fL+d5VGl zfd1~1brch^#1j1&S^_r+eE06XJBr)^Y@x8?E9L;;qj6FB*g}Jf1PQd@*A}W)>h6o( zxsTf|&eo-jp#*{on>yVyHBdfip$HnI zrR1%|1`5Rw2-htVp+VK(wVFsD+{UQ2gm>qSN8xe?d~eAh66>+khLh0BHgI(>6qoE& z@a7;Cc81^6ox@HYO$OPc7JUPm=;8Xj{U8R*j}27B&46?%W2KRyx%_`IS1wHV!d%Uz z7!>vk-cHhIZ*SJT{S`we>V;|f2(QiJXNGQrE=@xALJiDa_=c+vXKy!`-u8O3_~)#} zR4iPgn-`Zv`7e*Ho<|oLsvM>sx%8R-p{V7Rqx1~?de?(Ti>C`wC!93sPiU7JDY1!K5>osak;(G=m8|W--EqGx9_;m?`g$ zney(KDes4QO!#ulVn&`|1~b*4=!~9VgjvjBrt~-_obc|>PvSA*NS}Q@(Fo(`iAVYq zJ*l;XP?k1>_(5@LA=63-Rtn4@l5B%;U81$9QP%gRvQ}+qqf<)2$K%E$rkI;3!}W3dfj5S2Ge|7c4cb!~ zBhB_3kUTe+GQk^(we$AQOWJc$bJ-Mh&1fbobT)5KZMLd6_aiAg&qh9txL zcSXv-4DQ|@OHyu&dZP$(kx_9nebm}Tl)H#t-wQT=Aji{z_|QG9(|$<`nYn% z9(|JCFwQgko`VyNkCw}`Wg-WYdU&>s%d=%%ek|kilX=Y4GOqo}J#yt9T7?HQ_t2Vq z^ttiqW1p}6?6VWkPUv8w39UmWzJPIQ*}1zs=N^om#Y;a0grcGh;s?nELCRX*2&^-R z1Y0BAR!D>jMg3KiLNsL5N!h~t@x~)>Th`#0Eub@)-*ds*aw~GT<^q?B-P6#aUsA8I ze3aZs%yTDjD^u+%wIG9y*!K^AtB-b|2r&F^kYg|gjh)eNL#T*p000)r B6*B+; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e93116cb1401f22cea831d9fa4ccc4f7383b04d0 GIT binary patch literal 463 zcmV;=0Wkg_iwFP!00000|J9W}Z`&{shR^z>9R$dhwpqJ(&)m7_)K#FYi_BE!3FIjT z@&od_OVwtq*fLAB=nw%M1U~QG`<_0y0$4(3)ib65Fs|aT#1aH*R;nPb+)RffD~JPXgudIZ$>8H2ro9$CSP7M&)=kmCo1<#O&o1xL%XUq(%Pz*ym6CUeK*vj84pP}1TxAU znZG|nD2Kj6IjM9OJ1pO!YiUU2{;>x7f5h;2;5U?v1JSTPZUq3S_~st1_^2Gg&3u!DI+ z=nT<3p@YnTp)+JKA%ht)>Y?TW8EP(&$r;R;Q4cj=$Q&}5BL+kDDl(jTKV~o|1oNoA>lB%k!DI|(%wVVhsyC3y89G$|AVbZ?XiLqz7^>!op%XE5;%6|_ z9-eH`*&M@!p_4LnQie{(7@urQu1zLq=;REYF+&H>68*hpxPv(&7~B&E3}(b&at3qE zU`_}I*Ul-yM2vc{H_}H;20=Y_35>3_svRUoSCyDnGJ&ubw-P2(>6|pOF3+dhIeqIN zG+I~idHvu{`Ix!Qo+3lYy!hJK>KN5^K&BdZp^IDeZ?Nd** zRaL3#dEr0YjHqW4ZJs@~d8Jz`|DH9fiY*^`U61x(?9tx3O#Ta(ljpeXEraD^Lu(&) zt;T<{1eelV-a?BFv}Y)O&4$92q5g3*dCi8#D?|Nvce-~A3tb*Qa+yNhh^iCmPNkWz z{A=g#<2t3+_GRi?7E_~UHx`h2zs~LNB~rH5JpjGp?3F0>eK9w}+M*He$`5b$&FDs& z?(aZ99@;2h_~P{lN!t{)Hl9MMCqqES$39+)UM0^9@6ub{zC8WCw618Im!@A>|AY8N h?JtjyyP>1Q1IRCg6W^t=T?8Ebg5Nqbyx;g0007}1Yr6md literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f9da95c9d7831e7f3aa39d9d175233fd6f4c9c21 GIT binary patch literal 258 zcmV+d0sa0TiwFP!00000|7B3iPQx$|oHl(psSq41K7})9#EEOsm7xk_xBLE5)i<%tr7mv~`BgWZ9h9qM1| z{RNI1rdFpw^}BE)UUGL$d*nXa4}*=`(38$DVs2yc&&DFnY`q;wl}^r+%BL*<{z|3m zk~VQvH-S?^$$9l0#8b%WCHWFKWoebg!9@u0EC@@DgXcg literal 0 HcmV?d00001