From 7f0c483cb18f6a8bf12a7bb23e62f39ba099dc83 Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 10 Feb 2025 11:36:31 +1100 Subject: [PATCH] improved meteor dungeon stair piece, added loot fallback, and prevent structures generating too far horizontally from the start point --- .../java/com/hbm/main/StructureManager.java | 1 + .../java/com/hbm/world/gen/NBTStructure.java | 18 +++++++++-- .../com/hbm/world/gen/NTMWorldGenerator.java | 30 ++++++++++-------- .../meteor/room10/headloot/loot-fallback.nbt | Bin 0 -> 496 bytes .../structures/meteor/room10/room-stairs.nbt | Bin 1797 -> 3381 bytes 5 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-fallback.nbt diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 2456533ff..d7881ba66 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -48,6 +48,7 @@ public class StructureManager { public static final NBTStructure meteor_dragon_tesla = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-tesla.nbt")); public static final NBTStructure meteor_dragon_trap = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-trap.nbt")); public static final NBTStructure meteor_dragon_crate_crab = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-crate-crab.nbt")); + public static final NBTStructure meteor_dragon_fallback = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-fallback.nbt")); diff --git a/src/main/java/com/hbm/world/gen/NBTStructure.java b/src/main/java/com/hbm/world/gen/NBTStructure.java index 43625a627..6ec619378 100644 --- a/src/main/java/com/hbm/world/gen/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/NBTStructure.java @@ -650,6 +650,10 @@ public class NBTStructure { // Maximum amount of components in this structure public int sizeLimit = 8; + // How far the structure can extend horizontally from the center, maximum of 128 + // This could be increased by changing GenStructure:range from 8, but this is already quite reasonably large + public int rangeLimit = 128; + // Height modifiers, will clamp height that the start generates at, allowing for: // * Submarines that must spawn under the ocean surface // * Bunkers that sit underneath the ground @@ -967,7 +971,8 @@ public class NBTStructure { if(fromComponent.piece.structure.fromConnections == null) continue; - boolean fallbacksOnly = this.components.size() >= spawn.sizeLimit; + int distance = getDistanceTo(fromComponent.getBoundingBox()); + boolean fallbacksOnly = this.components.size() >= spawn.sizeLimit || distance >= spawn.rangeLimit; for(List unshuffledList : fromComponent.piece.structure.fromConnections) { List connectionList = new ArrayList<>(unshuffledList); @@ -1013,7 +1018,7 @@ public class NBTStructure { } if(GeneralConfig.enableDebugMode) { - MainRegistry.logger.info("[Debug] Spawning NBT structure at: " + chunkX * 16 + ", " + chunkZ * 16); + MainRegistry.logger.info("[Debug] Spawning NBT structure with " + components.size() + " piece(s) at: " + chunkX * 16 + ", " + chunkZ * 16); String componentList = "[Debug] Components: "; for(Object component : this.components) { componentList += ((Component) component).piece.structure.name + " "; @@ -1070,6 +1075,13 @@ public class NBTStructure { return nextPiece.structure.toHorizontalConnections.get(fromConnection.targetName); } + private int getDistanceTo(StructureBoundingBox box) { + int x = box.getCenterX(); + int z = box.getCenterZ(); + + return Math.max(Math.abs(x - (func_143019_e() << 4)), Math.abs(z - (func_143018_f() << 4))); + } + // post loading, update parent reference for loaded components @Override public void func_143017_b(NBTTagCompound nbt) { @@ -1152,4 +1164,4 @@ public class NBTStructure { } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 3d9306b28..f68921cb3 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -50,23 +50,23 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); Map bricks = new HashMap() {{ - put(ModBlocks.meteor_brick, new MeteorBricks()); - }}; - Map crates = new HashMap() {{ - put(ModBlocks.meteor_brick, new MeteorBricks()); - put(ModBlocks.crate, new SupplyCrates()); - put(ModBlocks.meteor_spawner, new CrabSpawners()); - }}; - Map ooze = new HashMap() {{ - put(ModBlocks.meteor_brick, new MeteorBricks()); - put(ModBlocks.concrete_colored, new GreenOoze()); - }}; + put(ModBlocks.meteor_brick, new MeteorBricks()); + }}; + Map crates = new HashMap() {{ + put(ModBlocks.meteor_brick, new MeteorBricks()); + put(ModBlocks.crate, new SupplyCrates()); + put(ModBlocks.meteor_spawner, new CrabSpawners()); + }}; + Map ooze = new HashMap() {{ + put(ModBlocks.meteor_brick, new MeteorBricks()); + put(ModBlocks.concrete_colored, new GreenOoze()); + }}; - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition() {{ minHeight = 32; maxHeight = 32; sizeLimit = 128; - canSpawn = biome -> biome.rootHeight >= 0; + canSpawn = biome -> biome.rootHeight >= 0; startPool = "start"; pools = new HashMap() {{ put("start", new JigsawPool() {{ @@ -116,6 +116,7 @@ public class NTMWorldGenerator implements IWorldGenerator { add(new JigsawPiece("meteor_dragon_tesla", StructureManager.meteor_dragon_tesla) {{ blockTable = crates; }}, 1); add(new JigsawPiece("meteor_dragon_trap", StructureManager.meteor_dragon_trap) {{ blockTable = crates; }}, 1); add(new JigsawPiece("meteor_dragon_crate_crab", StructureManager.meteor_dragon_crate_crab) {{ blockTable = crates; }}, 1); + fallback = "headback"; }}); put("fallback", new JigsawPool() {{ add(new JigsawPiece("meteor_fallback", StructureManager.meteor_fallback) {{ blockTable = bricks; }}, 1); @@ -123,6 +124,9 @@ public class NTMWorldGenerator implements IWorldGenerator { put("roomback", new JigsawPool() {{ add(new JigsawPiece("meteor_room_fallback", StructureManager.meteor_room_fallback) {{ blockTable = bricks; }}, 1); }}); + put("headback", new JigsawPool() {{ + add(new JigsawPiece("meteor_loot_fallback", StructureManager.meteor_dragon_fallback) {{ blockTable = crates; }}, 1); + }}); }}; }}); } diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-fallback.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-fallback.nbt new file mode 100644 index 0000000000000000000000000000000000000000..2ce40e05361be4b5b18f5027d05340eb569c0e16 GIT binary patch literal 496 zcmVU$UhE7Y1=fjMqyW(O*mh=nkV1lu5k_DKeM=$Q zNmc&nGCO&b0&P_{291qS2s^_K-bXyf5D!e?fuRc+;=zY_@F5<2hzFm*gHJH>KEh-` zo1LLRYth(g)Q|WtJ9QnJK-{z~$ z$8BD0H~IUo-!^#y;axr9x!oE|&G+V_yu!{T5QqxSjF5O|fZxRpZ>mBnWo9TJ9*az1 zf`5)RjXB&Wn7}N_>}y{y6{2|K9L8X$b(Ph!6%yG^F$b| z*Ic4;pW=3y_D>kgAX{tIqVAu#%3!fFuzMBNSd0)f95q;QVg2LJ$qLiRfV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-stairs.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-stairs.nbt index 635f3d95efe29b441c3537b34b14ad8abe05a840..7cef44a647d8591ef5d7eaaabf85f928829c0cf4 100644 GIT binary patch literal 3381 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 literal 1797 zcmai!2~bl<7{>uciw8P9l_-*Qti%xn6R>#Dz-ZG_?W3qjzynBp6Cw};%H^{tirAEz zF~vblh(O6$w15YP2Sm{r4N3?R0|sIdFT!xVU=1%2(WDz`r^j^cn{RgZ+x_0|Z~yy! zOFH(E!^C&_bQsSgboQ5$h1T^OGS(NaUiahVt(Mt`lRw`0@Lq|?&H2Rf{DrIfzK_2X zde8Tp8+wt0`@9}lr;EW4T;e}sFLh^M8Mf}0Y~EnAHjadNv(Zfq>_u5n8rE3wjDJj` zHk-B9nu7b;?mwe?WBs}8u;y2Mi}g})U6W5M6=Id=jl-gFwVfCF?C1&%3 z-K4l_rL;Oeu3EdC6x`F3te3scy4i$(zCE6#lc+0N_+;;%kTfBN@eX9~yK2m+^v8_N z;e4Lfl{TuuPvI}R@wjgOyEiJ6f4BtSJ^t!#o66rkv)foV#HBwTG>MK=OczH=IrD0S zraQ5ko*^8KFJx93P^saIe;QkA_`5|$Y6!@aYVYby`1p>Oo|ODdxOqG2;$;Qw2B*a; z`tmL(UL+yh^J`|ccAsrMLM7KS(u|b0dPQfwPQ2%WVNHONpv40NS_9g$j?G z_+W?tzmBdFB&?jpr(%X@G=%7id@A89qSgQ9)N+Zz`^rWF;C7AnInfnDoxtAq9+D*H zE9e|YsMuLhe6-hD&|h=?5PH6HJ}cfOzJw_)A(@w#b^ANV7cr$MKhNMvF3KcmV>!+B zH?{Q1pP&e)56>u$SyI3DoVL(ucg3et?~5Rm2$czy@>P6 z+4Z}U-SiT-Z^!zJnTx`odZJFrT3**oMDHtO!7}zrLBiD`qMf$J10ZB500IxNfe0)2 zudqzpm7(tdm5c?bjMm*?W-GIcHg*2gNQ^^CRtVfXE*T;T-FR)HkE?DOzrM$bw4M@Pa4J2rmOa3q7nQ6l~0U`3Xx*)_@ zPA>sM$9`I$CZEvZ{q8NghDL0(<=TKpR!5a}LDz$I9r^8Xp-1wRGsp`9M7vs;QtE_L z%Ua=$^%;@sY2e@tz;)Lfa77=bV)H5i*Uq_stICy8_<;Ap2)`eiyajiK;AeXS@H z&GG^=z-OkDA38(*In)?)RIun=6iXU=G;jZ0@<8N-<4K&l_>cS}+b@4Iz>qM3JP^R( z<^XxZ6d{gY9||GWau*Pc!FLS4`r1jUlo1${=|GK2YQZWYJ zpz%paQrFO}&TZ!Ox0TOR9g(Dt)IB`kL6opvWgY)55`C;eKrQtYuO6i;jmXW4$x35H zsg8h*R>zT?B6|8Ng6d`s>m=rsH*K%`dxeUzxI)#a42zHrX3uXK7#m4{on*U*YpnT$ zLQ*pE2_C*B8?~P4HeN{1=*G_OJayn5Gh?#tMXoJnTW<&SIKT2>Pz-MBuP8e=h^ZT8 ngO7wdjmHDb{E5!yR~g8*WXc}j{A^xHfz8o!JN8j%sDs1rgqEgM