From f8018cb6fc54e25f566d0e76c3a842da7374f5f5 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 24 Sep 2024 14:48:34 +0100 Subject: [PATCH] Improve changeling hive generation. Fixes #398 --- .../unicopia/server/world/UWorldGen.java | 6 ++ .../gen/CaveCarvingStructureProcessor.java | 36 ++++++++++ .../gen/SurfaceGrowthStructureProcessor.java | 67 ++++++++++++++++++ .../changeling_hive/entrance_large_lower.nbt | Bin 0 -> 4916 bytes .../changeling_hive/entrance_large_upper.nbt | Bin 0 -> 4511 bytes .../floor_decoration/empty.nbt | Bin 0 -> 282 bytes .../floor_decoration/slime_1.nbt | Bin 0 -> 327 bytes .../floor_decoration/slime_2.nbt | Bin 0 -> 329 bytes .../floor_decoration/slime_3.nbt | Bin 0 -> 327 bytes .../floor_decoration/spikes.nbt | Bin 0 -> 313 bytes .../changeling_hive/roof_decoration/empty.nbt | Bin 0 -> 271 bytes .../changeling_hive/roof_decoration/slime.nbt | Bin 0 -> 327 bytes .../roof_decoration/spikes.nbt | Bin 0 -> 303 bytes .../processor_list/changeling_hive_decay.json | 17 ++++- .../changeling_hive_entrance_decay.json | 32 +++++++++ .../changeling_hive_surfacing.json | 13 ++++ .../structure/abandoned_changeling_hive.json | 2 +- .../changeling_hive/chamber_decors.json | 16 ++--- .../changeling_hive/floor_additions.json | 50 +++++++++++++ .../floor_additions_termination.json | 14 ++++ .../changeling_hive/main_entrance_shafts.json | 14 ++++ .../changeling_hive/pit_decors.json | 20 ++---- .../changeling_hive/roof_additions.json | 32 +++++++++ .../roof_additions_termination.json | 14 ++++ .../template_pool/changeling_hive/start.json | 22 +----- 25 files changed, 305 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/server/world/gen/CaveCarvingStructureProcessor.java create mode 100644 src/main/java/com/minelittlepony/unicopia/server/world/gen/SurfaceGrowthStructureProcessor.java create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/entrance_large_lower.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/entrance_large_upper.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/empty.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_1.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_2.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_3.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/spikes.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/empty.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/slime.nbt create mode 100644 src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/spikes.nbt create mode 100644 src/main/resources/data/unicopia/worldgen/processor_list/changeling_hive_entrance_decay.json create mode 100644 src/main/resources/data/unicopia/worldgen/processor_list/changeling_hive_surfacing.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/changeling_hive/floor_additions.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/changeling_hive/floor_additions_termination.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/changeling_hive/main_entrance_shafts.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/changeling_hive/roof_additions.json create mode 100644 src/main/resources/data/unicopia/worldgen/template_pool/changeling_hive/roof_additions_termination.json diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/UWorldGen.java b/src/main/java/com/minelittlepony/unicopia/server/world/UWorldGen.java index c7c781a6..5100d075 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/UWorldGen.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/UWorldGen.java @@ -6,7 +6,9 @@ import java.util.function.Consumer; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.block.ShellsBlock; import com.minelittlepony.unicopia.block.UBlocks; +import com.minelittlepony.unicopia.server.world.gen.CaveCarvingStructureProcessor; import com.minelittlepony.unicopia.server.world.gen.OverworldBiomeSelectionCallback; +import com.minelittlepony.unicopia.server.world.gen.SurfaceGrowthStructureProcessor; import com.minelittlepony.unicopia.util.registry.DynamicRegistry; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; @@ -23,6 +25,7 @@ import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.BiomeTags; import net.minecraft.sound.BiomeMoodSound; import net.minecraft.sound.SoundEvents; +import net.minecraft.structure.processor.StructureProcessorType; import net.minecraft.util.collection.DataPool; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3i; @@ -120,6 +123,9 @@ public interface UWorldGen { .build(); }); + StructureProcessorType SURFACE_GROWTH_STRUCTURE_PROCESSOR = Registry.register(Registries.STRUCTURE_PROCESSOR, Unicopia.id("surface_growth"), () -> SurfaceGrowthStructureProcessor.CODEC); + StructureProcessorType CAVE_CARVING_STRUCTURE_PROCESSOR = Registry.register(Registries.STRUCTURE_PROCESSOR, Unicopia.id("cave_carving"), () -> CaveCarvingStructureProcessor.CODEC); + @SafeVarargs static T applyAll(T t, Consumer ...consumers) { for (Consumer consumer : consumers) { diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/gen/CaveCarvingStructureProcessor.java b/src/main/java/com/minelittlepony/unicopia/server/world/gen/CaveCarvingStructureProcessor.java new file mode 100644 index 00000000..cfb2db26 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/server/world/gen/CaveCarvingStructureProcessor.java @@ -0,0 +1,36 @@ +package com.minelittlepony.unicopia.server.world.gen; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.server.world.UWorldGen; +import com.mojang.serialization.Codec; +import net.minecraft.structure.StructurePlacementData; +import net.minecraft.structure.StructureTemplate; +import net.minecraft.structure.processor.StructureProcessor; +import net.minecraft.structure.processor.StructureProcessorType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.Heightmap; +import net.minecraft.world.WorldView; + +public class CaveCarvingStructureProcessor extends StructureProcessor { + public static final Codec CODEC = Codec.unit(new CaveCarvingStructureProcessor()); + + @Override + protected StructureProcessorType getType() { + return UWorldGen.SURFACE_GROWTH_STRUCTURE_PROCESSOR; + } + + @Nullable + @Override + public StructureTemplate.StructureBlockInfo process( + WorldView world, + BlockPos pos, + BlockPos pivot, + StructureTemplate.StructureBlockInfo originalBlockInfo, + StructureTemplate.StructureBlockInfo currentBlockInfo, + StructurePlacementData data + ) { + int topY = world.getTopY(Heightmap.Type.WORLD_SURFACE_WG, currentBlockInfo.pos().getX(), currentBlockInfo.pos().getZ()); + return currentBlockInfo.pos().getY() > topY && world.isAir(currentBlockInfo.pos()) ? null : currentBlockInfo; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/gen/SurfaceGrowthStructureProcessor.java b/src/main/java/com/minelittlepony/unicopia/server/world/gen/SurfaceGrowthStructureProcessor.java new file mode 100644 index 00000000..33ef60c7 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/server/world/gen/SurfaceGrowthStructureProcessor.java @@ -0,0 +1,67 @@ +package com.minelittlepony.unicopia.server.world.gen; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.minelittlepony.unicopia.server.world.UWorldGen; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.block.BlockState; +import net.minecraft.structure.StructurePlacementData; +import net.minecraft.structure.StructureTemplate; +import net.minecraft.structure.processor.StructureProcessor; +import net.minecraft.structure.processor.StructureProcessorType; +import net.minecraft.structure.rule.RuleTest; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.random.Random; +import net.minecraft.world.ServerWorldAccess; + +public class SurfaceGrowthStructureProcessor extends StructureProcessor { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + RuleTest.TYPE_CODEC.fieldOf("input_predicate").forGetter(rule -> rule.inputPredicate), + BlockState.CODEC.fieldOf("output_state").forGetter(rule -> rule.outputState) + ).apply(instance, SurfaceGrowthStructureProcessor::new)); + + private final RuleTest inputPredicate; + private final BlockState outputState; + + public SurfaceGrowthStructureProcessor(RuleTest inputPredicate, BlockState outputState) { + this.inputPredicate = inputPredicate; + this.outputState = outputState; + } + + @Override + protected StructureProcessorType getType() { + return UWorldGen.SURFACE_GROWTH_STRUCTURE_PROCESSOR; + } + + @SuppressWarnings("deprecation") + @Override + public List reprocess( + ServerWorldAccess world, + BlockPos pos, + BlockPos pivot, + List originalBlockInfos, + List currentBlockInfos, + StructurePlacementData data + ) { + Map positionalInfos = currentBlockInfos.stream().collect(Collectors.toMap( + StructureTemplate.StructureBlockInfo::pos, + Function.identity() + )); + + return currentBlockInfos.stream().map(currentBlockInfo -> { + StructureTemplate.StructureBlockInfo aboveBlockInfo = positionalInfos.get(currentBlockInfo.pos().up()); + BlockState currentState = aboveBlockInfo == null ? world.getBlockState(currentBlockInfo.pos().up()) : aboveBlockInfo.state(); + if ((currentState.isAir() || currentState.isReplaceable()) + && inputPredicate.test(currentBlockInfo.state(), Random.create(MathHelper.hashCode(currentBlockInfo.pos())))) { + return new StructureTemplate.StructureBlockInfo(currentBlockInfo.pos(), outputState, currentBlockInfo.nbt()); + } + return currentBlockInfo; + }).collect(Collectors.toList()); + } +} diff --git a/src/main/resources/data/unicopia/structures/changeling_hive/entrance_large_lower.nbt b/src/main/resources/data/unicopia/structures/changeling_hive/entrance_large_lower.nbt new file mode 100644 index 0000000000000000000000000000000000000000..2a6cd5e5994ef45fe5dd4ab84793728f0e7166c4 GIT binary patch literal 4916 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_1.nbt b/src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..86e553a77752d5174b62baff89541c6e09856ef5 GIT binary patch literal 327 zcmV-N0l5AjiwFP!00000|BX;hPs1<__11N?odjqXega3tb!X0q6W7X1-7F(bqQqqy zzaD3UO>7q;S&hFLOSQ~*G(iPSXTHB{u-u%QI`)G%LLuRcq%~Zw6O)ny9@TYz=h_`5KJB?O ZEm{{Z$oNh%WenUhd;>5yS9Uf6008VtkM{ro literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_2.nbt b/src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..185d053bcaa849240b629405dc0ef9cc9b260772 GIT binary patch literal 329 zcmV-P0k-}hiwFP!00000|BX;hPs1<__10~)odjqXega1%jyrQkoVZqA>ZTcK93?5! z`1Lp&Y+}0*$%>r#`F+#?70jafq5=SNO{AvzuAn5BOfnQ9p9&Tm%jzT6d7^^CbNmIt z4^WzUOql5KQbXZ3sf78KjZ07lwiY**N|-qu2p&gg6nlef)uYp7jnhqUKIy5m%%Q=y z6?%3u@0l&!4aSiQ*rhcMKJ80bcE+J?j+76lb#V+GDr!_Ocvry6TWJTe)A(RGn6y8N zT}85_GRL2f5~ikw`!n6v=!m-#772r<^l#;G9TQx{G?AGbkCsxRL$Wp0Z-G69oV-}v z$y~6kHMKDB&_>B`u6UG0C(j~v_L{Rin;-U30EWldkk)XyPE1M;cu-fjymL+DG4-cK bSFT0u@&yyVQ-~P^w+X%hp_V2{Hv#|v<29Gh literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_3.nbt b/src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/slime_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..53574e14b0c8f8321f46475426f3f1fea79b46e1 GIT binary patch literal 327 zcmV-N0l5AjiwFP!00000|BX;RPs1<}y*5orQVCEOegY!{TW4m(#2Q_li|gXpmVKcr zzn*got!Ni4ovgF(-TP<&YM3SSMFjxlnn+FaT|-5V4I4_3PYv_6_39%vd7_3Q`1A{c zAD}d4Vq`kJG*GxTS5R)faST=T*5cYy1v7^O!Q<$R^1@{b3Hb3l>0E{0~OIpL_Ix#6Z;89)Ycdp%0;?tfh Z)1r0pf{gDJQ^vq8!#Av(Q=>Kl007qdn^^z= literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/spikes.nbt b/src/main/resources/data/unicopia/structures/changeling_hive/floor_decoration/spikes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..c3932214c36bf1478af26bef2737f593157af818 GIT binary patch literal 313 zcmV-90ml9xiwFP!00000|BX>iPXaLz9azBKB~imce}YHvoIM*)UYlWeb{XilO*=^N z*E+1tmFQVM>r!1+$g)%{JA!qkQiHVY>0`1j^{G#g(NJCJqOJhn?fb2gYTyM%R;N*PAuJ(PL-5j|SUT z>Alnb;Jt;LfgLpwJ6X~Yf{Ik>wY^x2_Ffw%fi7tpyHQqOo&()ztKdrER1^T(j-nm?i7E5(#Ca4qlw L4FAa=A_4#aTq%?h literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/empty.nbt b/src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/empty.nbt new file mode 100644 index 0000000000000000000000000000000000000000..bd44b266639761e1f44abb40d6834671cbebd6c2 GIT binary patch literal 271 zcmV+q0r37GiwFP!00000|BaB#P6IIvMK4Sr=~SYqAHkM=*Q^mMwj|_OF4#t*mkX{moALL`Q>(QtVm( z3!F7n!KbUOuc|P16fw(PgnIz^nqh>nJ>#wnVZgW(?e*EoU%cTo{P9Yh&g)x VL`tt5Q`x|s;sYzGLBF>F002Eig!cdd literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/slime.nbt b/src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/slime.nbt new file mode 100644 index 0000000000000000000000000000000000000000..521802b8222631121cec0b2a68a8e0dd04e2905d GIT binary patch literal 327 zcmV-N0l5AjiwFP!00000|CNzJQ^GJ1g%?U8Ei>Y9@F#fn&e^l$$!lk6w`DO+GRam3 zf4vC^Dtf@oWOCTIZ{L0?0ScG|ey0oo(jA@N0u&ixVG58=0n@d%^=l}TqJYfVaB4cA z4Dui-^x1K#8C_^bP(o(bq9ET|HUi39t#PeM!Ng!sa6cHXtz%r(8#EnhHeI#hH+t~a zwiPx_OlVD%J8Ly8dNx#hY-L5glf8m@%La9IoVfVr7W+&FOQ*4>K5kk$&(^c-j~SPN zG}X!bM?t}u8@T-%v*j+}PQg^rcO=&a{sYeV0?s&UW)3xp(1Cdg<+HbreEJg=Yj#JT z8pvDJAri~O1|22eCgz+xC4P73I6-qyl^cQ#n&4Wm8r^@r<`GupiH9|3gR2OGoK1eA Zi!09`QSgO)NF8t^@BxT&kzkhs0045jlU4u# literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/spikes.nbt b/src/main/resources/data/unicopia/structures/changeling_hive/roof_decoration/spikes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7a388fabc20f4bec549d75eba9bcd8dab663ccbc GIT binary patch literal 303 zcmV+~0nq**iwFP!00000|BX@2Zo)7OHnc!mq%m>e5q903^Ul*wyH+N3iy=*-#0;^g zUjiE2;4({A6vh7jQUg>_M*gG%0CJB~kMmi9A}cIR5pq>9-596$vCb0}6yC+}rE3*1 ziGo7sOAUqHh=R$^u@z9k8G{=`3QCIu!PCLAcAjyqw`hAZZ2M-*AM_lY>l$p^#O`bw z_s$tu3~WgU>|{-Ymy?2d#}-XEa39X-CY({4nRzrMLgzedsNaI~6ms5)u|u7}p={mJCSm1k z4s3N}v5B7d>3eRL=gCnrjb|;hgKv%$