From 150b451b9c90bf906fd6907411ab82156bccf7c6 Mon Sep 17 00:00:00 2001 From: Builderdog <81527321+Builderdog841@users.noreply.github.com> Date: Sun, 22 Sep 2024 03:51:32 +0200 Subject: [PATCH] feat: Initial Dungeon Generation (#409) ## Dungeon - Starts with Entrances Room that leads to lobby room - Has one main patch across 3 floors that lead to the boss room - Has many side paths with rooms ## Misc - Added new "replace_air" field to the Aether Template Pool - Worldedit Optional Dependency - Structure Lang Fixes - Slight Structure Code Consitency Clean-Up --- I agree to the Contributor License Agreement (CLA). --------- Co-authored-by: bconlon --- build.gradle | 1 + .../assets/aether_ii/lang/en_us.json | 2 + .../infected_guardian_tree_replaceables.json | 7 + .../has_structure/infected_guardian_tree.json | 15 ++ .../worldgen/biome/has_structure/outpost.json | 1 - .../infected_guardian_tree.json | 51 +++++++ .../worldgen/structure/camp_highfields.json | 2 +- .../structure/infected_guardian_tree.json | 16 ++ .../aether_ii/worldgen/structure/outpost.json | 2 +- .../structure_set/surface_dungeons.json | 19 +++ .../camp/highfields/additional_paths.json | 6 +- .../template_pool/camp/highfields/center.json | 18 ++- .../camp/highfields/decorations.json | 12 +- .../camp/highfields/storage_areas.json | 6 +- .../template_pool/camp/highfields/tents.json | 6 +- .../dungeon/infected_guardian_tree/arena.json | 17 +++ .../infected_guardian_tree/entrance.json | 17 +++ .../infected_guardian_tree/lobbies.json | 17 +++ .../main_path/floor_1.json | 29 ++++ .../main_path/floor_2.json | 29 ++++ .../main_path/floor_3.json | 29 ++++ .../dungeon/infected_guardian_tree/paths.json | 55 +++++++ .../dungeon/infected_guardian_tree/rooms.json | 15 ++ .../staircase/floor_1/lower.json | 17 +++ .../staircase/floor_1/upper.json | 17 +++ .../staircase/floor_2/lower.json | 17 +++ .../staircase/floor_2/upper.json | 17 +++ .../template_pool/outpost/outposts.json | 6 +- .../com/aetherteam/aetherii/AetherIITags.java | 3 + .../block/natural/OrangeTreeBlock.java | 14 +- .../guidebook/discovery/BestiarySection.java | 29 ++-- .../data/generators/AetherIILanguageData.java | 2 + .../generators/tags/AetherIIBiomeTagData.java | 15 +- .../generators/tags/AetherIIBlockTagData.java | 7 +- .../registries/AetherIIProcessorLists.java | 10 ++ .../registries/AetherIIStructureSets.java | 4 + .../registries/AetherIIStructures.java | 10 +- .../highlands/HighlandsPlacedFeatures.java | 2 +- .../registries/pools/AetherIIPools.java | 13 +- .../registries/pools/CampHighfieldsPools.java | 32 ++-- .../pools/InfectedGuardianTreePools.java | 140 ++++++++++++++++++ .../registries/pools/OutpostPools.java | 4 +- .../loot/modifiers/DoubleDropsModifier.java | 9 +- .../world/feature/MoaNestFeature.java | 6 +- .../DungeonEntranceConfiguration.java | 15 ++ .../structure/pool/AetherPoolElement.java | 21 ++- .../infected_guardian_tree/boss/arena.nbt | Bin 0 -> 8035 bytes .../infected_guardian_tree/entrance.nbt | Bin 0 -> 3200 bytes .../lobbies/lobby_01.nbt | Bin 0 -> 4056 bytes .../main_path/floor_1/main_path_01.nbt | Bin 0 -> 1177 bytes .../main_path/floor_1/main_path_02.nbt | Bin 0 -> 1711 bytes .../main_path/floor_2/main_path_01.nbt | Bin 0 -> 1178 bytes .../main_path/floor_2/main_path_02.nbt | Bin 0 -> 1712 bytes .../main_path/floor_3/main_path_01.nbt | Bin 0 -> 1158 bytes .../main_path/floor_3/main_path_02.nbt | Bin 0 -> 1691 bytes .../infected_guardian_tree/paths/corner.nbt | Bin 0 -> 687 bytes .../infected_guardian_tree/paths/path_01.nbt | Bin 0 -> 1128 bytes .../infected_guardian_tree/paths/path_02.nbt | Bin 0 -> 1658 bytes .../infected_guardian_tree/paths/path_03.nbt | Bin 0 -> 1493 bytes .../paths/t_crossing.nbt | Bin 0 -> 697 bytes .../infected_guardian_tree/rooms/room_01.nbt | Bin 0 -> 1256 bytes .../staircase/floor_1/lower_01.nbt | Bin 0 -> 2297 bytes .../staircase/floor_1/upper_01.nbt | Bin 0 -> 2195 bytes .../staircase/floor_2/lower_01.nbt | Bin 0 -> 2297 bytes .../staircase/floor_2/upper_01.nbt | Bin 0 -> 2195 bytes 65 files changed, 704 insertions(+), 78 deletions(-) create mode 100644 src/generated/resources/data/aether_ii/tags/block/infected_guardian_tree_replaceables.json create mode 100644 src/generated/resources/data/aether_ii/tags/worldgen/biome/has_structure/infected_guardian_tree.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/processor_list/infected_guardian_tree.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/structure/infected_guardian_tree.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/structure_set/surface_dungeons.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/arena.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/entrance.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/lobbies.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_1.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_2.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_3.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/paths.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/rooms.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_1/lower.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_1/upper.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_2/lower.json create mode 100644 src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_2/upper.json create mode 100644 src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/InfectedGuardianTreePools.java create mode 100644 src/main/java/com/aetherteam/aetherii/world/feature/configuration/DungeonEntranceConfiguration.java create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/boss/arena.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/entrance.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/lobbies/lobby_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_1/main_path_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_1/main_path_02.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_2/main_path_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_2/main_path_02.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_3/main_path_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_3/main_path_02.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/corner.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/path_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/path_02.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/path_03.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/t_crossing.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/rooms/room_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_1/lower_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_1/upper_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_2/lower_01.nbt create mode 100644 src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_2/upper_01.nbt diff --git a/build.gradle b/build.gradle index 355fd5d158..906f74f0f9 100644 --- a/build.gradle +++ b/build.gradle @@ -66,6 +66,7 @@ dependencies { // compileOnly "mezz.jei:jei-${project.mc_version}-common-api:${project.jei_version}" // compileOnly "mezz.jei:jei-${project.mc_version}-neoforge-api:${project.jei_version}" // runtimeOnly(fg.deobf("mezz.jei:jei-${mc_version}-forge:${jei_version}")) + implementation "curse.maven:worldedit-225608:5564371" jarJar("com.aetherteam.nitrogen:nitrogen_internals:${project.nitrogen_version}") { jarJar.ranged(it, "[${project.nitrogen_version},)") diff --git a/src/generated/resources/assets/aether_ii/lang/en_us.json b/src/generated/resources/assets/aether_ii/lang/en_us.json index e59550b381..27a560b6de 100644 --- a/src/generated/resources/assets/aether_ii/lang/en_us.json +++ b/src/generated/resources/assets/aether_ii/lang/en_us.json @@ -824,6 +824,8 @@ "menu.aether_ii.artisans_bench": "Artisan's Bench", "menu.aether_ii.holystone_furnace": "Holystone Furnace", "pack.aether_ii.mod.description": "Aether II Resources", + "structure.aether_ii.camp_highfields": "Camp Highfields", + "structure.aether_ii.infected_guardian_tree": "Infected Guardian Tree", "structure.aether_ii.outpost": "Outpost", "subtitles.aether_ii.block.aercloud.blue_aercloud_bounce": "Blue Aercloud bounces", "subtitles.aether_ii.block.aether_portal.ambient": "Aether Portal whooshes", diff --git a/src/generated/resources/data/aether_ii/tags/block/infected_guardian_tree_replaceables.json b/src/generated/resources/data/aether_ii/tags/block/infected_guardian_tree_replaceables.json new file mode 100644 index 0000000000..8f72f5039b --- /dev/null +++ b/src/generated/resources/data/aether_ii/tags/block/infected_guardian_tree_replaceables.json @@ -0,0 +1,7 @@ +{ + "values": [ + "aether_ii:red_cloudwool", + "aether_ii:blue_cloudwool", + "minecraft:spawner" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/tags/worldgen/biome/has_structure/infected_guardian_tree.json b/src/generated/resources/data/aether_ii/tags/worldgen/biome/has_structure/infected_guardian_tree.json new file mode 100644 index 0000000000..5533baf6ad --- /dev/null +++ b/src/generated/resources/data/aether_ii/tags/worldgen/biome/has_structure/infected_guardian_tree.json @@ -0,0 +1,15 @@ +{ + "values": [ + "aether_ii:flourishing_field", + "aether_ii:verdant_woods", + "aether_ii:shrouded_forest", + "aether_ii:magnetic_scar", + "aether_ii:turquoise_forest", + "aether_ii:violet_highwoods", + "aether_ii:frigid_sierra", + "aether_ii:enduring_woodland", + "aether_ii:sheer_tundra", + "aether_ii:contaminated_jungle", + "aether_ii:battleground_wastes" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/tags/worldgen/biome/has_structure/outpost.json b/src/generated/resources/data/aether_ii/tags/worldgen/biome/has_structure/outpost.json index 2050ec9b6b..103c5ce568 100644 --- a/src/generated/resources/data/aether_ii/tags/worldgen/biome/has_structure/outpost.json +++ b/src/generated/resources/data/aether_ii/tags/worldgen/biome/has_structure/outpost.json @@ -5,7 +5,6 @@ "aether_ii:shrouded_forest", "aether_ii:magnetic_scar", "aether_ii:turquoise_forest", - "aether_ii:glistening_swamp", "aether_ii:violet_highwoods", "aether_ii:frigid_sierra", "aether_ii:enduring_woodland", diff --git a/src/generated/resources/data/aether_ii/worldgen/processor_list/infected_guardian_tree.json b/src/generated/resources/data/aether_ii/worldgen/processor_list/infected_guardian_tree.json new file mode 100644 index 0000000000..4873a97bd3 --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/processor_list/infected_guardian_tree.json @@ -0,0 +1,51 @@ +{ + "processors": [ + { + "processor_type": "minecraft:rule", + "rules": [ + { + "input_predicate": { + "predicate_type": "minecraft:tag_match", + "tag": "aether_ii:infected_guardian_tree_replaceables" + }, + "location_predicate": { + "block": "minecraft:air", + "predicate_type": "minecraft:block_match" + }, + "output_state": { + "Name": "minecraft:air" + } + }, + { + "input_predicate": { + "predicate_type": "minecraft:tag_match", + "tag": "aether_ii:infected_guardian_tree_replaceables" + }, + "location_predicate": { + "block": "minecraft:water", + "predicate_type": "minecraft:block_match" + }, + "output_state": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + } + }, + { + "input_predicate": { + "predicate_type": "minecraft:tag_match", + "tag": "aether_ii:infected_guardian_tree_replaceables" + }, + "location_predicate": { + "block": "aether_ii:cold_aercloud", + "predicate_type": "minecraft:block_match" + }, + "output_state": { + "Name": "aether_ii:cold_aercloud" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/structure/camp_highfields.json b/src/generated/resources/data/aether_ii/worldgen/structure/camp_highfields.json index 553479d526..a6c465f3e0 100644 --- a/src/generated/resources/data/aether_ii/worldgen/structure/camp_highfields.json +++ b/src/generated/resources/data/aether_ii/worldgen/structure/camp_highfields.json @@ -6,7 +6,7 @@ "liquid_settings": "ignore_waterlogging", "max_distance_from_center": 32, "project_start_to_heightmap": "WORLD_SURFACE_WG", - "size": 20, + "size": 4, "spawn_overrides": {}, "start_height": { "absolute": 0 diff --git a/src/generated/resources/data/aether_ii/worldgen/structure/infected_guardian_tree.json b/src/generated/resources/data/aether_ii/worldgen/structure/infected_guardian_tree.json new file mode 100644 index 0000000000..3d14cb8d3a --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/structure/infected_guardian_tree.json @@ -0,0 +1,16 @@ +{ + "type": "aether_ii:aether_jigsaw", + "biomes": "#aether_ii:has_structure/infected_guardian_tree", + "discard_above_y": 160, + "discard_below_y": 128, + "liquid_settings": "ignore_waterlogging", + "max_distance_from_center": 128, + "project_start_to_heightmap": "WORLD_SURFACE_WG", + "size": 12, + "spawn_overrides": {}, + "start_height": { + "absolute": -16 + }, + "start_pool": "aether_ii:dungeon/infected_guardian_tree/entrance", + "step": "surface_structures" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/structure/outpost.json b/src/generated/resources/data/aether_ii/worldgen/structure/outpost.json index 6d4f0342b6..8a0574256e 100644 --- a/src/generated/resources/data/aether_ii/worldgen/structure/outpost.json +++ b/src/generated/resources/data/aether_ii/worldgen/structure/outpost.json @@ -6,7 +6,7 @@ "liquid_settings": "ignore_waterlogging", "max_distance_from_center": 32, "project_start_to_heightmap": "WORLD_SURFACE_WG", - "size": 10, + "size": 4, "spawn_overrides": {}, "start_height": { "absolute": 0 diff --git a/src/generated/resources/data/aether_ii/worldgen/structure_set/surface_dungeons.json b/src/generated/resources/data/aether_ii/worldgen/structure_set/surface_dungeons.json new file mode 100644 index 0000000000..f79cba5eaf --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/structure_set/surface_dungeons.json @@ -0,0 +1,19 @@ +{ + "placement": { + "type": "minecraft:random_spread", + "exclusion_zone": { + "chunk_count": 8, + "other_set": "aether_ii:outposts" + }, + "frequency_reduction_method": "legacy_type_2", + "salt": 2209164, + "separation": 12, + "spacing": 32 + }, + "structures": [ + { + "structure": "aether_ii:infected_guardian_tree", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/additional_paths.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/additional_paths.json index 29198a7918..46c443fc8e 100644 --- a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/additional_paths.json +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/additional_paths.json @@ -5,7 +5,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/additional_paths/path_01", "processors": "aether_ii:camp_highfields", - "projection": "terrain_matching" + "projection": "terrain_matching", + "replace_air": true }, "weight": 1 }, @@ -14,7 +15,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/additional_paths/path_02", "processors": "aether_ii:camp_highfields", - "projection": "terrain_matching" + "projection": "terrain_matching", + "replace_air": true }, "weight": 1 } diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/center.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/center.json index ca52ee74c5..dfda41e9f5 100644 --- a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/center.json +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/center.json @@ -5,7 +5,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/center/small_center_01", "processors": "aether_ii:camp_highfields", - "projection": "terrain_matching" + "projection": "terrain_matching", + "replace_air": true }, "weight": 1 }, @@ -14,7 +15,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/center/small_center_02", "processors": "aether_ii:camp_highfields", - "projection": "terrain_matching" + "projection": "terrain_matching", + "replace_air": true }, "weight": 1 }, @@ -23,7 +25,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/center/medium_center_01", "processors": "aether_ii:camp_highfields", - "projection": "terrain_matching" + "projection": "terrain_matching", + "replace_air": true }, "weight": 1 }, @@ -32,7 +35,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/center/medium_center_02", "processors": "aether_ii:camp_highfields", - "projection": "terrain_matching" + "projection": "terrain_matching", + "replace_air": true }, "weight": 1 }, @@ -41,7 +45,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/center/large_center_01", "processors": "aether_ii:camp_highfields", - "projection": "terrain_matching" + "projection": "terrain_matching", + "replace_air": true }, "weight": 1 }, @@ -50,7 +55,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/center/large_center_02", "processors": "aether_ii:camp_highfields", - "projection": "terrain_matching" + "projection": "terrain_matching", + "replace_air": true }, "weight": 1 } diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/decorations.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/decorations.json index 5235995827..d4c3043874 100644 --- a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/decorations.json +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/decorations.json @@ -5,7 +5,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/decorations/blueberry_farm", "processors": "aether_ii:camp_highfields", - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 1 }, @@ -14,7 +15,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/decorations/orange_farm", "processors": "aether_ii:camp_highfields", - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 1 }, @@ -23,7 +25,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/decorations/valkyrie_sprout_farm", "processors": "aether_ii:camp_highfields", - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 1 }, @@ -32,7 +35,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/decorations/well", "processors": "aether_ii:camp_highfields", - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 2 }, diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/storage_areas.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/storage_areas.json index ee5bbdbab6..fc2e09ea64 100644 --- a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/storage_areas.json +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/storage_areas.json @@ -5,7 +5,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/storage_areas/storage_area_01", "processors": "aether_ii:camp_highfields", - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 2 }, @@ -14,7 +15,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/storage_areas/storage_area_02", "processors": "aether_ii:camp_highfields", - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 2 }, diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/tents.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/tents.json index c613a56c19..2c997d8200 100644 --- a/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/tents.json +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/camp/highfields/tents.json @@ -5,7 +5,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/tents/small_tent", "processors": "aether_ii:camp_highfields", - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 1 }, @@ -14,7 +15,8 @@ "element_type": "aether_ii:aether_pool_element", "location": "aether_ii:camp/highfields/tents/tent", "processors": "aether_ii:camp_highfields", - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 2 } diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/arena.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/arena.json new file mode 100644 index 0000000000..dacbb0c47d --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/arena.json @@ -0,0 +1,17 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/boss/arena", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/entrance.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/entrance.json new file mode 100644 index 0000000000..f5b450752c --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/entrance.json @@ -0,0 +1,17 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/entrance", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/lobbies.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/lobbies.json new file mode 100644 index 0000000000..674b7ab23b --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/lobbies.json @@ -0,0 +1,17 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/lobbies/lobby_01", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_1.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_1.json new file mode 100644 index 0000000000..3f3a78986a --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_1.json @@ -0,0 +1,29 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/main_path/floor_1/main_path_01", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + }, + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/main_path/floor_1/main_path_02", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_2.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_2.json new file mode 100644 index 0000000000..a7bdad48e3 --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_2.json @@ -0,0 +1,29 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/main_path/floor_2/main_path_01", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + }, + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/main_path/floor_2/main_path_02", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_3.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_3.json new file mode 100644 index 0000000000..dc89f02801 --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/main_path/floor_3.json @@ -0,0 +1,29 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/main_path/floor_3/main_path_01", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + }, + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/main_path/floor_3/main_path_02", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/paths.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/paths.json new file mode 100644 index 0000000000..f5521fc47d --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/paths.json @@ -0,0 +1,55 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/paths/path_01", + "processors": "aether_ii:infected_guardian_tree", + "projection": "rigid", + "replace_air": false + }, + "weight": 2 + }, + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/paths/path_02", + "processors": "aether_ii:infected_guardian_tree", + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + }, + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/paths/path_03", + "processors": "aether_ii:infected_guardian_tree", + "projection": "rigid", + "replace_air": false + }, + "weight": 3 + }, + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/paths/corner", + "processors": "aether_ii:infected_guardian_tree", + "projection": "rigid", + "replace_air": false + }, + "weight": 2 + }, + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/paths/t_crossing", + "processors": "aether_ii:infected_guardian_tree", + "projection": "rigid", + "replace_air": false + }, + "weight": 3 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/rooms.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/rooms.json new file mode 100644 index 0000000000..4b4964cf29 --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/rooms.json @@ -0,0 +1,15 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/rooms/room_01", + "processors": "aether_ii:infected_guardian_tree", + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_1/lower.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_1/lower.json new file mode 100644 index 0000000000..d6b03b0c32 --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_1/lower.json @@ -0,0 +1,17 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/staircase/floor_1/lower_01", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_1/upper.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_1/upper.json new file mode 100644 index 0000000000..86b325d98b --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_1/upper.json @@ -0,0 +1,17 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/staircase/floor_1/upper_01", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_2/lower.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_2/lower.json new file mode 100644 index 0000000000..f852e02c61 --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_2/lower.json @@ -0,0 +1,17 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/staircase/floor_2/lower_01", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_2/upper.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_2/upper.json new file mode 100644 index 0000000000..0958be7940 --- /dev/null +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/dungeon/infected_guardian_tree/staircase/floor_2/upper.json @@ -0,0 +1,17 @@ +{ + "elements": [ + { + "element": { + "element_type": "aether_ii:aether_pool_element", + "location": "aether_ii:dungeon/infected_guardian_tree/staircase/floor_2/upper_01", + "processors": { + "processors": [] + }, + "projection": "rigid", + "replace_air": false + }, + "weight": 1 + } + ], + "fallback": "minecraft:empty" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/worldgen/template_pool/outpost/outposts.json b/src/generated/resources/data/aether_ii/worldgen/template_pool/outpost/outposts.json index 0d4fba3c9d..2db75c1b83 100644 --- a/src/generated/resources/data/aether_ii/worldgen/template_pool/outpost/outposts.json +++ b/src/generated/resources/data/aether_ii/worldgen/template_pool/outpost/outposts.json @@ -7,7 +7,8 @@ "processors": { "processors": [] }, - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 1 }, @@ -18,7 +19,8 @@ "processors": { "processors": [] }, - "projection": "rigid" + "projection": "rigid", + "replace_air": true }, "weight": 1 } diff --git a/src/main/java/com/aetherteam/aetherii/AetherIITags.java b/src/main/java/com/aetherteam/aetherii/AetherIITags.java index cb713f36ca..1fffd4feca 100644 --- a/src/main/java/com/aetherteam/aetherii/AetherIITags.java +++ b/src/main/java/com/aetherteam/aetherii/AetherIITags.java @@ -61,6 +61,8 @@ public static class Blocks { public static final TagKey COCKATRICE_SPAWNABLE_BLACKLIST = tag("cockatrice_spawnable_blacklist"); public static final TagKey SWET_SPAWNABLE_ON = tag("swet_spawnable_on"); + public static final TagKey INFECTED_GUARDIAN_TREE_REPLACEABLES = tag("infected_guardian_tree_replaceables"); + public static final TagKey MOA_HATCH_BLOCK = tag("moa_hatch_block"); public static final TagKey HOLYSTONE_ABILITY_GUARANTEED = tag("holystone_ability_guaranteed"); @@ -182,6 +184,7 @@ public static class Biomes { public static final TagKey HAS_STRUCTURE_OUTPOST = tag("has_structure/outpost"); public static final TagKey HAS_STRUCTURE_CAMP_HIGHFIELDS = tag("has_structure/camp_highfields"); + public static final TagKey HAS_STRUCTURE_INFECTED_GUARDIAN_TREE = tag("has_structure/infected_guardian_tree"); public static final TagKey MYCELIUM_CONVERSION = tag("mycelium_conversion"); public static final TagKey PODZOL_CONVERSION = tag("podzol_conversion"); diff --git a/src/main/java/com/aetherteam/aetherii/block/natural/OrangeTreeBlock.java b/src/main/java/com/aetherteam/aetherii/block/natural/OrangeTreeBlock.java index aaf09d1de9..c39c9b7d3e 100644 --- a/src/main/java/com/aetherteam/aetherii/block/natural/OrangeTreeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/natural/OrangeTreeBlock.java @@ -50,10 +50,6 @@ protected void createBlockStateDefinition(StateDefinition.Builder
- * Warning for "deprecation" is suppressed because the method is fine to override. */ - @SuppressWarnings("deprecation") @Override public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { DoubleBlockHalf doubleBlockHalf = state.getValue(HALF); @@ -148,9 +142,8 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, int age = state.getValue(AGE); if (age > SINGLE_AGE_MAX) { if (!level.isClientSide()) { - if (player.isCreative()) { - preventCreativeDropFromBottomPart(level, pos, state, player); - } else { + preventCreativeDropFromBottomPart(level, pos, state, player); + if (!player.isCreative()) { if (doubleBlockHalf == DoubleBlockHalf.LOWER) { pos = pos.above(); } @@ -190,7 +183,8 @@ public void playerDestroy(Level level, Player player, BlockPos pos, BlockState s @Override public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) { DoubleBlockHalf doubleBlockHalf = state.getValue(HALF); - if (doubleBlockHalf == DoubleBlockHalf.UPPER) { + int age = state.getValue(AGE); + if (doubleBlockHalf == DoubleBlockHalf.UPPER && age == DOUBLE_AGE_MAX) { return true; } return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); diff --git a/src/main/java/com/aetherteam/aetherii/client/gui/screen/guidebook/discovery/BestiarySection.java b/src/main/java/com/aetherteam/aetherii/client/gui/screen/guidebook/discovery/BestiarySection.java index 19c0eda616..e5c3cb8ed5 100644 --- a/src/main/java/com/aetherteam/aetherii/client/gui/screen/guidebook/discovery/BestiarySection.java +++ b/src/main/java/com/aetherteam/aetherii/client/gui/screen/guidebook/discovery/BestiarySection.java @@ -229,29 +229,28 @@ public void renderInformation(GuiGraphics guiGraphics, int mouseX, int mouseY, f int y = 29; guiGraphics.blitSprite(Guidebook.HEARTS_SPRITE, x, y, 16, 16); - String health = String.valueOf((int) livingEntity.getMaxHealth()); - this.renderIconValue(guiGraphics, x, y, health); - this.renderTooltipOverIcon(font, guiGraphics, mouseX, mouseY, x, y, 0, Component.translatable("gui.aether_ii.guidebook.discovery.bestiary.stat.health", health)); + this.renderIconValue(guiGraphics, x, y, (int) livingEntity.getMaxHealth()); + this.renderTooltipOverIcon(font, guiGraphics, mouseX, mouseY, x, y, 0, Component.translatable("gui.aether_ii.guidebook.discovery.bestiary.stat.health", (int) livingEntity.getMaxHealth())); y += 17; guiGraphics.blitSprite(SLASH_SPRITE, x, y, 16, 16); int slashDefense = (int) (livingEntity.getAttributes().hasAttribute(AetherIIAttributes.SLASH_RESISTANCE) ? livingEntity.getAttributeValue(AetherIIAttributes.SLASH_RESISTANCE) : 0.0); Component slashTooltip = this.getDamageTypeComponent(slashDefense, "slash"); - this.renderIconValue(guiGraphics, x, y, String.valueOf(-slashDefense)); + this.renderDefenseIconValue(guiGraphics, x, y, -slashDefense); this.renderTooltipOverIcon(font, guiGraphics, mouseX, mouseY, x, y, 0, slashTooltip); y += 17; guiGraphics.blitSprite(IMPACT_SPRITE, x, y, 16, 16); int impactDefense = (int) (livingEntity.getAttributes().hasAttribute(AetherIIAttributes.IMPACT_RESISTANCE) ? livingEntity.getAttributeValue(AetherIIAttributes.IMPACT_RESISTANCE) : 0.0); Component impactTooltip = this.getDamageTypeComponent(impactDefense, "impact"); - this.renderIconValue(guiGraphics, x, y, String.valueOf(-impactDefense)); + this.renderDefenseIconValue(guiGraphics, x, y, -impactDefense); this.renderTooltipOverIcon(font, guiGraphics, mouseX, mouseY, x, y, 0, impactTooltip); y += 17; guiGraphics.blitSprite(PIERCE_SPRITE, x, y, 16, 16); int pierceDefense = (int) (livingEntity.getAttributes().hasAttribute(AetherIIAttributes.PIERCE_RESISTANCE) ? livingEntity.getAttributeValue(AetherIIAttributes.PIERCE_RESISTANCE) : 0.0); Component pierceTooltip = this.getDamageTypeComponent(pierceDefense, "pierce"); - this.renderIconValue(guiGraphics, x, y, String.valueOf(-pierceDefense)); + this.renderDefenseIconValue(guiGraphics, x, y, -pierceDefense); this.renderTooltipOverIcon(font, guiGraphics, mouseX, mouseY, x, y, 0, pierceTooltip); x = 132; @@ -268,7 +267,7 @@ public void renderInformation(GuiGraphics guiGraphics, int mouseX, int mouseY, f Component effectTooltip = Component.literal((int) effectValue * 100 + "%") .append(CommonComponents.space()) .append(Component.translatable(holders.getValue().value().getDescriptionId(), Component.translatable(effectHolder.value().getDescriptionId()).withColor(effectHolder.value().getColor()))); - this.renderIconValue(guiGraphics, x, y, String.valueOf(effectValue)); + this.renderDefenseIconValue(guiGraphics, x, y, effectValue); this.renderTooltipOverIcon(font, guiGraphics, mouseX, mouseY, x, y, -Minecraft.getInstance().font.width(effectTooltip) - 22, effectTooltip); y += 17; } @@ -343,9 +342,21 @@ private void renderFakeSlot(GuiGraphics guiGraphics, Font font, List } } - private void renderIconValue(GuiGraphics guiGraphics, int x, int y, String value) { + private void renderDefenseIconValue(GuiGraphics guiGraphics, int x, int y, double value) { Font font = Minecraft.getInstance().font; - guiGraphics.drawString(font, value, x + 19 - 2 - font.width(value), y + 6 + 3, 16777215, true); + String name = String.valueOf(Math.abs((int) value)); + if (value > 0) { + name = "₊" + name; + } else if (value < 0) { + name = "₋" + name; + } + guiGraphics.drawString(font, name, x + 19 - 2 - font.width(name), y + 6 + 3, 16777215, true); + } + + private void renderIconValue(GuiGraphics guiGraphics, int x, int y, double value) { + Font font = Minecraft.getInstance().font; + String name = String.valueOf(Math.abs((int) value)); + guiGraphics.drawString(font, name, x + 19 - 2 - font.width(name), y + 6 + 3, 16777215, true); } private Component getDamageTypeComponent(int value, String type) { diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java index e19d06b6aa..be8c81d0fa 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java @@ -887,6 +887,8 @@ protected void addTranslations() { // Structures this.addStructure(AetherIIStructures.OUTPOST, "Outpost"); + this.addStructure(AetherIIStructures.CAMP_HIGHFIELDS, "Camp Highfields"); + this.addStructure(AetherIIStructures.INFECTED_GUARDIAN_TREE, "Infected Guardian Tree"); // Attributes diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIBiomeTagData.java b/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIBiomeTagData.java index 1615fda246..c4f13a234e 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIBiomeTagData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIBiomeTagData.java @@ -90,7 +90,6 @@ public void addTags(HolderLookup.Provider provider) { HighlandsBiomes.SHROUDED_FOREST, HighlandsBiomes.MAGNETIC_SCAR, HighlandsBiomes.TURQUOISE_FOREST, - HighlandsBiomes.GLISTENING_SWAMP, HighlandsBiomes.VIOLET_HIGHWOODS, HighlandsBiomes.FRIGID_SIERRA, HighlandsBiomes.ENDURING_WOODLAND, @@ -101,5 +100,19 @@ public void addTags(HolderLookup.Provider provider) { HighlandsBiomes.FLOURISHING_FIELD, HighlandsBiomes.VERDANT_WOODS ); + + this.tag(AetherIITags.Biomes.HAS_STRUCTURE_INFECTED_GUARDIAN_TREE).add( + HighlandsBiomes.FLOURISHING_FIELD, + HighlandsBiomes.VERDANT_WOODS, + HighlandsBiomes.SHROUDED_FOREST, + HighlandsBiomes.MAGNETIC_SCAR, + HighlandsBiomes.TURQUOISE_FOREST, + HighlandsBiomes.VIOLET_HIGHWOODS, + HighlandsBiomes.FRIGID_SIERRA, + HighlandsBiomes.ENDURING_WOODLAND, + HighlandsBiomes.SHEER_TUNDRA, + HighlandsBiomes.CONTAMINATED_JUNGLE, + HighlandsBiomes.BATTLEGROUND_WASTES + ); } } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIBlockTagData.java b/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIBlockTagData.java index 43bb5dd136..8cc5d3929a 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIBlockTagData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIBlockTagData.java @@ -251,9 +251,12 @@ public void addTags(HolderLookup.Provider provider) { this.tag(AetherIITags.Blocks.AECHOR_PLANT_SPAWNABLE_ON).add(AetherIIBlocks.AETHER_GRASS_BLOCK.get()); this.tag(AetherIITags.Blocks.COCKATRICE_SPAWNABLE_BLACKLIST); this.tag(AetherIITags.Blocks.SWET_SPAWNABLE_ON).add(AetherIIBlocks.AETHER_GRASS_BLOCK.get()); - this.tag(AetherIITags.Blocks.MOA_HATCH_BLOCK).add( - AetherIIBlocks.WOVEN_SKYROOT_STICKS.get() + this.tag(AetherIITags.Blocks.INFECTED_GUARDIAN_TREE_REPLACEABLES).add( + AetherIIBlocks.RED_CLOUDWOOL.get(), + AetherIIBlocks.BLUE_CLOUDWOOL.get(), + Blocks.SPAWNER ); + this.tag(AetherIITags.Blocks.MOA_HATCH_BLOCK).add(AetherIIBlocks.WOVEN_SKYROOT_STICKS.get()); this.tag(AetherIITags.Blocks.HOLYSTONE_ABILITY_GUARANTEED).addTag(Tags.Blocks.ORES); this.tag(AetherIITags.Blocks.GRAVITITE_ABILITY_BLACKLIST).addTags( BlockTags.BUTTONS, diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIProcessorLists.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIProcessorLists.java index e6d4d27168..33924684ad 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIProcessorLists.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIProcessorLists.java @@ -1,6 +1,7 @@ package com.aetherteam.aetherii.data.resources.registries; import com.aetherteam.aetherii.AetherII; +import com.aetherteam.aetherii.AetherIITags; import com.aetherteam.aetherii.block.AetherIIBlocks; import com.aetherteam.aetherii.block.natural.ValkyrieSproutBlock; import com.google.common.collect.ImmutableList; @@ -15,6 +16,7 @@ public class AetherIIProcessorLists { public static final ResourceKey CAMP_HIGHFIELDS = createKey("camp_highfields"); + public static final ResourceKey INFECTED_GUARDIAN_TREE = createKey("infected_guardian_tree"); public static void bootstrap(BootstrapContext context) { register(context, CAMP_HIGHFIELDS, ImmutableList.of( @@ -29,6 +31,14 @@ public static void bootstrap(BootstrapContext context) { new ProcessorRule(new RandomBlockMatchTest(AetherIIBlocks.VALKYRIE_SPROUT.get(), 0.15F), AlwaysTrueTest.INSTANCE, AetherIIBlocks.VALKYRIE_SPROUT.get().defaultBlockState().setValue(ValkyrieSproutBlock.AGE, 1)) )) )); + + register(context, INFECTED_GUARDIAN_TREE, ImmutableList.of( + new RuleProcessor(ImmutableList.of( + new ProcessorRule(new TagMatchTest(AetherIITags.Blocks.INFECTED_GUARDIAN_TREE_REPLACEABLES), new BlockMatchTest(Blocks.AIR), Blocks.AIR.defaultBlockState()), + new ProcessorRule(new TagMatchTest(AetherIITags.Blocks.INFECTED_GUARDIAN_TREE_REPLACEABLES), new BlockMatchTest(Blocks.WATER), Blocks.WATER.defaultBlockState()), + new ProcessorRule(new TagMatchTest(AetherIITags.Blocks.INFECTED_GUARDIAN_TREE_REPLACEABLES), new BlockMatchTest(AetherIIBlocks.COLD_AERCLOUD.get()), AetherIIBlocks.COLD_AERCLOUD.get().defaultBlockState()) + )) + )); } private static ResourceKey createKey(String name) { diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIStructureSets.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIStructureSets.java index 8902486013..1bb5810be1 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIStructureSets.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIStructureSets.java @@ -19,6 +19,7 @@ public class AetherIIStructureSets { public static final ResourceKey OUTPOSTS = createKey("outposts"); public static final ResourceKey CAMPS = createKey("camps"); + public static final ResourceKey SURFACE_DUNGEONS = createKey("surface_dungeons"); private static ResourceKey createKey(String name) { return ResourceKey.create(Registries.STRUCTURE_SET, ResourceLocation.fromNamespaceAndPath(AetherII.MODID, name)); @@ -36,5 +37,8 @@ public static void bootstrap(BootstrapContext context) { context.register(CAMPS, new StructureSet(structures.getOrThrow(AetherIIStructures.CAMP_HIGHFIELDS), new RandomSpreadStructurePlacement(Vec3i.ZERO, StructurePlacement.FrequencyReductionMethod.LEGACY_TYPE_1, 0.6F, 1147092, Optional.of(new StructurePlacement.ExclusionZone(outposts, 8)), 22, 10, RandomSpreadType.LINEAR))); + + context.register(SURFACE_DUNGEONS, new StructureSet(structures.getOrThrow(AetherIIStructures.INFECTED_GUARDIAN_TREE), + new RandomSpreadStructurePlacement(Vec3i.ZERO, StructurePlacement.FrequencyReductionMethod.LEGACY_TYPE_2, 1.0F, 2209164, Optional.of(new StructurePlacement.ExclusionZone(outposts, 8)), 32, 12, RandomSpreadType.LINEAR))); } } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIStructures.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIStructures.java index 49e0704bf0..bf8400cdb5 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIStructures.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIStructures.java @@ -4,6 +4,7 @@ import com.aetherteam.aetherii.AetherIITags; import com.aetherteam.aetherii.data.resources.builders.AetherIIStructureBuilders; import com.aetherteam.aetherii.data.resources.registries.pools.CampHighfieldsPools; +import com.aetherteam.aetherii.data.resources.registries.pools.InfectedGuardianTreePools; import com.aetherteam.aetherii.data.resources.registries.pools.OutpostPools; import com.aetherteam.aetherii.world.structure.AetherJigsawStructure; import net.minecraft.core.HolderGetter; @@ -28,6 +29,7 @@ public class AetherIIStructures { public static final ResourceKey OUTPOST = createKey("outpost"); public static final ResourceKey CAMP_HIGHFIELDS = createKey("camp_highfields"); + public static final ResourceKey INFECTED_GUARDIAN_TREE = createKey("infected_guardian_tree"); private static ResourceKey createKey(String name) { return ResourceKey.create(Registries.STRUCTURE, ResourceLocation.fromNamespaceAndPath(AetherII.MODID, name)); @@ -39,10 +41,14 @@ public static void bootstrap(BootstrapContext context) { context.register(OUTPOST, new AetherJigsawStructure( AetherIIStructureBuilders.structure(biomes.getOrThrow(AetherIITags.Biomes.HAS_STRUCTURE_OUTPOST), GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.BEARD_THIN), - templatePools.getOrThrow(OutpostPools.OUTPOST), Optional.empty(), 10, ConstantHeight.of(VerticalAnchor.absolute(0)), Optional.of(Heightmap.Types.WORLD_SURFACE_WG), 32, 128, 256, List.of(), DimensionPadding.ZERO, LiquidSettings.IGNORE_WATERLOGGING)); + templatePools.getOrThrow(OutpostPools.OUTPOST), Optional.empty(), 4, ConstantHeight.of(VerticalAnchor.absolute(0)), Optional.of(Heightmap.Types.WORLD_SURFACE_WG), 32, 128, 256, List.of(), DimensionPadding.ZERO, LiquidSettings.IGNORE_WATERLOGGING)); context.register(CAMP_HIGHFIELDS, new AetherJigsawStructure( AetherIIStructureBuilders.structure(biomes.getOrThrow(AetherIITags.Biomes.HAS_STRUCTURE_CAMP_HIGHFIELDS), GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.BEARD_THIN), - templatePools.getOrThrow(CampHighfieldsPools.CENTER), Optional.empty(), 20, ConstantHeight.of(VerticalAnchor.absolute(0)), Optional.of(Heightmap.Types.WORLD_SURFACE_WG), 32, 128, 256, List.of(), DimensionPadding.ZERO, LiquidSettings.IGNORE_WATERLOGGING)); + templatePools.getOrThrow(CampHighfieldsPools.CENTER), Optional.empty(), 4, ConstantHeight.of(VerticalAnchor.absolute(0)), Optional.of(Heightmap.Types.WORLD_SURFACE_WG), 32, 128, 256, List.of(), DimensionPadding.ZERO, LiquidSettings.IGNORE_WATERLOGGING)); + + context.register(INFECTED_GUARDIAN_TREE, new AetherJigsawStructure( + AetherIIStructureBuilders.structure(biomes.getOrThrow(AetherIITags.Biomes.HAS_STRUCTURE_INFECTED_GUARDIAN_TREE), GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.NONE), + templatePools.getOrThrow(InfectedGuardianTreePools.ENTRANCE), Optional.empty(), 12, ConstantHeight.of(VerticalAnchor.absolute(-16)), Optional.of(Heightmap.Types.WORLD_SURFACE_WG), 128, 128, 160, List.of(), DimensionPadding.ZERO, LiquidSettings.IGNORE_WATERLOGGING)); } } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/highlands/HighlandsPlacedFeatures.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/highlands/HighlandsPlacedFeatures.java index 8a4926732a..e5171e5dc4 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/registries/highlands/HighlandsPlacedFeatures.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/highlands/HighlandsPlacedFeatures.java @@ -706,4 +706,4 @@ private static void register(BootstrapContext context, ResourceKe private static void register(BootstrapContext context, ResourceKey key, Holder> configuration, List modifiers) { context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers))); } -} +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/AetherIIPools.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/AetherIIPools.java index c1d32f109c..e1b704c6e1 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/AetherIIPools.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/AetherIIPools.java @@ -28,6 +28,7 @@ public static void bootstrap(BootstrapContext context) { OutpostPools.bootstrap(context); CampHighfieldsPools.bootstrap(context); + InfectedGuardianTreePools.bootstrap(context); } public static ResourceKey createKey(String name) { @@ -39,10 +40,18 @@ public static void register(BootstrapContext context, Str } public static Function aetherPool(String id) { - return pool -> new AetherPoolElement(Either.left(ResourceLocation.fromNamespaceAndPath(AetherII.MODID, id)), EMPTY, pool); + return pool -> new AetherPoolElement(Either.left(ResourceLocation.fromNamespaceAndPath(AetherII.MODID, id)), EMPTY, pool, false); } public static Function aetherPool(String id, Holder processor) { - return pool -> new AetherPoolElement(Either.left(ResourceLocation.fromNamespaceAndPath(AetherII.MODID, id)), processor, pool); + return pool -> new AetherPoolElement(Either.left(ResourceLocation.fromNamespaceAndPath(AetherII.MODID, id)), processor, pool, false); + } + + public static Function aetherPoolReplace(String id) { + return pool -> new AetherPoolElement(Either.left(ResourceLocation.fromNamespaceAndPath(AetherII.MODID, id)), EMPTY, pool, true); + } + + public static Function aetherPoolReplace(String id, Holder processor) { + return pool -> new AetherPoolElement(Either.left(ResourceLocation.fromNamespaceAndPath(AetherII.MODID, id)), processor, pool, true); } } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/CampHighfieldsPools.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/CampHighfieldsPools.java index 48805b3dc3..9d20dbe218 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/CampHighfieldsPools.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/CampHighfieldsPools.java @@ -30,12 +30,12 @@ public static void bootstrap(BootstrapContext context) { context.register(CENTER, new StructureTemplatePool( fallback, ImmutableList.of( - Pair.of(AetherIIPools.aetherPool("camp/highfields/center/small_center_01", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/center/small_center_02", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/center/medium_center_01", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/center/medium_center_02", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/center/large_center_01", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/center/large_center_02", processorCamp), 1) + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/center/small_center_01", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/center/small_center_02", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/center/medium_center_01", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/center/medium_center_02", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/center/large_center_01", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/center/large_center_02", processorCamp), 1) ), StructureTemplatePool.Projection.TERRAIN_MATCHING) ); @@ -43,8 +43,8 @@ public static void bootstrap(BootstrapContext context) { context.register(ADDITIONAL_PATHS, new StructureTemplatePool( fallback, ImmutableList.of( - Pair.of(AetherIIPools.aetherPool("camp/highfields/additional_paths/path_01", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/additional_paths/path_02", processorCamp), 1) + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/additional_paths/path_01", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/additional_paths/path_02", processorCamp), 1) ), StructureTemplatePool.Projection.TERRAIN_MATCHING) ); @@ -52,8 +52,8 @@ public static void bootstrap(BootstrapContext context) { context.register(TENTS, new StructureTemplatePool( fallback, ImmutableList.of( - Pair.of(AetherIIPools.aetherPool("camp/highfields/tents/small_tent", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/tents/tent", processorCamp), 2) + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/tents/small_tent", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/tents/tent", processorCamp), 2) ), StructureTemplatePool.Projection.RIGID) ); @@ -61,10 +61,10 @@ public static void bootstrap(BootstrapContext context) { context.register(DECORATIONS, new StructureTemplatePool( fallback, ImmutableList.of( - Pair.of(AetherIIPools.aetherPool("camp/highfields/decorations/blueberry_farm", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/decorations/orange_farm", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/decorations/valkyrie_sprout_farm", processorCamp), 1), - Pair.of(AetherIIPools.aetherPool("camp/highfields/decorations/well", processorCamp), 2), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/decorations/blueberry_farm", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/decorations/orange_farm", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/decorations/valkyrie_sprout_farm", processorCamp), 1), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/decorations/well", processorCamp), 2), Pair.of(StructurePoolElement.empty(), 2) ), StructureTemplatePool.Projection.RIGID) @@ -73,8 +73,8 @@ public static void bootstrap(BootstrapContext context) { context.register(STORAGE_AREAS, new StructureTemplatePool( fallback, ImmutableList.of( - Pair.of(AetherIIPools.aetherPool("camp/highfields/storage_areas/storage_area_01", processorCamp), 2), - Pair.of(AetherIIPools.aetherPool("camp/highfields/storage_areas/storage_area_02", processorCamp), 2), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/storage_areas/storage_area_01", processorCamp), 2), + Pair.of(AetherIIPools.aetherPoolReplace("camp/highfields/storage_areas/storage_area_02", processorCamp), 2), Pair.of(StructurePoolElement.empty(), 3) ), StructureTemplatePool.Projection.RIGID) diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/InfectedGuardianTreePools.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/InfectedGuardianTreePools.java new file mode 100644 index 0000000000..4bf73a17f9 --- /dev/null +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/InfectedGuardianTreePools.java @@ -0,0 +1,140 @@ +package com.aetherteam.aetherii.data.resources.registries.pools; + +import com.aetherteam.aetherii.data.resources.registries.AetherIIProcessorLists; +import com.google.common.collect.ImmutableList; +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.BootstrapContext; +import net.minecraft.data.worldgen.Pools; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList; + +public class InfectedGuardianTreePools { + public static final ResourceKey ENTRANCE = AetherIIPools.createKey("dungeon/infected_guardian_tree/entrance"); + public static final ResourceKey LOBBIES = AetherIIPools.createKey("dungeon/infected_guardian_tree/lobbies"); + + public static final ResourceKey MAIN_PATH_FLOOR_1 = AetherIIPools.createKey("dungeon/infected_guardian_tree/main_path/floor_1"); + public static final ResourceKey MAIN_PATH_FLOOR_2 = AetherIIPools.createKey("dungeon/infected_guardian_tree/main_path/floor_2"); + public static final ResourceKey MAIN_PATH_FLOOR_3 = AetherIIPools.createKey("dungeon/infected_guardian_tree/main_path/floor_3"); + + public static final ResourceKey PATHS = AetherIIPools.createKey("dungeon/infected_guardian_tree/paths"); + + public static final ResourceKey STAIRCASE_FLOOR_1_UPPER = AetherIIPools.createKey("dungeon/infected_guardian_tree/staircase/floor_1/upper"); + public static final ResourceKey STAIRCASE_FLOOR_1_LOWER = AetherIIPools.createKey("dungeon/infected_guardian_tree/staircase/floor_1/lower"); + public static final ResourceKey STAIRCASE_FLOOR_2_UPPER = AetherIIPools.createKey("dungeon/infected_guardian_tree/staircase/floor_2/upper"); + public static final ResourceKey STAIRCASE_FLOOR_2_LOWER = AetherIIPools.createKey("dungeon/infected_guardian_tree/staircase/floor_2/lower"); + + public static final ResourceKey ROOMS = AetherIIPools.createKey("dungeon/infected_guardian_tree/rooms"); + + public static final ResourceKey ARENA = AetherIIPools.createKey("dungeon/infected_guardian_tree/arena"); + + public static void bootstrap(BootstrapContext context) { + HolderGetter templatePools = context.lookup(Registries.TEMPLATE_POOL); + HolderGetter placement = context.lookup(Registries.PLACED_FEATURE); + Holder fallback = templatePools.getOrThrow(Pools.EMPTY); + HolderGetter processors = context.lookup(Registries.PROCESSOR_LIST); + + Holder processorDungeon = processors.getOrThrow(AetherIIProcessorLists.INFECTED_GUARDIAN_TREE); + + context.register(ENTRANCE, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/entrance"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + context.register(LOBBIES, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/lobbies/lobby_01"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + + context.register(MAIN_PATH_FLOOR_1, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/main_path/floor_1/main_path_01"), 1), + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/main_path/floor_1/main_path_02"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + context.register(MAIN_PATH_FLOOR_2, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/main_path/floor_2/main_path_01"), 1), + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/main_path/floor_2/main_path_02"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + context.register(MAIN_PATH_FLOOR_3, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/main_path/floor_3/main_path_01"), 1), + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/main_path/floor_3/main_path_02"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + + context.register(PATHS, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/paths/path_01", processorDungeon), 2), + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/paths/path_02", processorDungeon), 1), + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/paths/path_03", processorDungeon), 3), + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/paths/corner", processorDungeon), 2), + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/paths/t_crossing", processorDungeon), 3) + ), + StructureTemplatePool.Projection.RIGID) + ); + + context.register(STAIRCASE_FLOOR_1_UPPER, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/staircase/floor_1/upper_01"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + context.register(STAIRCASE_FLOOR_1_LOWER, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/staircase/floor_1/lower_01"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + context.register(STAIRCASE_FLOOR_2_UPPER, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/staircase/floor_2/upper_01"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + context.register(STAIRCASE_FLOOR_2_LOWER, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/staircase/floor_2/lower_01"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + + context.register(ROOMS, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/rooms/room_01", processorDungeon), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + + context.register(ARENA, new StructureTemplatePool( + fallback, + ImmutableList.of( + Pair.of(AetherIIPools.aetherPool("dungeon/infected_guardian_tree/boss/arena"), 1) + ), + StructureTemplatePool.Projection.RIGID) + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/OutpostPools.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/OutpostPools.java index 81d2e5c455..82c47193d3 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/OutpostPools.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/pools/OutpostPools.java @@ -20,8 +20,8 @@ public static void bootstrap(BootstrapContext context) { context.register(OUTPOST, new StructureTemplatePool( fallback, ImmutableList.of( - Pair.of(AetherIIPools.aetherPool("outpost/outpost"), 1), - Pair.of(AetherIIPools.aetherPool("outpost/tall_outpost"), 1) + Pair.of(AetherIIPools.aetherPoolReplace("outpost/outpost"), 1), + Pair.of(AetherIIPools.aetherPoolReplace("outpost/tall_outpost"), 1) ), StructureTemplatePool.Projection.RIGID) ); diff --git a/src/main/java/com/aetherteam/aetherii/loot/modifiers/DoubleDropsModifier.java b/src/main/java/com/aetherteam/aetherii/loot/modifiers/DoubleDropsModifier.java index c4eaacc232..100ebc9577 100644 --- a/src/main/java/com/aetherteam/aetherii/loot/modifiers/DoubleDropsModifier.java +++ b/src/main/java/com/aetherteam/aetherii/loot/modifiers/DoubleDropsModifier.java @@ -13,6 +13,7 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TieredItem; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -43,8 +44,10 @@ public ObjectArrayList doApply(ObjectArrayList lootStacks, Entity attacker = context.getParamOrNull(LootContextParams.DIRECT_ATTACKING_ENTITY); if (targetState != null) { - if (tool != null && tool.getItem() instanceof SkyrootTool) { - this.increaseDrops(lootStacks, newStacks, context.getRandom()); + if (tool != null && tool.getItem() instanceof SkyrootTool && tool.getItem() instanceof TieredItem tieredItem) { + if ((tool.getDestroySpeed(targetState) == tieredItem.getTier().getSpeed() || tool.isCorrectToolForDrops(targetState))) { + this.increaseDrops(lootStacks, newStacks, context.getRandom()); + } } } else if (targetEntity != null) { if (attacker instanceof LivingEntity livingEntity && EquipmentUtil.isFullStrength(livingEntity) && livingEntity.getMainHandItem().getItem() instanceof SkyrootWeapon && !targetEntity.getType().is(AetherIITags.Entities.NO_DOUBLE_DROPS)) { @@ -60,7 +63,7 @@ private void increaseDrops(ObjectArrayList lootStacks, ObjectArrayLis if (item.getDefaultInstance().is(AetherIITags.Items.DOUBLE_DROPS)) { int count = 0; double chance = random.nextDouble(); - if (item instanceof BlockItem) { //todo balance + if (item instanceof BlockItem) { if (chance < 0.1) { count = 2; } else if (chance < 0.5) { diff --git a/src/main/java/com/aetherteam/aetherii/world/feature/MoaNestFeature.java b/src/main/java/com/aetherteam/aetherii/world/feature/MoaNestFeature.java index 058e8b1378..77a28e6511 100644 --- a/src/main/java/com/aetherteam/aetherii/world/feature/MoaNestFeature.java +++ b/src/main/java/com/aetherteam/aetherii/world/feature/MoaNestFeature.java @@ -12,6 +12,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; @@ -71,8 +72,9 @@ public static void placeNest(WorldGenLevel level, BlockStateProvider blockProvid @SuppressWarnings("UnusedReturnValue") public static boolean placeNestBlock(WorldGenLevel level, BlockStateProvider provider, BlockPos pos, RandomSource random) { - if (!level.getBlockState(pos).is(BlockTags.LOGS)) { - return level.setBlock(pos, provider.getState(random, pos), 2); + BlockState state = provider.getState(random, pos); + if (state.isAir() || !level.getBlockState(pos).is(BlockTags.LOGS)) { + return level.setBlock(pos, state, 2); } else { return false; } diff --git a/src/main/java/com/aetherteam/aetherii/world/feature/configuration/DungeonEntranceConfiguration.java b/src/main/java/com/aetherteam/aetherii/world/feature/configuration/DungeonEntranceConfiguration.java new file mode 100644 index 0000000000..09e7e9324e --- /dev/null +++ b/src/main/java/com/aetherteam/aetherii/world/feature/configuration/DungeonEntranceConfiguration.java @@ -0,0 +1,15 @@ +package com.aetherteam.aetherii.world.feature.configuration; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; + +public record DungeonEntranceConfiguration(ResourceLocation path, int xOffset, int zOffset) implements FeatureConfiguration { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + ResourceLocation.CODEC.fieldOf("path").forGetter(DungeonEntranceConfiguration::path), + Codec.intRange(-64, 64).fieldOf("x_offset").forGetter(DungeonEntranceConfiguration::xOffset), + Codec.intRange(-64, 64).fieldOf("z_offset").forGetter(DungeonEntranceConfiguration::zOffset) + ).apply(instance, DungeonEntranceConfiguration::new)); +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/world/structure/pool/AetherPoolElement.java b/src/main/java/com/aetherteam/aetherii/world/structure/pool/AetherPoolElement.java index c80c8c6535..2c5a5c6314 100644 --- a/src/main/java/com/aetherteam/aetherii/world/structure/pool/AetherPoolElement.java +++ b/src/main/java/com/aetherteam/aetherii/world/structure/pool/AetherPoolElement.java @@ -44,10 +44,16 @@ public class AetherPoolElement extends StructurePoolElement { AetherPoolElement::encodeTemplate, ResourceLocation.CODEC.map(Either::left) ); public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group(templateCodec(), processorsCodec(), projectionCodec()).apply(instance, AetherPoolElement::new) + instance -> instance.group( + templateCodec(), + processorsCodec(), + projectionCodec(), + Codec.BOOL.fieldOf("replace_air").forGetter(structure -> structure.replaceAir) + ).apply(instance, AetherPoolElement::new) ); protected final Either template; protected final Holder processors; + protected final boolean replaceAir; private static DataResult encodeTemplate(Either p_210425_, DynamicOps p_210426_, T p_210427_) { Optional optional = p_210425_.left(); @@ -64,10 +70,11 @@ protected static RecordCodecBuilder codec.template); } - public AetherPoolElement(Either template, Holder processors, StructureTemplatePool.Projection projection) { + public AetherPoolElement(Either template, Holder processors, StructureTemplatePool.Projection projection, boolean replaceAir) { super(projection); this.template = template; this.processors = processors; + this.replaceAir = replaceAir; } @Override @@ -148,8 +155,7 @@ public boolean place(StructureTemplateManager templateManager, WorldGenLevel lev } /** - * Uses processors of {@link net.minecraft.world.level.levelgen.structure.pools.LegacySinglePoolElement} - * Might have a coded to determine if it should use processors of Single or Legacy Pool Elements in the future + * Based on {@link net.minecraft.world.level.levelgen.structure.pools.LegacySinglePoolElement} * */ protected StructurePlaceSettings getSettings(Rotation rotation, BoundingBox boundingBox, boolean offset) { StructurePlaceSettings settings = new StructurePlaceSettings(); @@ -157,9 +163,10 @@ protected StructurePlaceSettings getSettings(Rotation rotation, BoundingBox boun settings.setRotation(rotation); settings.setKnownShape(true); settings.setIgnoreEntities(false); - settings.addProcessor(BlockIgnoreProcessor.STRUCTURE_BLOCK); - settings.addProcessor(BlockIgnoreProcessor.STRUCTURE_AND_AIR); -// settings.setLiquidSettings() //todo + if (replaceAir) { + settings.addProcessor(BlockIgnoreProcessor.STRUCTURE_BLOCK); + settings.addProcessor(BlockIgnoreProcessor.STRUCTURE_AND_AIR); + } settings.setFinalizeEntities(true); if (!offset) { settings.addProcessor(JigsawReplacementProcessor.INSTANCE); diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/boss/arena.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/boss/arena.nbt new file mode 100644 index 0000000000000000000000000000000000000000..527a198fe0b17223949d01ab22c31bdd537b7443 GIT binary patch literal 8035 zcmeHMX;hO}8rHfEb)f|+I4GG>7L_f41F{I6Qi_aYQBlVFB__o}BG@&M<60`I`0m4I9?m6p%A^e6cSmJ1xQNd35- z+?Dj4jO`c4EDw(>m)tBXel;0MV6f7&>89sPZ`^JX^wj5WtZC3^cM+sT=9$E}eW+$x zq@7fH-Ly_5`UK;K<iNV8es1@9%VQFLHh=m!2^YDwkUQwR3hO{=ifzd8pYj$C#q#*`o}dJ21K^HG9tm;uDzV) zQZYV+X-=1o9g2+En?%p0#@}&X+stFIT`bz$i3C!yNL;|nB2L7JYr>0T0!L0r`F9Ts zT15?#M9koL_3#15cv6{5p>0_d8+9k{&N|Y`{Z8UuQO8FI*EKUl1?db4k9`g6mz3s* z)g<+gSCC#ZSRmNjLna z*rds>CUHAs>a1K!W=S(x6Fn@;#8<<3+-IB!k!@BJaiW1wY+pUrg6|an&E-n8bb`m4 zyf)maO>{QzEt_f*o)~PFCux`CryR+{mo@1j)^2`-p2UIchue9~d#Ltvi5-$~W|3oI zO;K$`cL|DsBkX0<%Q`Xlx9xLU8fZQJ4;+1fjCL9`_`G5n!M1w2=c!ZiC9!w5IXYGJ zCXSyKV`U}y2IAz;c3HWMNcq$q1_A$$@PR5ct=~!tk-B&imXJwH_7$m7lT5fD$G@c~wEbYEv+5I@N(BS@&`U3@k zsgV@tirCOH#}#yj{_}FIfJuthdDWYGC8zvggk(h4%k2>IiH};Qq(>M6!d7W#n}|O? zJ@m&Pcm;h|#U;@~UH+Q2A_JNT!(+&XN___`n(@t_=v^S?^yd1l+aP{57(dwPNeqab zKFq;5>)R0c)dR2kpEyQJ)3S2;zAIx;-|JWwT3B!`1|wGW75rSz+Um&6tEG!B=g6NO zkvz6!mNFzwwS8=Mt+bvrmQ9Mop+~9mUfs$1KTA6Wy&W${WlON*^b|RD*OMgD0hBCx zBN;E}4t@Jm^k`#XNG30fKk0h*Jg

E*k>`OfUfgI% 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/lobbies/lobby_01.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/lobbies/lobby_01.nbt new file mode 100644 index 0000000000000000000000000000000000000000..68d254a5271210206bc1b52652468c6577ddc662 GIT binary patch literal 4056 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 L%j4E{VqgFOuibS) literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_2/main_path_01.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_2/main_path_01.nbt new file mode 100644 index 0000000000000000000000000000000000000000..77c81f5e41bbdb5c8ce114bff085a04c4bab69b1 GIT binary patch literal 1178 zcmb2|=3oGW|9fX0%)9L-;@U2AYFUbi<|N6H2u}e47ye4W{I!&mn zJ$Yn$(bE@mBSRS!57>!VzW=aqqWqr1ytk`1{#37eey3(lT;J}ktCOeCx^m>=+4Wm@ zS7!Xa8~^y&&PRuD{Yj^h);f$(h-&foLxFl)V9OdomT`eB3jtfkB%YMP<^=QsPYX~`k^^Xsu>jDKX$nAh zpLI9^3P%v#Dlw}O=m8UEMI;R?rbj|_>eL!HqicS97ia=@!t(dgr}yt36CS#~brn&g>d38#9jx;MVkIksxE#OiZNYfw3>uU-4R=f{ZzG-0TQ z8FQ?n&lf+ucTR7e;gx8;bn)vFuXLwx?#|}n$qo!?Dr=PxgB;~yKX;In7y>Eb? zx>67H-Ya{cbHB<1z5a_ImMq+DyJB>%pH5ieJ`t#DF-TP)NR>uW;GR9f{hxp#_*DZG z5134#IaMOSzyzAmu~5zxq((_R31pBg(4eD5XL&&K7aW1|FBSmhO9J|!kJu|;1mY|pL8NPfFYPi9eddB(0C(ub0NN$?;4lKSiC#`n?RvpZf|^4(tcbBBGY z|Hk+4X1_Ch7j!3ozF*=E^M$vUDIWX%GV1IG?&Ll7Ilt>}{41)rl6xGmd-w5W+;6|# z-utIu-?^6R@BePJ#o8Rv%k6i*%&uIt?*9M!`NktwwHEb%6iqJgZT+$)YVX>I|95{m{W?DK z!)x}#{%77AZZTZCW9DIlwNJlS&b6O={ia#_j=Nj`X8x~?TiWqoFJ0@-v;KwiPucvR z{CLZ!m)n+4ZLJht_wJXXt-si`$@kYBva5gNU$U>fe1EIRzn;Su^B>*&`}QAe_qx?{ JCTcP;007tCRFD7w literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_2/main_path_02.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_2/main_path_02.nbt new file mode 100644 index 0000000000000000000000000000000000000000..952b552489750c653d9af351899d44af5a11f74e GIT binary patch literal 1712 zcmb2|=3oGW|9kKF2P=n)w0)GGW$!7$#%BIYb48J*w)i^T@VsE&m<7i#$XfgQ_R634 zPn&;0dPc&%=j-OIx-spa1c%+c!(YQJ{WGWWT|aw&r15;huDPsNWUk{kxsefY=LoA+7U&S@sTm?K0w^-Qr;!};?B zt0@aBJ!DT^uvx;Fnjsg|Ze+s0(php=`;~<}XPsXKv_X^=d@fFDTv#d5_AF6iR(oQG zTpQ6G!iFQ2A~x-nR0pm_8hoi)1!X&aK$AeDTHeg2IBJ6!)GzE2^n&E&+8`kLyffqot<7WhP^7 zgU?LGQ3-Y;Gd44Q-gsb+_>69*&nIUzHyulfNj6$%D0zKGPqxo7Q?z1m4B~y;!CP^sM!Cptt9G z0|VgPQed)v4ouctih;_mFO+$k`l{gfPc9xH9nkj82&lMvCQ$KSAE4s6WkALH!9c~+ zL1vy7Edk2zYyt^}UjUl_lnbOX#u21I8yN22idaFq)-8Z5#%UDDc^Ee4?bb5@S+y5r zY1Kub^Rcb z_BGk>dB5-M{9nKFe$0^%KfL|p`t`f=X4b9z{9(dx*UL5gYO~%KUyn0=8@o^P)7wY? zR=&%hy(^Zd_FVYm=UKmISIu4jZd&Yh{knZsQEQ9reV3Q}M(c~8k3W6$^>fL}se0k3 zf2r9&D~nk3YuW4B4{sO$p8k4|jJ@yWt@;1mW-V)eW){2WpI-c|-=%*`XZ5x3+JD~p z*UPWm_v&1`&xUV$zCVBO-|~+P`~B_r{QK5lYFwB5^}~YqSAV~M`2Y8{a{K@D%>S76 zWSOY1uA14dcs^O6=l#>|74z-)?K_|Pd4{<8>31)`W$*Fse1HGkkKWn;@0CB^ZuyU$ z=drc?{x=`zUj3+dY0KMR4-@|^-|+WA`TIlle|A+b>R*59<@&Dy|0n(~t?{t>ul<*M M`X`MWx=suX05+*=#sB~S literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_3/main_path_01.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_3/main_path_01.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8e3fb41d94a20b52512f48b7e5bad1c2b78c1757 GIT binary patch literal 1158 zcmb2|=3oGW|9fX0%)9L-;@U2AYFUbi-X!1si*BaRExj1J{ZNF|?a4t)ocaWo#K#+c zoEl?Ul^!PQz_Eef^Q`rr{3q<|=S1&H^ZM`de$MRvqo)hEm*l=FKBeiGSEqaTth0H} zzj(Rt?wkn|yt3Ecc3VH=RP4-Xb; z79bR&SbS)2!IW+`kYy%d%NRkH@q%<^0G&9iaRRrY3A3VjQU;q7(CIuaK$VglKzADp z6a|U{l>uqRwloEx2hKX2K+^Ckbs9wH@_ms9Q1vOceai!C!b-fG^!L%H_wQbD1&bP# zGCt;>v8*9d#K4^OOfKVPF@w`gX{iRKj&qMjl!_%^jqC|cHw;7Ngl504wEL-%u*Rx; z<13wGt2RrlK9>aN%$Q^qeZKhVy>oi&46j7%rHfyec%?gib9Xk+*J-D39yM*NI{oy` zBPr*-Pm9VvZhiyw`;~g2r(W3uz4uif=;mMiu!QAq+Z8kCUHE~3ekJjw748#(N*9Ba z20mF-Rk>X5=|K=%4j5XPOpsw3K*Op;fZ+%<2B^jr7*{}ptbhh}U$*528RNtbRJ5=e zsOW;D?W?ujQ$PQ8&b#~Q^Mqe-ZWX@R_2I(NYo@g~T+8=+*WT%QXjtE~yY^q%pPzLS zR^O{Tep>duo?@5B|2J6X7yruop4l?nUoUr-*sl5Iwau{~iai_o*Y2+NseN(H{@tI` zKUXRC-rIY-JW;rOPlnX5>-!7VuD*QjZ`Hn2&%cR7I9v`<` zr*md?L9Ttz&&t{x^Zn{JbN&94X>sA_y}PwsmVZQ#XWAXTTVME}sqvMvd#NS^0{~O4 BCwl+@ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_3/main_path_02.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/main_path/floor_3/main_path_02.nbt new file mode 100644 index 0000000000000000000000000000000000000000..6f9aa8c6fbed4e7d2c8e0db0aab7bce3d33627bf GIT binary patch literal 1691 zcmb2|=3oGW|9kHo43c&iX?-}&twE*dV9Mm>9pB^9=bqAvzRJMcqkL9l@xqvMkDs1g zq;0{}{o>EwuGLdKRpk>V-v7SqZs^SACf<{MKbNly^7?31Ss8o&lF4>wW0T6skB;li zy{EJLw!Qi1DQ^GI1Z{n1_G`i4eyzDVZB-}q^PD|wV8Va+f(?)JX9J=+ zMA`sWmiYCLxQPk>W6#e8-@miAJxjF7lsh(=SPIq2`0Xu!{))-@bAfq1slM7P2Mnz5 zRlu;j`#P}QsARo6FvzGc_^y6^K*Ec-eqf|j+XCb0-PaY)lDn=i=1WBtJnZQRbcEkR zp!ggopi3-UfjWx0fNp#)0@QX+6X?*n!9cxM%LCetzWhFX`1h2Hg2q|~kC}o+XLvSR zY8otOeYWO+5BHfh2hMPxscifikf6tP<~UPvWWqYGGwR95SbI^5Ne*lH0z$d{}$O(E0b54|eZnEUc}nkS{-T!OnIMSQ{|jw-f`D>aCqX z&%TWTdb>;y7y#DOfk83X8yG0(mI71sbD*+y&X%`MUwQcNwWtJ;1}aVkD*k2!R9rn1 zsCcgrP;uNcpkn=CpqbOPUjSu`SV4m8768pZEm{Ipxw8qRAp8PQ`%^BEt{7kxKo#RO z3gkQt8}F3ICV;G}x(KxN>ms1_uUvr+xzY`E(h6~q1>!O#%zp}A;R(H`P{@uJ= z?RU1$pZ(45KHty0j~_z5m;2t;YqNWPzI6WWs#)jW&)ycNH*f!^qp#D~&fe#B{dH>X z?C_nkVz2kT{FV0OU(BzsYWmyfZ+UrZ`+p_h%R6>@hp(UiH2d?0mHT}!zYO@!U+FP@ zz5U+1*X=*0N95P6H?nZ0a`V-#?xI(XPI(cK+$Ksp8vDzkB&EdXIOf{QYy^q|N{DeSd9d|NoPRzRk_A zzjeDj?D%ev%iCVJA3u7z>i@y__geq|@cr&0AHVc-{Og7Pl)umZF`?vV_%HDl3!>Wu HofsGZm7r9Y literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/corner.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/corner.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e11f9dbc34ae341e3c728cf74246edea975d63e2 GIT binary patch literal 687 zcmb2|=3oGW|4(Ne?7L+k(560bgLK5!*tbjbFYbN6^ZBafamvhWdwBg`Nh}O|wcGrq zk;C+(pYL~zC?0zLWA^=RZl`)Oyi(uSTdFPkIO~Mz(o?NZCYRgx&eyzqW_H=fz4LkP z>-;-+Z=3FTod5C?f3uy3JGReYO5izQaA1n$GKM*=CoQ=r7mKMq*YP=bli}Q$@N6^pxqD9An^N_TjYPUi>tM!BX7e+$>|+SJ#Wo9L`B4Gqf=- z1M0d6;<25GELQu;CZU_&YshezA(-jhp$tpo3C7Hp+2=|gY?s4Dy1@xNRKwP(N^OJha32r?Odk+{USAawzov?-T3d{ zvwOC^o8`~=L*l@320OM7h9DI@KMX)hJ*P1&e#^`Djg7h5`Lia&d?ui5KVuEggJcGI zwi<~Ki3i&6f0-%RUb!mc)16-vR&?cFzESyDORM>=RaJiMtsN27|F7KKBAHj7d;7xj z%Wt3Rt%;SEtBu&{T6DT<@8-gnxhsN8-WAGR4KLaL>7d!y(?{NKv)kdiW%ZYo+LWpn zQo9SH#e?p;-glc{x3A^Xh23ctEAkKjly`MKrvLKamnrG{-@V$-1#==aZu6Y*V~F#d^rvD+2zHL0`4rzEI<8MqLJahm@$jhZ>iho zj(#+~7w}!d_Dbq;sTXDMe}%l?_4r1&(5AzyFC5!)vOj&-@0`hhpC#GzE#$XXSq@Z6~L^`&hnw@2gWgm##kcEd9&5oj;>&V#K|}kL#JP>|8us-n+c)>bKeX zk5BD<^!C!vSo^Gt4q|H3IhG&_D zNQdO>5-o~L-wqY3kQjuk25MuDk21d?~+K|f-X3l!VVy<>{$Sh#sNgLu-5 zH+lzJC9HOHLxn>m^^OGSooJOf#ky0#d8dMSl7{#bC!VKGF=zUPfSO{aJOJ_*v4F%? zcK}sr90aO$<|-(cjN+33(zP@4xk&21%TG1DF7XL)&c15S&b9A zjShopZbK7hMe(EzHYX$v0s5OEIxW7OsdfUE%eTLgSX#C6coa z?l#|Tmh&j~&7~@HlfM_1$k*p}m?!5fH_!d`?j?WMt*K|P?X9bszW(f4iFeuM(+(8~ zU;en=?&Iyhm#x?RS+D)^%e)W5#rwE(eKglSlku_sYa;&O?&E0Q%g@Ym_us#FURB`3 z_q1hA>+Jad>hXQvZ|?Vd-o7te)*HM(cs163$?dOo~!_`m(yc>i+Mdp)~0k$p!J U=S<%be*doifp=WbyEPdY03+BHvH$=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/path_02.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/path_02.nbt new file mode 100644 index 0000000000000000000000000000000000000000..daf89c148f3a3b864809719a1805da1b86e2c0a2 GIT binary patch literal 1658 zcmb2|=3oGW|4;9n&l3(8Y54fsM@Xi9|IIJDr{b}@1 zpTEEU_^ki!swqe9#h2dfiN3ex|FtQb-`+WQ_phvbJXxx4uvPqlx3?tiTta0|arl|H>U~*~4 zNvk6`h3DDKBvK`kxex2|!icp1rtR=$bplR-sYG^oPk#UJ-G^>is`ktcCWErs!e?m4 zzt*|utn+Ju!I~GBHQ4ZDXaxv1f@Av)hU1M70BzUsF8xY+-4~#>x!Y zq#QY1LT9JfuK?QMKfAsEe;m+;W0#*L+T;>R5jGy~h#wW}))|=b%RkR=CCx*-uW#lv zEL)#0oAf5`JTScW&I9_X+7=jm->ZP8zx%qzx##Zd$aV=z6z=%H*{PKXQ*GA15J-M5 z0<@e6qTbGCkAI|$VK-NCP~t4E;;6)PT4#V+BrI{7=(9zK)@YqcZLN$;j0>3o%sQd1 zm9dHURGuwaWax8ELM@wTvT55%slzF~iJOiYL?+KzgH^a>+S!e@-J--QpE2v$Cd+La z_VM5fg0kr z0X0kqX+RT_ehE~ub0SEVI3`}x&@K2L8!mDC^fg6&LWF(U4z05v>f)wt_D{AylWN)f zy7YJ5UER|!FWf7CntJ=J{O*^#-rvu?_4Dz&-R6&X=-Jo*eRsS4;X3K|?SDTk+&y#m z?bo~8%XYoJ{jh4@u6Mb6vUlrDm;bdeHopF6XZ)S-&gI5i<)4-3+M7Pj+MJia>v!Ia z_2$9$et-X5pMIYw{C3{n-;Tcve|)ponf7$ae%U_c7Sl{$052Zu{=Ye*W$AAA2+W z_;>itz6GoAFDtz4`*DBVjoNp2^{c+`y!C@8)w1XEpO3#1H`jmWpRZW|zpQ4%ck`#8 crkCZ_zh9QSXX&0_oBwd%nB7^d?!>?V0HB9i-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/path_03.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/paths/path_03.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e63f6eeb7561036700a3d7298100f58aaf981ba7 GIT binary patch literal 1493 zcmb2|=3oGW|4(Nh%)9L-;_AL6$Ga$p{pJ__S+&<<#bZmgFMPX^rZrj1^RUPMeO12e z-e_F34KA7J$|}I}#`)x&a=rTxIOCRX@%g;*ul9A#r51ksWWrBxIdS)jU#?v6o@pH!Px71&KnKEaVX8q1b)o0c;tmK-pt6`?NfjaA%Ovd7{13FwY zQW-aEC7k1)Va|HSm9aQ;#>@pw$95_bhXPeadnBK?Nf3pO{reeoz{30pap;*RYcg?; z0J>FheSMWbqjUAegbaNtp0}>e3-@LiY!T;e`?l!dg*X$5Tit9}BsXTDNx+vM|A$T@P|g197&)1p^^f;*e4Iv47&J4f=hZIahDcF^=d5RDGd)|>u+zjRG@#sY z-MgfiyGM8I>Mkr5fBZ`C*wxsc)w?CaQ6$3O#@_p0Ct^TYt>((zr+4oQF38qso7djH z`DrrG*C~f@ell#UI`uH;r-ZZZ(+}0{V8QpYeTG+p`JUf6F7ZmUz4#4S(DK{&d4a$b z^vW6^0nQp0uY8{z`}dhk0!RZj;2`!XFTUpja?D=S3XQg3;kC9#s)NpkSN3Op*Z_*Uulm67#7nRPWt0EUWCg1Nah$Oc_ql`rFESPR z{8egQ(A`-7?vhU%^LK0Nw$*LUTxVW6@mcKW8JANhFK@S5bNk!jZ8PP{?C*X1tM>QL zr^mOKzq9*(_xHBlr_F=+#oo6!J)C>HE^`HH$ zG}rHJ!TjZi_y0Pv<#Fk)RsX+w?fJI;*wh_WKX?4uG1u4jx7E#V|FM4G z-P-s6UfiuUE#%L<`1SCY4RyEP>Hm8s_vdT!|1a_D>`$My_<8zu$v%GtCw$Cl&o#NtoW#=Y!Z4I-8|Fvb( zYLT})^vl*VDtCMisL{Br_(1aFlpOiGYPCfl=bW%ydh57M(Ffb!<5Tp+e0Tr3c)m@) ze%X=O+uj!*Cd~SBGj)G|Mej<6V+=gZJ-P;>4|IG^M$VYD*+4Zt(d!&rf!MMqaFOSS z|1!X(4o#V(i>kO^uWPfxt>T4-YzYzxIuCLhOEcatxtiB-%M@%l>m1z;d?(cpWNgju zVU%E#;I@cPkiAtL^|s%Z#o*SR$`U4t-1(;IiCcCqw&Y%XR`%>ohI5B9irtIF+-6(P z`uwn7H~}Oj|4TGs%X24)DA2w;7w2T&cV2FHRkDq{=Zq}Vj3B*4o&!^AcqW`?*vT`& zdydyu;|GTu_?hj*PNX)Ldc0x>c_He*&HUxhCDzuP%;)-G*wD{d!}B1SL7uHf;zQzr zc1C&bCz~AfxSuHP%x75qRgt;&goAvRo#=yLMmsi`aQf} z|7`YL@6`_;*{HwIKel4uvel&>>t@=k)|JaIidWlyZo8h!ve)Yhz3bm6&nws5qWL7= z-~7R@?`Jn;WITS!AL^^N=EdW}sk=A4yzA^MesgK>`SWYf`~1Fq*C@Y8J>}c{Z&v$H z&fT#7ON;D`)8|a>((U(!%;A|@Cu{!Ta^Xr7k?lFR?!HRA!^HScH|@rSo7=CH+4bsc zx9?(qxlqsin!|Mdedj;NmUq+!IvMWi%RP1bfB*h3e%|Lxz8+2ees_6Y&jNn?m-+`T LUEeuflz{;Nh^|v< literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/rooms/room_01.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/rooms/room_01.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8a34c2f4d166cf28a6aa81363c8bbd05e05f1ae1 GIT binary patch literal 1256 zcmb2|=3oGW|5In(?Yk8w(%OHXpK(#iq>!mqH&?GZKjHSa>Ah|%uSBQJnA{oM+?i`K z*Dg_hwb_QYmX^I@%Drv}o}c}7?k0Qowi(vu#T!@uJA2U5{GXk4o%-YZGiN{ZjsF_@ z?#>V6;>oFZ*Zh0;?3}3m`IsAKvU*j&IQ2?vZ$5u4dOwM)@gtKkiyD`Y(2UN5B2Cs3 zr)7Jd@*OK;Pu|(Q@y@}BcX0)9W`a(+!8D+XzboxokW_$$t3^PHVJaYI_+v3n_#m43 z2|C~R3Ky~;epkqfLh7@8cUtkd)ygqp(Saq}64ySj;R6ym_YZEEm;Rft?W;|3`ElE1 z+xMN;K;d~iniHYSGkXPIRV?%qn4w|tk_)J8H8YU7U2d@E`OSSmMd$Cx{^R0#{nOzN z&>;RJvS23nK|-4D7Ossv@BRpAZ;i^kga`=JrdYqlDh}+(6~Zl6fh&YttvpvuZm|+x z$R|;@FQUIO@p<=G2_SREZtHb|*72P{XFk^!EH`*lqY5-@uKqK=wzJ1)SWB46C%;R$ zQPZ=t`k*Y&?0&;?gB-hKKo|a$C_et2>9-72*1pz{6D0jz18C4^LuB2a1?-2PC7(gk ztqu(RvVM?G+rFL6iQg@r7XPbZ3yMkDbAY9>lW8)~G47drC)@-R@e?bP3>-gjHH8Zp zu`3pfd~#9bm&l&Gc!Fiz#G6siRVq{uYIDYUe(-7%PYZi9XWsc-Jwqt9=6PhAe#$o| z5D}h|_Iyeu>p^XfIEZ0;7CjJUU9VB$dQh7yE)b|aTxidv2UA(rt5hV$9Y0sCF!SJs z&vG7V25;VMI1_i`O)H34f8xwJ>(3y!>}h%+%CcSoroF2vTm)z$SUc1~ht^D*`~9=z zE!8#{B|8n`C6K=?Ic7G)37}`VX2J;0nUg12f{9w=&v#nSZu^7Y53 ztE=Cu{jXPlD>QfC?zN|n-`S^a{{80OFM0o-Z>zcS=hhpuz1_v;x9$I|eRF!}>^J*s zep-Bc)V=W8!>Kkga&@z;;_vR1zjjq^{jE>6|I_a3h~MRSB4)~;FSytHcXwC(F{7)` zLXQ14FE;<(zTMY;UwEYazUP$>@9#c8{j7ZHa=qG|Rf@m2uP4~@{Hg1edqsIfAx3N)p>I;f6j@% zw)6exnmfM^K7G65$79dJ$oHR;Ld|#YZoepWWV)5V|9&gm+B;hkEuU}C-F)`#4THmr yc-)#xEV*`NUVrn8zx(dDl?TF`oKHMYzW!(G?Yuol?$#9jXZE%ZwY#OwzyJXL1cl@P literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_1/lower_01.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_1/lower_01.nbt new file mode 100644 index 0000000000000000000000000000000000000000..6e0f2a7654fa7b726fac9624c1aa78a72629c430 GIT binary patch literal 2297 zcmZ`&3sjP475%fMV3nkh>vLPYodlx0So=e+0r-|u_g=l!0K5A~zF zoAWm_B+@We^uF_Xic*v0>%-jIw(ZKNIV%(1k1MSCl7Dq0_U*RQen?SJYXYy~-0HA( znE`yw5$PVP+F5UTU(c}8b_FIKJiDGHK_|8cC-uSXGO;W6uw-c9L z!I2w{j?u%rwmbUw{?eQ5r5K+2r*OQUpqYC3gFv|U(hXQuBs%%z2%I3MWOjghdo9i0)5#E<0T*EWhgIehtEfG2B9j+n%{U;CV zp=OEi7G!DWhYuFhQl++E;h41WYU1!imdVaG>VzF9WSK1zY~EOcd>nmVOb0vd zjqj3Y)84E-FcGF=R{(R8OB8o_!!cXJ69~h9^{~&6deZE@5Yx0Z>rxM!ab@{zx{r8L=8sWKv3lk?GF!%dkalan0gFzbCglu`-0ZXIBXht9^XCup zM0io0JIxdm;C;ErM)Usa*?~&9#4{a<2uyN#b<{9({;cWKJ<5eNQ-QPP(=?t`E-4n_ zmCj~CP&0iLr18+H!KW5=)F2>(BZohNi8fZ~{h3W%qM&00fyoX}_+r=tCJL^Y*K&5? zHFPXzN!zk!o%pj5uFR5f+Jkz3${XArmJ_I63)v6M0Mo*uX``WOff>-9K+eK3wD32Z zbtriT<^Gf`^F`_rgX%mbz4w-Wv4`2P8&*X`|8tCTbJ3aDRPf(FKH#Wo#S#X6{3kpS zEMBfc9bu%dGRN(P6AHavMtkF4_%$Rtc@;{ydLG2e5Uj?#)BfPj4bF!QJwO>tJwFU?T2&er zh(gW{*RXlo6_DCepk~Qop%Ce_Ye-yC2+cgeW@hbKXI^R zB9O231-yfBzzfX4vOj+fALIQ5%8Bz|~McBUzJlV*=`JsIA zx#BC}h;xHN4dji~L;k^L&`D?wmfdyYVEI79rh$oA6+I6a*FLeI7D7MoEC?oV08$wR zkcenN3J_-Kj+DM}&EDt*&(pd=gS%OD7G;+Kq)mMaH7TPs13Bsg4kMx)slTOa!R<&` zrcFtsyFe{F3Djah?NJRlDQ<%q-346{5V4fir+pIuR_|aQc+z~jb3vDn0mCN&ssVS? z%2=jv>hnVZ@6_~l)hg8$|*VzXcA!jsKyVhLAOrfIb(ODNF##cImj@t$veF&!Iq#pR&R<2d(EslEsLsb;6X$@o-X z=}O;0bt$Hdev*Vx-Q-Hw57b6Ixd&HKe!B?ldL&?(thuu(Pc|I_j3Yx{Yk+Ya$T+D~ z*)R87|rwmT3S$9J9bwSw3}A5*E;0Yz7{VrqN)mLBZ9;k z_P1BfVnN2_^zt2r6OGqZdCKX|9g4_p572e_xcpI;gP}Bxr_4;&9;lK0z4IeJ9vAdT z!C#)=tRXK=WS91FSF5rXR63Hk2CELYFyH%IT)v?oXy2H*N}VM)vdgU8i8Rto|B8Pn z?BrsEs=n;>nQ873wn=y>Mt;Ij?Gbr$m z7`JWamQyHYbO0*;$;T*uUyH$Zj@;``#xc&@hty$;>H6#`ez%w9VYG&G%fS9_nL@Ru d-;unpileiuNBoBD9Kp;Rr&MvrnN&Bo{{g~VlLG(% literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_1/upper_01.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_1/upper_01.nbt new file mode 100644 index 0000000000000000000000000000000000000000..5de3596c076f190dda4b3e739eb88ab8416a5ee3 GIT binary patch literal 2195 zcmaixeNfVO9LK%YQZA=E*`;(5xf9GD1Ru(whS%jfbB5Qr8e4}CpmvrI=TOKJE%Wp^ zSyqNQxqSrkuW1MOC>^O-yb=L#;xCd?>-N|@Avh2e?A{n zsf&~Cv)->&W@s22_7}`6+q|+bP%IvMTYr8+?LXI$vVH6B^6Q5q%euEj34Sl5_)Q-Q z<>V+S&(9=oA$0VcBS*{D2QshS+d7$Qvh-d4(SHo97}JjHO9P1|$*r%2BtJpHpW;EK zNz5}w*I7>=3P7vjcDt_GbCK8$(+7%2F9>h@!C*Zvo5~OG9JP=3N_#7&c z$5r|0g4y_VDzS#ELhG{Gcovl?;0F2VT-kUU)h#C5_#jg6$RP3+`vZ%b7Dxw*aV-Vg z9)B&Ji$xSoyZeN@E-ZV*QI zK)u*Rcb3kT@xlP)_3+uI1sWo*^SF(+(?&z@^U_4zNphiCL=~<#B8v}0ssTIL#s;b} zkZQmdKy08Iu({kdG>c4u1TPuJN4_f-jL*5FItoJoOAyDAFOzVUHmbP^d2sRbh` zPZ(OOLURezd`ow&cfhfzUId(;kmjqNcBO@Noj>NKfic1*YGR|STs55-cJ+#DVw!I= z#4I`j=D~X!4Vds9l5GJZVs9OsUcFX@;re&Yuua4E@>Za<2q~j5nan4g*1&k6)v&AO z5H;IIB|_8$yM=LgcV)wbvG?=@n>r7=w0qOCDjN!^v`Kh7Q#DBZ8yX<&zKvQ5QD-3P zT6tqMr0!LBEha#8pf?pxAL_344-oy(I{~MEuLW-enc27gA*D7NNfnJ$Tcw$zPJDHy$o4@$Xg~eP$+kViT zc4HPOaiSY34OKuP=yl2AO@d!3sxS1H*Crtg7=J0~NvrOhO019F ziSja#j(VA#!+4iO7;w^(cVqUpvIzPtvwOeNs1M0!XyU?qMkMpojrd;Kc%?xu p4uJV`1o3%p;U`(7PK${#xX29U`(ypatheT2@>#F5?r}~|{{UXuWPtzx literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_2/lower_01.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_2/lower_01.nbt new file mode 100644 index 0000000000000000000000000000000000000000..12bc406e1bfcc6c21f07e7624d4de3d782d4a2b9 GIT binary patch literal 2297 zcmZ`&3s90-6t>B>7+q^+oY5_!b`h)f0hm_k!i;O%L(?gze54_gwwCEMAf%$smaDmy zWtO6djFpjTi>8egDk+5~iEjAX2%H{b<^xw!LIn5zq?;KrXU-h%J>U18``!N{&#tgA z{bmO^lK9pC*lkZ}kQ_xJXum$$@#yqZZ|T<74MC;OSB}#+Tw3pk!ILg_*u);&8z1I9 zOk3T0ec6g{Dj(k#Fcc5;ANC;w!jLUD^nvmapr)XsvbJ}N? z-q4`$eR<>Zw2;5MM!xps-@0oX739Kv-H@FdcK@kzxPM;cb4!^ci_l~Zi?L>H%3be& z*=&$Gt*g*&W@Egb1pgX}{Z&+z-{BSTXtUAhgv-b_A8TwKntjbjPPR4qs`(&B|LD-% zcP?UACdN~H;FXnFbx5<{k@hYlfYUhy$EW%n+4>;;`u zRF}rcxw1xg%NC#L!wY!(9>yV*x}#{B8B$i~@70F5UW9n6#)Lfo;Z(KZ#Thq1Vk+Yr zZ$UEUkPI&nl38Esj-~-ld1BTalKK;*Q3vGGZZM)ojwCyQqIY*DhOVx?M848mwfk)s zjDs(gp=d=J0qo9LI6lIM=eKwa_ogv~yHp4jRQW=`|JR_i>bI5kltbiwFxmb$)NNFl1Ro)Tq zUg^muvO^FVufU|?2x&NrHkAfBK?dh_#@gbK`|$R>rNKC^r7|blbcXa|r-Ln?;BB21gB|O@-RazS0ym5ynfoF8ff-<06f`XxniiN52$=z#MbX3= zHULUjKkU;{w4X|c62dJjQn%d=D|@A&+}58Hd3Ew(Eeu_w0^j};k$z7ugVpNg{|14c zuz@FKW!H;*l}~P>SR0U^2bao6v9OWPeF>Poiz6ax_MxwCaU7n=o?596+VRDPuWnqK z{Fxy62Q?;Fi>+2+t4m}%T=1A&hW+phiI&O7dOGzLRXi%HAXUY%;jaCpwDQ1quXF7% z6+*1C)Ywp{r;@U2wlz&`OBY&#KLblmDep;(%2KjQ90OaJOb;1)fD}z;^rF;C_4P~$ zAz&6J7Q>#sOx695%Q z0#E=(UHsZ}DN9R5qU_mApusIvoWYda0^oFF9q1kNRAYL)z+v#c^`el$B5*t58Y#7_ zhX>ZCyTBS3S_=XvO+Bh4S3*|=Legn?YYwJ(G(r1mflUj?`_%gXbTfoA^Pn$}W9rwXE(iL9%8&XDAN5m&X7u$UvtlXi z@oqHpE{qh>99%Ho?Z|8jNr&um(@53u(7DovVu%LD34w8w1;98X4j4xwr3g2+t44A8 zV=bdcYc8JEwGtor_D>X*?-DK+Q zy(D777Je|Bp;6%a`y11Xr?eHZRKdugZZbZMutq$g5Ol|c^`{x7!juD?1Ns{?RR;qZ z8c}^{JVW127lx&6;^rGf7ovt_?Ir!x<|OLB2rbG|_M z{j(X*I@n&O&eB&eKNrP(nKQKcPvXzV){<(U_wUKl(Hjg~)v$r#Dx+}AqXDfD=fsQ^ z5OJdTunq~Xzqm2&{e(78P9zExW4zaPjSUAAkZNKHvw7x4C-xybeWXs1ls?V1$WdOf zA||r~2yNph2+nmE1e#;QJKr@jU&Lu8SqUc%Wc>#hK2kNr&Y!&}FuYlJGBv1CFR%5V YE!Jkq{Mxj$uCq(Ka^J&fWDAS`0J49WWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_2/upper_01.nbt b/src/main/resources/data/aether_ii/structure/dungeon/infected_guardian_tree/staircase/floor_2/upper_01.nbt new file mode 100644 index 0000000000000000000000000000000000000000..68c4a3897b289a6e134992464d7150de1b0c1997 GIT binary patch literal 2195 zcma)33rv$&6n2q-WDHE3D7X~{@^H$dfFe+6<8Ve^C61v?Do`pz5Z&sJ6nT{B42;1< zr$E6%H@DF^0qJ;Cpp@3)XlXaAh%3lsv&ew*5U7Pdc7O0uYWKJ~$@%Wdz2EnpbLmz{X_}M}%Hd|={QQ?=wC&ux=GDRI6X(VeVT|}Z6K~V7lH2tmqU%WL zFFxJblNl^ZMnb>w>F%D)P|-LNTH@2~J(Ko}Y>-g=HOS1_pJF8S%|Je1+ZRnSLcGqi zG?Br1=;qw*KW`K)MmX6VEU>u2r~7*{@uFk|RKchFcrwF9;|QpoPse&PBSba`D34F~ z^fVJJ7FS}x&&i>)EDdSQvS`XqI5QU&3bUoGu({dv3~H}C1zF2*O-G}hylN1zYrqX$ zBVgBn8@NWmuCXhw5s-lY4tSof=pNLvpqCo1ydH@OX_|MG)FUo

rnz(H3zS1Ha*G1Lpae0Eww{FHUP!W*nWqQv2J!WO*a*_kB}P|Wu#%bA z9^F8~d|LuIT^eD|^9KQEWjvUH-{}N=B~9u`^WmnMS4VV=t+A(1g_59~k*>VC`3Exm z6GzahdF2Z0WtcS$W;GGMS{S#{ygC$}Ga9H|ad(mC?JVzp;cA6yG9wSRP|B2u(%<(0 z1H?ap2WZ~8!deEiM(0Jr?jl{}I}7~66Yy7QQfGNuf!~n?JcB0H?|ivej9NQQ(D_fz z8t?t^l1$+xN#2E*WCJ_LmD-10F%m^nvBHhceMUl%+3R(_U`=!^?l}i4EOCz$d1+cADIIE7~9#u*I>_+_lV| z|G_NTyym?TX-Q1)u2D-8>i!qNIbkd4l?-}CCA|XKWhSJ+V=4j%S+wxYV<>PM&Y(rB z3NV9JkX7dE6JN8#&CYrvL}(^xzcY81RkxD@ZczRUF!r&%{uR^-IN@i7M$!y{Ndsnn z02+sY1^^AaYYoU7vopHh>oXH9-33zErtJ8d2v|K5s2i4m1?(>1C2|#1H8kj7ttX`T zA!1Dgh76uf@lk@MMkJ+btKpkBNjWL1?r6qg?ES!!e-Zm1`Ujc}^cSELEx^WWNwRPO zjDP`;`T8mt%X>bR_pR3!s=wlq_K_0#%qKRX z%83q)Yhr+SS+m$r-4dEL*v05mPE+#7wXHeqj;e<^cZOJ}^_48o-JEJvd!cr-hbQu_ z@+s2nj3!J+rJ`({_*B7Ld{!^B^%0UQVk>n6iVRL*_|1okF;%N-{2o>7i|U;lmJJix zBiUy>bkCM3;*7{xtfECJT^_GbwJm0=T4S&|s<7CqYK=-VDd)xI9uRyuZQF`BsF^A zbeRuE=;e>dY({BfI~$!;rX!^0s#7p_En~&G5Ql*a$nMDKQFDIr>t-{GpZXOGbL*+; zIL>T?Y;p8}!d70K-%rH4a|m(TuY!GvYV|1eJ9pyh+%Ts_xX6*trkx2^X>%V(_%`$r JtYX)#`y0~uX0-qS literal 0 HcmV?d00001