From 2cfbac0367bb8bba415ed3317292430975a964bc Mon Sep 17 00:00:00 2001 From: Anonymous Hacker Date: Thu, 14 Apr 2022 22:30:10 -0400 Subject: [PATCH] 1.18.2 Update Yep, it's the entirety of the 1.18.2 update. This is technically version v1.15.0-alpha1 but I am pushing to the v1.14.0 indev branch because I plan to delete it and merge into the standard 1.18.x development branch after this commit. Tons of changes, of course. Most are worldgen related, and now most structures are data-defined. Meaning, no more configuration of structures with the IW config file. Make a datapack! Various entities have been tweaked for QoL reasons. Particularly, Tiltros entities have changed. Lava Revenants now have multiple hitboxes (i.e. head, body, tail, wings) and are overall more dangerous. They can break weak blocks to un-stuck themselves or to chase the player. Like the ender dragon. This also means different areas take different levels of damage. Try aiming for the head for extra damage. Of course, hitting areas like the tail will result in lower damage output. Celestial Towers have not changed too much, but a lot of optimization has been completed. No more 50ms lag spikes when one tries to spawn! Additionally, Celestial Lanterns can be much more effective without destroying tick times. Oh yeah, Tiltros exists again. Dimensions are back, because biomes exist again. Do note, this is done via the Terrablender library and it is MANDATORY. Tiltros also looks a bit different than before, this is because carvers are defined via JSON now and I created a new one from scratch instead of attempting to port the code-defined one to JSON. Back to configuration changes, there are also no more options for disabling entity spawns. This is now done by modifying the biome/structure JSON for where they spawn. Again, make a datapack! Some structures have been modified. Not much has changed for the most part. Battlefield structures have changed quite a bit however, and fit in much better now. Battlefield Villages no longer exist, and have been replaced with a small fortified town structure. Some other refactoring or cleanup has occurred. Most is related to 1.18.2 changes, other bits are just for general cleanup. Yes, I am aware that some bugs do exist and a lot of polishing can be done. That's why this is an alpha release. --- README.md | 43 +- build.gradle | 23 +- gradle.properties | 16 +- gradle/wrapper/gradle-wrapper.properties | 2 +- src/generated/resources/.cache/cache | 16 + .../forge/tags/worldgen/biome/plains.json | 8 + .../loot_tables/chests/hans_hut.json | 117 + .../loot_tables/chests/hans_hut_cask.json | 46 + .../has_structure/abandoned_factory.json | 7 + .../biome/has_structure/battlefield_camp.json | 6 + .../biome/has_structure/battlefield_town.json | 6 + .../biome/has_structure/bear_trap.json | 7 + .../biome/has_structure/campsite.json | 7 + .../biome/has_structure/cloud_island.json | 6 + .../biome/has_structure/destroyed_house.json | 6 + .../biome/has_structure/graveyard.json | 6 + .../biome/has_structure/hans_hut.json | 7 + .../biome/has_structure/landmine_trap.json | 6 + .../biome/has_structure/pitfall_trap.json | 6 + .../has_structure/underground_bunker.json | 7 + .../biome/has_structure/water_tower.json | 6 + .../immersiveweapons/ImmersiveWeapons.java | 21 +- .../decoration/AzulStainedOrchidBlock.java | 57 +- .../decoration/CelestialLanternBlock.java | 60 +- .../WarriorStatueBase.java | 2 +- .../WarriorStatueHead.java | 2 +- .../WarriorStatueTorso.java | 58 +- .../AbstractTeslaSynthesizerBlockEntity.java | 8 +- .../CelestialLanternBlockEntity.java | 72 + .../blockentity/MedicStatueBlockEntity.java | 36 +- .../MinutemanStatueBlockEntity.java | 34 +- .../jei/ImmersiveWeaponsJEIPlugin.java | 8 +- .../client/model/LavaRevenantModel.java | 2 +- .../entity/layers/LavaRevenantEyesLayer.java | 2 +- .../entity/mob/LavaRevenantRenderer.java | 2 +- .../immersiveweapons/config/CommonConfig.java | 388 +-- .../container/SmallPartsContainer.java | 6 +- .../data/CustomDataGenerator.java | 4 +- .../data/loot/BlockLootTables.java | 2 +- .../data/loot/ChestLootTables.java | 37 +- .../data/loot/LootTableLocations.java | 3 + .../data/recipes/RecipeGenerator.java | 52 +- .../data/tags/BiomeTagsGenerator.java | 74 + .../data/tags/BlockTagsGenerator.java | 14 +- .../groups/forge/ForgeBlockTagGroups.java | 12 +- .../tags/groups/forge/ForgeItemTagGroups.java | 30 +- .../groups/forge/ForgeWorldGenTagGroups.java | 11 + .../ImmersiveWeaponsBlockTagGroups.java | 7 +- .../ImmersiveWeaponsItemTagGroups.java | 37 +- .../ImmersiveWeaponsWorldGenTagGroups.java | 35 + .../minecraft/MinecraftBlockTagGroups.java | 33 +- .../minecraft/MinecraftItemTagGroups.java | 35 +- .../ai/goal/CelestialTowerSummonGoal.java | 139 +- .../monster/AbstractDyingSoldierEntity.java | 81 +- .../AbstractWanderingWarriorEntity.java | 61 +- .../entity/monster/CelestialTowerEntity.java | 63 +- .../LavaRevenantEntity.java | 259 +- .../lava_revenant/LavaRevenantPart.java | 76 + .../neutral/AbstractMinutemanEntity.java | 4 +- .../projectile/AbstractBulletEntity.java | 10 +- .../event/ForgeEventSubscriber.java | 57 +- .../event/ModEventSubscriber.java | 1 + .../init/DeferredRegistryHandler.java | 18 +- .../immersiveweapons/init/PacketHandler.java | 4 +- .../init/PostSetupHandler.java | 22 +- ...RecipeType.java => CustomRecipeTypes.java} | 11 +- .../item/crafting/SmallPartsRecipe.java | 2 +- .../item/crafting/TeslaSynthesizerRecipe.java | 2 +- .../util/GeneralUtilities.java | 7 - .../world/TiltrosTeleporter.java | 38 +- .../level/levelgen/OreGeneratorHandler.java | 238 +- .../world/level/levelgen/Structures.java | 329 -- .../levelgen/biomes/BiomesAndDimensions.java | 20 + .../biomes/IWOverworldBiomesProvider.java | 33 + .../levelgen/biomes/SurfaceRuleData.java | 28 + .../treedecorators/BurnedBranchDecorator.java | 24 +- .../structures/AbandonedFactoryStructure.java | 76 - .../structures/BearTrapStructure.java | 76 - .../structures/CloudIslandStructure.java | 43 +- ...siteStructure.java => DestroyedHouse.java} | 48 +- .../level/levelgen/structures/HansHut.java | 94 + .../structures/LandmineTrapStructure.java | 76 - .../structures/OuthouseStructure.java | 76 - .../structures/PitfallTrapStructure.java | 44 +- .../UndergroundBunkerStructure.java | 61 +- .../structures/WaterTowerStructure.java | 76 - .../levelgen/surface/SurfaceRuleBuilder.java | 155 + .../loot/LogShardsLootModifierHandler.java | 2 +- .../resources/META-INF/accesstransformer.cfg | 7 +- src/main/resources/META-INF/mods.toml | 17 +- .../assets/immersiveweapons/lang/en_us.json | 41 +- .../models/item/encyclopedia.json | 50 +- .../models/item/lorebook.json | 100 + .../textures/item/encyclopedia.png | Bin 5577 -> 6184 bytes .../textures/item/lorebook.png | Bin 0 -> 20116 bytes .../immersiveweapons/dimension/tiltros.json | 13 + .../dimension_type/tiltros.json | 17 + .../patchouli_books/lorebook/book.json | 12 + .../categories/neutral_creatures.json | 5 + .../structures/battlefield_house/house_1.nbt | Bin 3600 -> 0 bytes .../structures/battlefield_house/house_2.nbt | Bin 2414 -> 0 bytes .../structures/battlefield_town.nbt | Bin 0 -> 58118 bytes .../structures/destroyed_house/house_1.nbt | Bin 0 -> 2897 bytes .../structures/destroyed_house/house_2.nbt | Bin 0 -> 2538 bytes .../immersiveweapons/structures/graveyard.nbt | Bin 7091 -> 7123 bytes .../immersiveweapons/structures/hans_hut.nbt | Bin 0 -> 2920 bytes .../immersiveweapons/structures/house_1.nbt | Bin 3605 -> 0 bytes .../immersiveweapons/structures/house_2.nbt | Bin 2414 -> 0 bytes .../immersiveweapons/structures/outhouse.nbt | Bin 2495 -> 0 bytes .../structures/pitfall_trap.nbt | Bin 336 -> 335 bytes .../structures/underground_bunker.nbt | Bin 6950 -> 6854 bytes .../battlefield/houses/medic_station.nbt | Bin 2843 -> 0 bytes .../battlefield/houses/soldier_post.nbt | Bin 4085 -> 0 bytes .../structures/water_tower.nbt | Bin 2955 -> 3192 bytes .../worldgen/biome/battlefield.json | 198 ++ .../worldgen/biome/tiltros.json | 100 + .../worldgen/configured_carver/tiltros.json | 47 + .../worldgen/configured_carver/trench.json | 44 + .../configured_feature/burned_oak_tree.json | 56 + .../patch_wooden_spikes.json | 11 + .../abandoned_factory.json | 26 + .../battlefield_camp.json | 26 + .../battlefield_town.json | 26 + .../bear_trap.json | 14 + .../campsite.json | 26 + .../cloud_island.json | 14 + .../destroyed_house.json | 26 + .../graveyard.json | 26 + .../hans_hut.json | 14 + .../landmine_trap.json | 14 + .../pitfall_trap.json | 14 + .../underground_bunker.json | 26 + .../water_tower.json | 14 + .../worldgen/noise_settings/tiltros.json | 2947 +++++++++++++++++ .../placed_feature/burned_oak_tree.json | 47 + .../placed_feature/patch_wooden_spikes.json | 19 + .../structure_set/abandoned_factory.json | 14 + .../structure_set/battlefield_camp.json | 14 + .../structure_set/battlefield_town.json | 14 + .../worldgen/structure_set/bear_trap.json | 14 + .../worldgen/structure_set/campsite.json | 14 + .../worldgen/structure_set/cloud_island.json | 14 + .../structure_set/destroyed_house.json | 14 + .../worldgen/structure_set/graveyard.json | 14 + .../worldgen/structure_set/hans_hut.json | 14 + .../worldgen/structure_set/landmine_trap.json | 14 + .../worldgen/structure_set/pitfall_trap.json | 14 + .../structure_set/underground_bunker.json | 14 + .../worldgen/structure_set/water_tower.json | 14 + .../battlefield_camp/start_pool.json | 16 + .../battlefield_town/start_pool.json | 16 + .../destroyed_house/start_pool.json | 25 + .../template_pool/graveyard/start_pool.json | 16 + .../template_pool/hans_hut/start_pool.json | 16 + src/main/resources/pack.mcmeta | 2 +- update.json | 5 + 156 files changed, 6399 insertions(+), 1728 deletions(-) create mode 100644 src/generated/resources/data/forge/tags/worldgen/biome/plains.json create mode 100644 src/generated/resources/data/immersiveweapons/loot_tables/chests/hans_hut.json create mode 100644 src/generated/resources/data/immersiveweapons/loot_tables/chests/hans_hut_cask.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/abandoned_factory.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_camp.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_town.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/bear_trap.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/campsite.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/cloud_island.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/destroyed_house.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/graveyard.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/hans_hut.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/landmine_trap.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/pitfall_trap.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/underground_bunker.json create mode 100644 src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/water_tower.json rename src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/{portal/statue/warrior => warrior_statue}/WarriorStatueBase.java (97%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/{portal/statue/warrior => warrior_statue}/WarriorStatueHead.java (98%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/{portal/statue/warrior => warrior_statue}/WarriorStatueTorso.java (84%) create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/CelestialLanternBlockEntity.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BiomeTagsGenerator.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeWorldGenTagGroups.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsWorldGenTagGroups.java rename src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/{ => lava_revenant}/LavaRevenantEntity.java (69%) create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/lava_revenant/LavaRevenantPart.java rename src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/{ICustomRecipeType.java => CustomRecipeTypes.java} (68%) delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/Structures.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/BiomesAndDimensions.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/IWOverworldBiomesProvider.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/SurfaceRuleData.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/AbandonedFactoryStructure.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/BearTrapStructure.java rename src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/{CampsiteStructure.java => DestroyedHouse.java} (54%) create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/HansHut.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/LandmineTrapStructure.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/OuthouseStructure.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/WaterTowerStructure.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/surface/SurfaceRuleBuilder.java create mode 100644 src/main/resources/assets/immersiveweapons/models/item/lorebook.json create mode 100644 src/main/resources/assets/immersiveweapons/textures/item/lorebook.png create mode 100644 src/main/resources/data/immersiveweapons/dimension/tiltros.json create mode 100644 src/main/resources/data/immersiveweapons/dimension_type/tiltros.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/lorebook/book.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/lorebook/categories/neutral_creatures.json delete mode 100644 src/main/resources/data/immersiveweapons/structures/battlefield_house/house_1.nbt delete mode 100644 src/main/resources/data/immersiveweapons/structures/battlefield_house/house_2.nbt create mode 100644 src/main/resources/data/immersiveweapons/structures/battlefield_town.nbt create mode 100644 src/main/resources/data/immersiveweapons/structures/destroyed_house/house_1.nbt create mode 100644 src/main/resources/data/immersiveweapons/structures/destroyed_house/house_2.nbt create mode 100644 src/main/resources/data/immersiveweapons/structures/hans_hut.nbt delete mode 100644 src/main/resources/data/immersiveweapons/structures/house_1.nbt delete mode 100644 src/main/resources/data/immersiveweapons/structures/house_2.nbt delete mode 100644 src/main/resources/data/immersiveweapons/structures/outhouse.nbt delete mode 100644 src/main/resources/data/immersiveweapons/structures/village/battlefield/houses/medic_station.nbt delete mode 100644 src/main/resources/data/immersiveweapons/structures/village/battlefield/houses/soldier_post.nbt create mode 100644 src/main/resources/data/immersiveweapons/worldgen/biome/battlefield.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/biome/tiltros.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_carver/tiltros.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_carver/trench.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_feature/burned_oak_tree.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_feature/patch_wooden_spikes.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/abandoned_factory.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/battlefield_camp.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/battlefield_town.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/bear_trap.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/campsite.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/cloud_island.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/destroyed_house.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/graveyard.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/hans_hut.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/landmine_trap.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/pitfall_trap.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/underground_bunker.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/water_tower.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/noise_settings/tiltros.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/placed_feature/burned_oak_tree.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/placed_feature/patch_wooden_spikes.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/abandoned_factory.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/battlefield_camp.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/battlefield_town.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/bear_trap.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/campsite.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/cloud_island.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/destroyed_house.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/graveyard.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/hans_hut.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/landmine_trap.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/pitfall_trap.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/underground_bunker.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/structure_set/water_tower.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/template_pool/battlefield_camp/start_pool.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/template_pool/battlefield_town/start_pool.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/template_pool/destroyed_house/start_pool.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/template_pool/graveyard/start_pool.json create mode 100644 src/main/resources/data/immersiveweapons/worldgen/template_pool/hans_hut/start_pool.json diff --git a/README.md b/README.md index 812094101..8dce10f2a 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ ![Immersive Weapons Logo](logo.png) -# Immersive Weapons for Minecraft 1.18.1/1.18/1.17.1/1.16.5/1.16.4/1.15.2 +# Immersive Weapons for Minecraft 1.18.2/1.18.1/1.18/1.17.1/1.16.5/1.16.4/1.15.2 ![CodeQL](https://github.com/AnonymousHacker1279/ImmersiveWeapons-Mod/workflows/CodeQL/badge.svg) [![](http://cf.way2muchnoise.eu/full_494454_Downloads.svg)](https://www.curseforge.com/minecraft/mc-mods/immersive-weapons) [![](http://cf.way2muchnoise.eu/versions/494454.svg)](https://www.curseforge.com/minecraft/mc-mods/immersive-weapons) [![CodeFactor](https://www.codefactor.io/repository/github/anonymoushacker1279/immersiveweapons/badge/master)](https://www.codefactor.io/repository/github/anonymoushacker1279/immersiveweapons/overview/master) -## A weapons mod for Minecraft 1.18.1/1.18/1.17.1/1.16.5/1.16.4/1.15.2 +## A weapons mod for Minecraft Immersive Weapons is a weapons mod more than just a weapons mod aiming to spice up your combat skills. @@ -40,37 +40,34 @@ A few other notes: Active development will be focused on the latest Minecraft version. You should upgrade to newer versions of Immersive Weapons for bug fixes and new features. -When looking at the mod file, the version looks like this: "immersiveweapons-\-\". For example, "immersiveweapons-1.17.1-1.6.0". The Minecraft version is simple: it only changes when the mod -is updated to newer versions of Minecraft. +When looking at the mod file, the version looks like +this: `ImmersiveWeapons--`. For example, `ImmersiveWeapons-1.18.2-1.15.0`. +The Minecraft version is simple: it only changes when the mod is updated to newer versions of Minecraft. The Immersive Weapons version is a bit more complex: -When the first number changes (**1**.6.0), it is a major change. For example, changing from a beta to a full release. -This probably won't change. -When the second number changes (1.**6**.0), it is a minor change. For example, adding new features, improvements, etc. +When the first number changes (**1**.15.0), it is a major change. For example, changing from an in-dev to a full +release. This probably won't ever change. +When the second number changes (1.**15**.0), it is a minor change. For example, adding new features, improvements, etc. These are usually content releases or large rewrites. -When the third number changes (1.6.**0**), it is a bugfix/patch. These are small changes that correct behaviors or +When the third number changes (1.15.**0**), it is a bugfix/patch. These are small changes that correct behaviors or otherwise add small functionalities. You should always update to the latest bugfix/patch version. Updating to the latest minor version is also recommended, but can be treated with a lower priority. Read the update changelogs associated with new releases for any important information about that release. -This table lists the latest Immersive Weapons version for a Minecraft version. If anything is listed other than **Latest**, -consider it to be at the End of Life. In some cases, an older version will receive bugfixes should the +This table lists the latest Immersive Weapons version for a Minecraft version. If anything is listed other than +**Latest**, consider it to be at the End of Life. In some cases, an older version will receive bugfixes should the community describe an interest in it (This excludes versions listed as **N/A - Build From Source**). -| MC Version | Immersive Weapons Version Support | -| :-- | :-- | -| 1.18.1 | [(BETA) Latest](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases) | -| 1.18 | [(BETA) 1.13.0-beta9](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.13.0-beta9) | -| 1.17.1 | [1.12.1](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.12.1) | -| 1.16.5 | [1.4.3](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.4.3) | -| 1.16.4 | [1.1.1](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.1.1) | -| 1.15.2 | [N/A - Build From Source](https://github.com/AnonymousHacker1279/ImmersiveWeapons/tree/1.15.2-dev) | - -***Note: 1.18.x releases are currently in a beta state due to major breaking changes in the Forge API and MC 1.18. -Expect missing features and potential game-breaking bugs.*** +| MC Version | Immersive Weapons Latest Version | +|------------|--------------------------------------------------------------------------------------------------------------| +| 1.18.2 | [(ALPHA) Latest](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases) | +| 1.18.1 | [(ALPHA) 1.14.0-alpha1](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.14.0-alpha1) | +| 1.17.1 | [1.12.1](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.12.1) | +| 1.16.5 | [1.4.3](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.4.3) | +| 1.16.4 | [1.1.1](https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.1.1) | +| 1.15.2 | [N/A - Build From Source](https://github.com/AnonymousHacker1279/ImmersiveWeapons/tree/1.15.2-dev) | ## Contributing @@ -104,4 +101,4 @@ Translations other than English are generated automatically using my [Mr. Worldwide](https://github.com/AnonymousHacker1279/MrWorldwide) toolkit. Chances are that it's not completely accurate and needs refinements. I do not have the time nor will to refine these. -If you want to clean up the translations then go ahead and make a contribution. I appreciate it. +If you want to clean up the translations then go ahead and make a contribution. I appreciate it. \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5ea1b2bbc..09fb4cc61 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,8 @@ buildscript { repositories { maven { url = 'https://maven.minecraftforge.net' } maven { url = 'https://maven.parchmentmc.org' } + maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } + mavenCentral() } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true @@ -108,22 +110,27 @@ sourceSets.main.resources { srcDir 'src/generated/resources' } dependencies { implementation 'org.jetbrains:annotations:23.0.0' - minecraft forge_version + minecraft "net.minecraftforge:forge:${forge_version}" // Include JEI - implementation fg.deobf(jei_version) + implementation fg.deobf("mezz.jei:jei-${jei_version}") // Include WTHIT - implementation fg.deobf(wthit_version) + compileOnly fg.deobf("mcp.mobius.waila:wthit-api:${wthit_version}") + runtimeOnly fg.deobf("mcp.mobius.waila:wthit:${wthit_version}") // Include Patchouli - compileOnly fg.deobf(patchouli_version + ":api") - runtimeOnly fg.deobf(patchouli_version) + compileOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}:api") + runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:${patchouli_version}") + + // Include TerraBlender + implementation fg.deobf("com.github.glitchfiend:TerraBlender-forge:${terrablender_version}") } // This block of code expands all the gradle properties in the specified resource targets. // It copies them into the targets and expands all the defined properties. -def resourceTargets = ['data/immersiveweapons/patchouli_books/encyclopedia/book.json'] +def resourceTargets = ['data/immersiveweapons/patchouli_books/encyclopedia/book.json', + 'data/immersiveweapons/patchouli_books/lorebook/book.json'] def intoTargets = ["$rootDir/out/production/resources/", "$rootDir/out/production/${project.name}.main/", "$rootDir/bin/main/"] def replaceProperties = [build_version: version] processResources { @@ -175,4 +182,8 @@ publishing { url "file:///${project.projectDir}/mcmodsrepo" } } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c49bd94ae..0e56373f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,12 @@ org.gradle.jvmargs=-Xmx6G org.gradle.daemon=true -version=1.18.1-1.14.0-alpha1 -group='com.anonymoushacker1279.immersiveweapons' +org.gradle.caching=true +version=1.18.2-1.15.0-alpha1 +group=com.anonymoushacker1279.immersiveweapons mappings_channel=parchment -mappings_version=2022.02.13-1.18.1 -forge_version=net.minecraftforge:forge:1.18.1-39.0.79 -jei_version=mezz.jei:jei-1.18.1:9.2.1.69 -wthit_version=mcp.mobius.waila:wthit:forge-4.4.1 -patchouli_version=vazkii.patchouli:Patchouli:1.18.1-65 \ No newline at end of file +mappings_version=2022.03.13-1.18.2 +forge_version=1.18.2-40.0.52 +jei_version=1.18.2:9.5.5.174 +wthit_version=forge-4.8.1 +patchouli_version=1.18.2-66 +terrablender_version=1.18.2-1.1.0.99 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 639632b50..60c76b340 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 77d843a63..e275cddb5 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -379,6 +379,7 @@ f995b98ddd6c2aa73e389a839352cab305b6391f data/forge/tags/items/ores.json 5008cd4f1f91800ff687533702cbd7591d4b27fc data/forge/tags/items/ores/cobalt.json 587fc72deca2e0aed8867449c0b88e0ab18f1e1c data/forge/tags/items/pickaxes.json abae19f6a9ecfe01b9c3b51f78460e6ac38eb66c data/forge/tags/items/stained_glass.json +3f9e7fb85fae3311cef7bfad370f42797c1d38e7 data/forge/tags/worldgen/biome/plains.json 60760042df8807aa72082c5e595668c4dc22d3e6 data/immersiveweapons/advancements/almost_flying.json 48919cf5515b1f85a4686d98169cf34fedbed4c3 data/immersiveweapons/advancements/bamboo.json 0c16958cb896e659855bd761486c87d875e77d0c data/immersiveweapons/advancements/bandage.json @@ -783,6 +784,8 @@ a6a67131213ed5eb7fef362bbff1eb8ca0520ec5 data/immersiveweapons/loot_tables/block 4009dfc6cbe9cb6dc6f6e5e30362fd53e69dd81e data/immersiveweapons/loot_tables/chests/abandoned_factory.json e897849a77167446ed73aaa42bddb30b74c6ea24 data/immersiveweapons/loot_tables/chests/battlefield_camp.json cd2649687f773f9045f700f3fd7279a814d5524b data/immersiveweapons/loot_tables/chests/campsite.json +7ddb0f0065e8f029b4484471cf342b90b375d3f3 data/immersiveweapons/loot_tables/chests/hans_hut.json +25e8d0076939766b60dbcada1fb4c103afb97588 data/immersiveweapons/loot_tables/chests/hans_hut_cask.json f3b6c546b254b8848e07375c340b4540f43c5241 data/immersiveweapons/loot_tables/chests/underground_bunker.json 3ac1b93a040e55e5702b2c8d379388d5742b9eab data/immersiveweapons/loot_tables/chests/village/battlefield/medic_station.json e3fd678e0ed59a25e044d6362d182e4ce909a133 data/immersiveweapons/loot_tables/entities/celestial_tower.json @@ -1054,6 +1057,19 @@ ce6a439f5218f0d986eae08079ab065c43849b4f data/immersiveweapons/tags/items/ingots 6d77011fb8a4045c9ddf3688c843176b546588be data/immersiveweapons/tags/items/shards/stone.json 6fb989e362e1eafadf5f7732112cf2fe1f2d8d8b data/immersiveweapons/tags/items/shards/ventus.json c623b6e951eb3860b531efd062af5eb2bb9a43d7 data/immersiveweapons/tags/items/shards/wood.json +bb4a9463fae39c80214255ebf1986f8693265327 data/immersiveweapons/tags/worldgen/biome/has_structure/abandoned_factory.json +c13e115e0d989d69f270247d661523241d3ffeb2 data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_camp.json +c13e115e0d989d69f270247d661523241d3ffeb2 data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_town.json +bb4a9463fae39c80214255ebf1986f8693265327 data/immersiveweapons/tags/worldgen/biome/has_structure/bear_trap.json +6f9010dc04d2773e6f842f5add27c58b0d264486 data/immersiveweapons/tags/worldgen/biome/has_structure/campsite.json +71042e21fd1d94d561cae1a37ebc786691b4f03a data/immersiveweapons/tags/worldgen/biome/has_structure/cloud_island.json +c13e115e0d989d69f270247d661523241d3ffeb2 data/immersiveweapons/tags/worldgen/biome/has_structure/destroyed_house.json +c13e115e0d989d69f270247d661523241d3ffeb2 data/immersiveweapons/tags/worldgen/biome/has_structure/graveyard.json +7a1ebecb0ab724b1dcadcf96c1a24ca1aaedec0c data/immersiveweapons/tags/worldgen/biome/has_structure/hans_hut.json +2d7bb792b86a5ab3c8d226bd3cbb7e515e7f515d data/immersiveweapons/tags/worldgen/biome/has_structure/landmine_trap.json +119d2b725236b726fd60e98739cae9a59c48e077 data/immersiveweapons/tags/worldgen/biome/has_structure/pitfall_trap.json +bb4a9463fae39c80214255ebf1986f8693265327 data/immersiveweapons/tags/worldgen/biome/has_structure/underground_bunker.json +727a5f00b9a44f2a27905600c764d5d49ac82f8a data/immersiveweapons/tags/worldgen/biome/has_structure/water_tower.json 23996d7fbe141750e73cfd3ab54f873eadf9cc7d data/minecraft/advancements/recipes/misc/gunpowder.json 5d88debdd7eeb96cf5d502b301e4490d599983dc data/minecraft/recipes/gunpowder.json 4a45573a35d3979a08a43e699a64fbda69d0332a data/minecraft/tags/blocks/fences.json diff --git a/src/generated/resources/data/forge/tags/worldgen/biome/plains.json b/src/generated/resources/data/forge/tags/worldgen/biome/plains.json new file mode 100644 index 000000000..8646b4750 --- /dev/null +++ b/src/generated/resources/data/forge/tags/worldgen/biome/plains.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "minecraft:plains", + "minecraft:snowy_plains", + "minecraft:sunflower_plains" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/loot_tables/chests/hans_hut.json b/src/generated/resources/data/immersiveweapons/loot_tables/chests/hans_hut.json new file mode 100644 index 000000000..ca6e4546b --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/loot_tables/chests/hans_hut.json @@ -0,0 +1,117 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "rolls": { + "type": "minecraft:uniform", + "min": 4.0, + "max": 6.0 + }, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "weight": 5, + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 1.0, + "max": 6.0 + }, + "add": false + } + ], + "name": "minecraft:salmon" + }, + { + "type": "minecraft:item", + "weight": 5, + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 1.0, + "max": 6.0 + }, + "add": false + } + ], + "name": "minecraft:cod" + }, + { + "type": "minecraft:item", + "weight": 4, + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 1.0, + "max": 3.0 + }, + "add": false + } + ], + "name": "immersiveweapons:bottle_of_alcohol" + }, + { + "type": "minecraft:item", + "weight": 4, + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 1.0, + "max": 3.0 + }, + "add": false + } + ], + "name": "immersiveweapons:bottle_of_wine" + }, + { + "type": "minecraft:item", + "weight": 3, + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 1.0, + "max": 1.0 + }, + "add": false + }, + { + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:iron_sword" + }, + { + "type": "minecraft:item", + "weight": 2, + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 1.0, + "max": 1.0 + }, + "add": false + }, + { + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:iron_helmet" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/loot_tables/chests/hans_hut_cask.json b/src/generated/resources/data/immersiveweapons/loot_tables/chests/hans_hut_cask.json new file mode 100644 index 000000000..542aa7873 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/loot_tables/chests/hans_hut_cask.json @@ -0,0 +1,46 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "rolls": { + "type": "minecraft:uniform", + "min": 6.0, + "max": 9.0 + }, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "weight": 2, + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 8.0, + "max": 32.0 + }, + "add": false + } + ], + "name": "minecraft:wheat" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 8.0, + "max": 16.0 + }, + "add": false + } + ], + "name": "minecraft:sweet_berries" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/abandoned_factory.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/abandoned_factory.json new file mode 100644 index 000000000..31f46618c --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/abandoned_factory.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#forge:plains", + "#minecraft:is_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_camp.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_camp.json new file mode 100644 index 000000000..e80ec5527 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_camp.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "immersiveweapons:battlefield" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_town.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_town.json new file mode 100644 index 000000000..e80ec5527 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/battlefield_town.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "immersiveweapons:battlefield" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/bear_trap.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/bear_trap.json new file mode 100644 index 000000000..31f46618c --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/bear_trap.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#forge:plains", + "#minecraft:is_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/campsite.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/campsite.json new file mode 100644 index 000000000..035d1c4b8 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/campsite.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#forge:plains", + "minecraft:desert" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/cloud_island.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/cloud_island.json new file mode 100644 index 000000000..b8196e1cf --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/cloud_island.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#minecraft:is_taiga" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/destroyed_house.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/destroyed_house.json new file mode 100644 index 000000000..e80ec5527 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/destroyed_house.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "immersiveweapons:battlefield" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/graveyard.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/graveyard.json new file mode 100644 index 000000000..e80ec5527 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/graveyard.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "immersiveweapons:battlefield" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/hans_hut.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/hans_hut.json new file mode 100644 index 000000000..030d43974 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/hans_hut.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:lush_caves", + "minecraft:dripstone_caves" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/landmine_trap.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/landmine_trap.json new file mode 100644 index 000000000..ff757c036 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/landmine_trap.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "minecraft:desert" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/pitfall_trap.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/pitfall_trap.json new file mode 100644 index 000000000..04acb3166 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/pitfall_trap.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#minecraft:is_jungle" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/underground_bunker.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/underground_bunker.json new file mode 100644 index 000000000..31f46618c --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/underground_bunker.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#forge:plains", + "#minecraft:is_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/water_tower.json b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/water_tower.json new file mode 100644 index 000000000..1042ddefe --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/tags/worldgen/biome/has_structure/water_tower.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#forge:plains" + ] +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/ImmersiveWeapons.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/ImmersiveWeapons.java index 6069a9ac3..abb18ad1e 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/ImmersiveWeapons.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/ImmersiveWeapons.java @@ -4,19 +4,23 @@ import com.anonymoushacker1279.immersiveweapons.config.ClientConfig; import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.*; +import com.anonymoushacker1279.immersiveweapons.item.crafting.CustomRecipeTypes; import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.OreGeneratorHandler; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; +import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes.IWOverworldBiomesProvider; +import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes.SurfaceRuleData; +import com.mojang.logging.LogUtils; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig.Type; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import org.slf4j.Logger; +import terrablender.api.*; +import terrablender.api.SurfaceRuleManager.RuleCategory; // The value here should match an entry in the META-INF/mods.toml file @Mod(ImmersiveWeapons.MOD_ID) @@ -25,7 +29,7 @@ public class ImmersiveWeapons { public static final String MOD_ID = "immersiveweapons"; // Setup logger - public static final Logger LOGGER = LogManager.getLogger(); + public static final Logger LOGGER = LogUtils.getLogger(); // Mod setup begins here public ImmersiveWeapons() { @@ -42,7 +46,6 @@ public ImmersiveWeapons() { // Add event listeners IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(this::setup); - MinecraftForge.EVENT_BUS.addListener(EventPriority.NORMAL, Structures::addDimensionalSpacing); // Register packet handlers PacketHandler.registerPackets(); @@ -57,10 +60,12 @@ public ImmersiveWeapons() { public void setup(FMLCommonSetupEvent event) { DispenserBehaviorRegistry.init(); OreGeneratorHandler.init(); + CustomRecipeTypes.init(); event.enqueueWork(() -> { WoodType.register(WoodTypes.BURNED_OAK); - Structures.setupStructures(); - Structures.registerConfiguredStructures(); + Regions.register(new IWOverworldBiomesProvider(new ResourceLocation(MOD_ID, "overworld_biome_provider"), + RegionType.OVERWORLD, 1)); + SurfaceRuleManager.addSurfaceRules(RuleCategory.OVERWORLD, MOD_ID, SurfaceRuleData.makeRules()); }); PostSetupHandler.init(); } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/AzulStainedOrchidBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/AzulStainedOrchidBlock.java index 410f79047..424bee504 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/AzulStainedOrchidBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/AzulStainedOrchidBlock.java @@ -1,10 +1,10 @@ package com.anonymoushacker1279.immersiveweapons.block.decoration; -import com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior.WarriorStatueTorso; +import com.anonymoushacker1279.immersiveweapons.block.misc.warrior_statue.WarriorStatueTorso; import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import com.anonymoushacker1279.immersiveweapons.world.TiltrosTeleporter; +import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes.BiomesAndDimensions; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; @@ -47,7 +47,9 @@ public void entityInside(@NotNull BlockState state, @NotNull Level level, @NotNu } Level entityWorld = entity.level; MinecraftServer server = entityWorld.getServer(); - ResourceKey destination = entityWorld.dimension() == GeneralUtilities.TILTROS ? Level.OVERWORLD : GeneralUtilities.TILTROS; + ResourceKey destination = entityWorld.dimension() == BiomesAndDimensions.TILTROS ? Level.OVERWORLD + : BiomesAndDimensions.TILTROS; + if (server != null) { ServerLevel destinationWorld = server.getLevel(destination); if (destinationWorld != null && !entity.isPassenger()) { @@ -56,36 +58,63 @@ public void entityInside(@NotNull BlockState state, @NotNull Level level, @NotNu entity.changeDimension(destinationWorld, new TiltrosTeleporter()); BlockPos oldEntityPos = entity.blockPosition(); entity.teleportTo(oldEntityPos.getX() - 0.5f, oldEntityPos.getY() + 0.5f, oldEntityPos.getZ() + 0.5f); + // Build a spawn area with another portal, if one doesn't already exist - Stream destinationBlockStates = destinationWorld.getBlockStates(new AABB(oldEntityPos.getX() - 10, oldEntityPos.getY() - 5, oldEntityPos.getZ() - 10, oldEntityPos.getX() + 10, oldEntityPos.getY() + 5, oldEntityPos.getZ() + 10)); - if (destinationBlockStates.noneMatch(blockState -> blockState == DeferredRegistryHandler.AZUL_STAINED_ORCHID.get().defaultBlockState())) { + Stream destinationBlockStates = destinationWorld.getBlockStates( + new AABB(oldEntityPos.getX() - 10, + oldEntityPos.getY() - 5, + oldEntityPos.getZ() - 10, + oldEntityPos.getX() + 10, + oldEntityPos.getY() + 5, + oldEntityPos.getZ() + 10)); + + if (destinationBlockStates.noneMatch(blockState -> + blockState == DeferredRegistryHandler.AZUL_STAINED_ORCHID.get().defaultBlockState())) { + destinationWorld.destroyBlock(oldEntityPos.above(), true); destinationWorld.destroyBlock(oldEntityPos.below(), true); - destinationWorld.setBlock(oldEntityPos.below(), Blocks.GRASS_BLOCK.defaultBlockState(), 3); + destinationWorld.setBlock(oldEntityPos.below(), + Blocks.GRASS_BLOCK.defaultBlockState(), 3); destinationWorld.destroyBlock(oldEntityPos, true); - destinationWorld.setBlock(oldEntityPos, DeferredRegistryHandler.AZUL_STAINED_ORCHID.get().defaultBlockState(), 3); + destinationWorld.setBlock(oldEntityPos, + DeferredRegistryHandler.AZUL_STAINED_ORCHID.get().defaultBlockState(), 3); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection()), true); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection()).above(), true); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection()).below(), true); - destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection()).below(), Blocks.STONE_BRICKS.defaultBlockState(), 3); + destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection()).below(), + Blocks.STONE_BRICKS.defaultBlockState(), 3); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getClockWise()), true); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getClockWise()).above(), true); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getClockWise()).below(), true); - destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection().getClockWise()).below(), Blocks.STONE_BRICKS.defaultBlockState(), 3); + destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection().getClockWise()).below(), + Blocks.STONE_BRICKS.defaultBlockState(), 3); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getCounterClockWise()), true); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getCounterClockWise()).above(), true); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getCounterClockWise()).below(), true); - destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection().getCounterClockWise()).below(), Blocks.STONE_BRICKS.defaultBlockState(), 3); + destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection().getCounterClockWise()).below(), + Blocks.STONE_BRICKS.defaultBlockState(), 3); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getOpposite()), true); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getOpposite()).above(), true); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection().getOpposite()).below(), true); - destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection().getOpposite()).below(), Blocks.STONE_BRICKS.defaultBlockState(), 3); + destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection().getOpposite()).below(), + Blocks.STONE_BRICKS.defaultBlockState(), 3); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection()), true); - destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection()), DeferredRegistryHandler.WARRIOR_STATUE_BASE.get().defaultBlockState().setValue(WarriorStatueTorso.FACING, entity.getDirection().getOpposite()), 3); + destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection()), + DeferredRegistryHandler.WARRIOR_STATUE_BASE.get().defaultBlockState() + .setValue(WarriorStatueTorso.FACING, + entity.getDirection().getOpposite()), 3); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection()).above(), true); - destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection()).above(), DeferredRegistryHandler.WARRIOR_STATUE_TORSO.get().defaultBlockState().setValue(WarriorStatueTorso.FACING, entity.getDirection().getOpposite()).setValue(WarriorStatueTorso.POWERED, true), 3); + destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection()).above(), + DeferredRegistryHandler.WARRIOR_STATUE_TORSO.get().defaultBlockState() + .setValue(WarriorStatueTorso.FACING, + entity.getDirection().getOpposite()) + .setValue(WarriorStatueTorso.POWERED, true), 3); destinationWorld.destroyBlock(oldEntityPos.relative(entity.getDirection()).above(2), true); - destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection()).above(2), DeferredRegistryHandler.WARRIOR_STATUE_HEAD.get().defaultBlockState().setValue(WarriorStatueTorso.FACING, entity.getDirection().getOpposite()).setValue(WarriorStatueTorso.POWERED, true), 3); + destinationWorld.setBlock(oldEntityPos.relative(entity.getDirection()).above(2), + DeferredRegistryHandler.WARRIOR_STATUE_HEAD.get().defaultBlockState() + .setValue(WarriorStatueTorso.FACING, + entity.getDirection().getOpposite()) + .setValue(WarriorStatueTorso.POWERED, true), 3); } entityWorld.getProfiler().pop(); } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/CelestialLanternBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/CelestialLanternBlock.java index 850b78998..b23f00be5 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/CelestialLanternBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/CelestialLanternBlock.java @@ -1,25 +1,67 @@ package com.anonymoushacker1279.immersiveweapons.block.decoration; +import com.anonymoushacker1279.immersiveweapons.blockentity.CelestialLanternBlockEntity; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.LanternBlock; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraft.world.phys.shapes.*; import org.jetbrains.annotations.NotNull; -public class CelestialLanternBlock extends LanternBlock { +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; - protected static final VoxelShape AABB = Shapes.or(Block.box(4.0D, 0.0D, 4.0D, 12.0D, 10.0D, 12.0D), Block.box(5.0D, 10.0D, 5.0D, 11.0D, 11.0D, 11.0D)); +public class CelestialLanternBlock extends LanternBlock implements EntityBlock { + + protected static final VoxelShape AABB = Shapes.or( + Block.box(4.0D, 0.0D, 4.0D, 12.0D, 10.0D, 12.0D), + Block.box(5.0D, 10.0D, 5.0D, 11.0D, 11.0D, 11.0D)); + + public static List ALL_TILTROS_LANTERNS = new ArrayList<>(3); public CelestialLanternBlock(Properties properties) { super(properties); } @Override - public @NotNull VoxelShape getShape(@NotNull BlockState blockState, @NotNull BlockGetter blockGetter, @NotNull BlockPos blockPos, @NotNull CollisionContext collisionContext) { + public @NotNull VoxelShape getShape(@NotNull BlockState blockState, @NotNull BlockGetter blockGetter, + @NotNull BlockPos blockPos, @NotNull CollisionContext collisionContext) { + return AABB; } + + @Override + public void setPlacedBy(@NotNull Level pLevel, @NotNull BlockPos pPos, @NotNull BlockState pState, + @Nullable LivingEntity pPlacer, @NotNull ItemStack pStack) { + + super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); + if (!pLevel.isClientSide) { + ALL_TILTROS_LANTERNS.add(pPos); + } + } + + @Override + public void destroy(@NotNull LevelAccessor pLevel, @NotNull BlockPos pPos, @NotNull BlockState pState) { + super.destroy(pLevel, pPos, pState); + + if (!pLevel.isClientSide()) { + ALL_TILTROS_LANTERNS.remove(pPos); + } + } + + /** + * Create a block entity for the block. + * + * @param blockPos the BlockPos the block is at + * @param blockState the BlockState of the block + * @return BlockEntity + */ + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockState blockState) { + return new CelestialLanternBlockEntity(blockPos, blockState); + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueBase.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueBase.java similarity index 97% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueBase.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueBase.java index 10614f138..53f969e27 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueBase.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueBase.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior; +package com.anonymoushacker1279.immersiveweapons.block.misc.warrior_statue; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueHead.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueHead.java similarity index 98% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueHead.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueHead.java index ea6390485..0425a5190 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueHead.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueHead.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior; +package com.anonymoushacker1279.immersiveweapons.block.misc.warrior_statue; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueTorso.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueTorso.java similarity index 84% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueTorso.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueTorso.java index b9586f32b..941d41c69 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueTorso.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/warrior_statue/WarriorStatueTorso.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior; +package com.anonymoushacker1279.immersiveweapons.block.misc.warrior_statue; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; @@ -46,7 +46,8 @@ public class WarriorStatueTorso extends HorizontalDirectionalBlock implements Si public WarriorStatueTorso(Properties properties) { super(properties); - registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(POWERED, false).setValue(WATERLOGGED, false)); + registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(POWERED, false) + .setValue(WATERLOGGED, false)); } /** @@ -70,7 +71,9 @@ protected void createBlockStateDefinition(StateDefinition.Builder SHAPE.move(0.0D, 0.0D, -0.1D); case EAST -> SHAPE.move(-0.1D, 0.0D, 0.0D); @@ -91,7 +94,16 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { BlockState blockStateBelow = context.getLevel().getBlockState(context.getClickedPos().below()); if (blockStateBelow.getBlock() instanceof WarriorStatueBase && blockStateBelow.getValue(FACING) == context.getHorizontalDirection().getOpposite()) { - context.getLevel().playLocalSound(context.getClickedPos().getX(), context.getClickedPos().getY(), context.getClickedPos().getZ(), SoundEvents.END_PORTAL_FRAME_FILL, SoundSource.BLOCKS, 0.5f, GeneralUtilities.getRandomNumber(0.3f, 0.4f), false); + + context.getLevel().playLocalSound(context.getClickedPos().getX(), + context.getClickedPos().getY(), + context.getClickedPos().getZ(), + SoundEvents.END_PORTAL_FRAME_FILL, + SoundSource.BLOCKS, + 0.5f, + GeneralUtilities.getRandomNumber(0.3f, 0.4f), + false); + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); } else { return Blocks.AIR.defaultBlockState(); @@ -153,7 +165,10 @@ public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull B */ @SuppressWarnings("deprecation") @Override - public @NotNull InteractionResult use(@NotNull BlockState state, Level worldIn, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand handIn, @NotNull BlockHitResult blockRayTraceResult) { + public @NotNull InteractionResult use(@NotNull BlockState state, Level worldIn, @NotNull BlockPos pos, + @NotNull Player player, @NotNull InteractionHand handIn, + @NotNull BlockHitResult blockRayTraceResult) { + if (!worldIn.isClientSide && handIn.equals(InteractionHand.MAIN_HAND)) { if (worldIn.getBlockState(pos.above()).getBlock() == DeferredRegistryHandler.WARRIOR_STATUE_HEAD.get()) { ItemStack itemStack = player.getMainHandItem(); @@ -162,20 +177,35 @@ public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull B itemStack.shrink(1); } worldIn.setBlock(pos, state.setValue(POWERED, true), 3); - worldIn.setBlock(pos.above(), DeferredRegistryHandler.WARRIOR_STATUE_HEAD.get().defaultBlockState().setValue(FACING, state.getValue(FACING)).setValue(POWERED, true), 3); + worldIn.setBlock(pos.above(), DeferredRegistryHandler.WARRIOR_STATUE_HEAD.get().defaultBlockState() + .setValue(FACING, state.getValue(FACING)).setValue(POWERED, true), 3); worldIn.destroyBlock(pos.below(2).relative(state.getValue(FACING)), true); - worldIn.setBlock(pos.below(2).relative(state.getValue(FACING)), Blocks.GRASS_BLOCK.defaultBlockState(), 3); + worldIn.setBlock(pos.below(2).relative(state.getValue(FACING)), + Blocks.GRASS_BLOCK.defaultBlockState(), 3); worldIn.destroyBlock(pos.below().relative(state.getValue(FACING)), true); - worldIn.setBlock(pos.below().relative(state.getValue(FACING)), DeferredRegistryHandler.AZUL_STAINED_ORCHID.get().defaultBlockState(), 3); + worldIn.setBlock(pos.below().relative(state.getValue(FACING)), + DeferredRegistryHandler.AZUL_STAINED_ORCHID.get().defaultBlockState(), 3); + + PacketHandler.INSTANCE.send(PacketDistributor.NEAR.with(() -> new TargetPoint(pos.getX(), + pos.getY(), pos.getZ(), 12, worldIn.dimension())), + new WarriorStatueTorsoPacketHandler(pos, 1)); - PacketHandler.INSTANCE.send(PacketDistributor.NEAR.with(() -> new TargetPoint(pos.getX(), pos.getY(), pos.getZ(), 12, worldIn.dimension())), new WarriorStatueTorsoPacketHandler(pos, 1)); for (int i = 0; i < 25; i++) { - ((ServerLevel) worldIn).sendParticles(ParticleTypes.DRIPPING_WATER, pos.getX() + 0.5d + GeneralUtilities.getRandomNumber(-1.0d, 1.0d), pos.getY() + GeneralUtilities.getRandomNumber(-2.0d, 1.5d), pos.getZ() + 0.5d + GeneralUtilities.getRandomNumber(-1.0d, 1.0d), 1, GeneralUtilities.getRandomNumber(-0.03d, 0.03d), GeneralUtilities.getRandomNumber(-0.1d, -0.08d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); + ((ServerLevel) worldIn).sendParticles(ParticleTypes.DRIPPING_WATER, + pos.getX() + 0.5d + GeneralUtilities.getRandomNumber(-1.0d, 1.0d), + pos.getY() + GeneralUtilities.getRandomNumber(-2.0d, 1.5d), + pos.getZ() + 0.5d + GeneralUtilities.getRandomNumber(-1.0d, 1.0d), + 1, GeneralUtilities.getRandomNumber(-0.03d, 0.03d), + GeneralUtilities.getRandomNumber(-0.1d, -0.08d), + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); + } return InteractionResult.CONSUME; } else { - PacketHandler.INSTANCE.send(PacketDistributor.NEAR.with(() -> new TargetPoint(pos.getX(), pos.getY(), pos.getZ(), 12, worldIn.dimension())), new WarriorStatueTorsoPacketHandler(pos, 2)); + PacketHandler.INSTANCE.send(PacketDistributor.NEAR.with(() -> new TargetPoint(pos.getX(), + pos.getY(), pos.getZ(), 12, worldIn.dimension())), + new WarriorStatueTorsoPacketHandler(pos, 2)); } } @@ -251,9 +281,11 @@ private static void handleOnClient(WarriorStatueTorsoPacketHandler msg) { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.level != null) { if (msg.soundType == 1) { - minecraft.level.playLocalSound(msg.blockPos, SoundEvents.END_PORTAL_FRAME_FILL, SoundSource.BLOCKS, 0.6f, 1.0f, false); + minecraft.level.playLocalSound(msg.blockPos, SoundEvents.END_PORTAL_FRAME_FILL, SoundSource.BLOCKS, + 0.6f, 1.0f, false); } else if (msg.soundType == 2) { - minecraft.level.playLocalSound(msg.blockPos, SoundEvents.ENDERMITE_AMBIENT, SoundSource.BLOCKS, 0.6f, GeneralUtilities.getRandomNumber(0.4f, 0.8f), false); + minecraft.level.playLocalSound(msg.blockPos, SoundEvents.ENDERMITE_AMBIENT, SoundSource.BLOCKS, + 0.6f, GeneralUtilities.getRandomNumber(0.4f, 0.8f), false); } } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/AbstractTeslaSynthesizerBlockEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/AbstractTeslaSynthesizerBlockEntity.java index 8dcbf91c8..c24179a87 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/AbstractTeslaSynthesizerBlockEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/AbstractTeslaSynthesizerBlockEntity.java @@ -1,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.blockentity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.item.crafting.ICustomRecipeType; +import com.anonymoushacker1279.immersiveweapons.item.crafting.CustomRecipeTypes; import com.anonymoushacker1279.immersiveweapons.item.crafting.TeslaSynthesizerRecipe; import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; @@ -95,7 +95,7 @@ public int getCount() { * @return boolean */ private static boolean isNonFlammable(Item item) { - return ItemTags.NON_FLAMMABLE_WOOD.contains(item); + return item.builtInRegistryHolder().is(ItemTags.NON_FLAMMABLE_WOOD); } /** @@ -160,7 +160,7 @@ public static void serverTick(Level level, AbstractTeslaSynthesizerBlockEntity b && !blockEntity.items.get(1).isEmpty() && !blockEntity.items.get(2).isEmpty()) { RecipeManager recipeManager = level.getRecipeManager(); - Recipe synthesizerRecipe = recipeManager.getRecipeFor(ICustomRecipeType.TESLA_SYNTHESIZER, blockEntity, level) + Recipe synthesizerRecipe = recipeManager.getRecipeFor(CustomRecipeTypes.TESLA_SYNTHESIZER, blockEntity, level) .orElse(null); if (!blockEntity.isBurning() && blockEntity.canSmelt(synthesizerRecipe)) { @@ -337,7 +337,7 @@ private void smelt(@Nullable Recipe recipe) { private int getCookTime() { if (level != null) { Optional recipe = level.getRecipeManager() - .getRecipeFor(ICustomRecipeType.TESLA_SYNTHESIZER, this, level); + .getRecipeFor(CustomRecipeTypes.TESLA_SYNTHESIZER, this, level); if (recipe.isPresent()) return recipe.get().getCookTime(); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/CelestialLanternBlockEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/CelestialLanternBlockEntity.java new file mode 100644 index 000000000..40a19cb04 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/CelestialLanternBlockEntity.java @@ -0,0 +1,72 @@ +package com.anonymoushacker1279.immersiveweapons.blockentity; + +import com.anonymoushacker1279.immersiveweapons.block.decoration.CelestialLanternBlock; +import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.*; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + +public class CelestialLanternBlockEntity extends BlockEntity implements EntityBlock { + + /** + * Constructor for CelestialLanternBlockEntity. + */ + public CelestialLanternBlockEntity(BlockPos blockPos, BlockState blockState) { + super(DeferredRegistryHandler.CELESTIAL_LANTERN_BLOCK_ENTITY.get(), blockPos, blockState); + } + + /** + * Create a block entity for the block. + * + * @param blockPos the BlockPos the block is at + * @param blockState the BlockState of the block + * @return BlockEntity + */ + @Nullable + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockState blockState) { + return new CelestialLanternBlockEntity(blockPos, blockState); + } + + /** + * Save NBT data. + * + * @param tag the CompoundNBT to save + */ + @Override + protected void saveAdditional(@NotNull CompoundTag tag) { + super.saveAdditional(tag); + + ListTag listTag = new ListTag(); + CelestialLanternBlock.ALL_TILTROS_LANTERNS + .forEach(pos -> listTag.add(NbtUtils.writeBlockPos(pos))); + + tag.put("tiltros_lanterns", listTag); + } + + /** + * Load NBT data. + * + * @param tag the CompoundTag to load + */ + @Override + public void load(@NotNull CompoundTag tag) { + super.load(tag); + ListTag SAVED_LANTERNS = (ListTag) tag.get("tiltros_lanterns"); + if (SAVED_LANTERNS != null) { + if (CelestialLanternBlock.ALL_TILTROS_LANTERNS.size() == 0 && SAVED_LANTERNS.size() > 0) { + List blockPosList = new ArrayList<>(SAVED_LANTERNS.size()); + SAVED_LANTERNS.forEach(tag1 -> blockPosList.add(NbtUtils.readBlockPos((CompoundTag) tag1))); + + CelestialLanternBlock.ALL_TILTROS_LANTERNS = blockPosList; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MedicStatueBlockEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MedicStatueBlockEntity.java index 055f58190..f7a196207 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MedicStatueBlockEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MedicStatueBlockEntity.java @@ -3,6 +3,7 @@ import com.anonymoushacker1279.immersiveweapons.entity.neutral.FieldMedicEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; +import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes.BiomesAndDimensions; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; @@ -34,19 +35,24 @@ public MedicStatueBlockEntity(BlockPos blockPos, BlockState blockState) { * Runs once each tick. Handle scanning and spawning entities. */ public static void serverTick(Level level, BlockPos blockPos, MedicStatueBlockEntity medicStatueBlockEntity) { - // TODO: Rework when Forge API updates - // if (Objects.equals(level.getBiome(blockPos).getRegistryName(), DeferredRegistryHandler.BATTLEFIELD.get().getRegistryName()) && medicStatueBlockEntity.cooldown == 0) { - if (medicStatueBlockEntity.cooldown == 0) { - List listOfMedicsInArea = level.getEntitiesOfClass(FieldMedicEntity.class, new AABB(medicStatueBlockEntity.getBlockPos().getX() - 48, medicStatueBlockEntity.getBlockPos().getY() - 16, medicStatueBlockEntity.getBlockPos().getZ() - 48, medicStatueBlockEntity.getBlockPos().getX() + 48, medicStatueBlockEntity.getBlockPos().getY() + 16, medicStatueBlockEntity.getBlockPos().getZ() + 48)); + if (level.getBiome(blockPos).is(BiomesAndDimensions.BATTLEFIELD) && medicStatueBlockEntity.cooldown == 0) { + List listOfMedicsInArea = level.getEntitiesOfClass(FieldMedicEntity.class, + new AABB(medicStatueBlockEntity.getBlockPos().getX() - 48, + medicStatueBlockEntity.getBlockPos().getY() - 16, + medicStatueBlockEntity.getBlockPos().getZ() - 48, + medicStatueBlockEntity.getBlockPos().getX() + 48, + medicStatueBlockEntity.getBlockPos().getY() + 16, + medicStatueBlockEntity.getBlockPos().getZ() + 48)); + medicStatueBlockEntity.scannedMedics = listOfMedicsInArea.size(); if (medicStatueBlockEntity.scannedMedics <= 1) { FieldMedicEntity fieldMedicEntity = DeferredRegistryHandler.FIELD_MEDIC_ENTITY.get().create(level); if (fieldMedicEntity != null) { while (true) { - BlockPos blockPos1 = medicStatueBlockEntity.getRandomPositionInArea(); - if (level.getBlockState(blockPos1) == Blocks.AIR.defaultBlockState()) { - fieldMedicEntity.moveTo(blockPos1, 0.0F, 0.0F); + BlockPos randomPositionInArea = medicStatueBlockEntity.getRandomPositionInArea(); + if (level.getBlockState(randomPositionInArea) == Blocks.AIR.defaultBlockState()) { + fieldMedicEntity.moveTo(randomPositionInArea, 0.0F, 0.0F); level.addFreshEntity(fieldMedicEntity); medicStatueBlockEntity.spawnParticles(); medicStatueBlockEntity.cooldown = 400; @@ -70,7 +76,7 @@ public static void serverTick(Level level, BlockPos blockPos, MedicStatueBlockEn @Nullable @Override public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockState blockState) { - return new MinutemanStatueBlockEntity(blockPos, blockState); + return new MedicStatueBlockEntity(blockPos, blockState); } /** @@ -79,7 +85,15 @@ public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockStat private void spawnParticles() { ServerLevel serverWorld = (ServerLevel) getLevel(); if (serverWorld != null) { - serverWorld.sendParticles(ParticleTypes.HAPPY_VILLAGER, getBlockPos().getX() + 0.5d, getBlockPos().getY(), getBlockPos().getZ() + 0.75d, 5, GeneralUtilities.getRandomNumber(-0.05d, 0.05d), GeneralUtilities.getRandomNumber(-0.25d, 0.25d), GeneralUtilities.getRandomNumber(-0.05d, 0.05d), GeneralUtilities.getRandomNumber(-0.15d, 0.15d)); + serverWorld.sendParticles(ParticleTypes.HAPPY_VILLAGER, + getBlockPos().getX() + 0.5d, + getBlockPos().getY(), + getBlockPos().getZ() + 0.75d, + 5, + GeneralUtilities.getRandomNumber(-0.05d, 0.05d), + GeneralUtilities.getRandomNumber(-0.25d, 0.25d), + GeneralUtilities.getRandomNumber(-0.05d, 0.05d), + GeneralUtilities.getRandomNumber(-0.15d, 0.15d)); } } @@ -89,7 +103,9 @@ private void spawnParticles() { * @return BlockPos */ private BlockPos getRandomPositionInArea() { - return new BlockPos(getBlockPos().getX() + GeneralUtilities.getRandomNumber(-15, 15), getBlockPos().getY(), getBlockPos().getZ() + GeneralUtilities.getRandomNumber(-15, 15)); + return new BlockPos(getBlockPos().getX() + GeneralUtilities.getRandomNumber(-8, 8), + getBlockPos().getY(), + getBlockPos().getZ() + GeneralUtilities.getRandomNumber(-8, 8)); } /** diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MinutemanStatueBlockEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MinutemanStatueBlockEntity.java index 3899a8cd7..e0983ed5e 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MinutemanStatueBlockEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MinutemanStatueBlockEntity.java @@ -3,6 +3,7 @@ import com.anonymoushacker1279.immersiveweapons.entity.neutral.MinutemanEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; +import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes.BiomesAndDimensions; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; @@ -34,19 +35,24 @@ public MinutemanStatueBlockEntity(BlockPos blockPos, BlockState blockState) { * Runs once each tick. Handle scanning and spawning entities. */ public static void serverTick(Level level, BlockPos blockPos, MinutemanStatueBlockEntity minutemanStatueBlockEntity) { - // TODO: Rework when Forge API updates - // if (Objects.equals(level.getBiome(blockPos).getRegistryName(), DeferredRegistryHandler.BATTLEFIELD.get().getRegistryName()) && minutemanStatueBlockEntity.cooldown == 0) { - if (minutemanStatueBlockEntity.cooldown == 0) { - List listOfMinutemenInArea = level.getEntitiesOfClass(MinutemanEntity.class, new AABB(minutemanStatueBlockEntity.getBlockPos().getX() - 48, minutemanStatueBlockEntity.getBlockPos().getY() - 16, minutemanStatueBlockEntity.getBlockPos().getZ() - 48, minutemanStatueBlockEntity.getBlockPos().getX() + 48, minutemanStatueBlockEntity.getBlockPos().getY() + 16, minutemanStatueBlockEntity.getBlockPos().getZ() + 48)); + if (level.getBiome(blockPos).is(BiomesAndDimensions.BATTLEFIELD) && minutemanStatueBlockEntity.cooldown == 0) { + List listOfMinutemenInArea = level.getEntitiesOfClass(MinutemanEntity.class, + new AABB(minutemanStatueBlockEntity.getBlockPos().getX() - 48, + minutemanStatueBlockEntity.getBlockPos().getY() - 16, + minutemanStatueBlockEntity.getBlockPos().getZ() - 48, + minutemanStatueBlockEntity.getBlockPos().getX() + 48, + minutemanStatueBlockEntity.getBlockPos().getY() + 16, + minutemanStatueBlockEntity.getBlockPos().getZ() + 48)); + minutemanStatueBlockEntity.scannedMinutemen = listOfMinutemenInArea.size(); if (minutemanStatueBlockEntity.scannedMinutemen <= 16) { MinutemanEntity minutemanEntity = DeferredRegistryHandler.MINUTEMAN_ENTITY.get().create(level); if (minutemanEntity != null) { while (true) { - BlockPos blockPos1 = minutemanStatueBlockEntity.getRandomPositionInArea(); - if (level.getBlockState(blockPos1) == Blocks.AIR.defaultBlockState()) { - minutemanEntity.moveTo(blockPos1, 0.0F, 0.0F); + BlockPos randomPositionInArea = minutemanStatueBlockEntity.getRandomPositionInArea(); + if (level.getBlockState(randomPositionInArea) == Blocks.AIR.defaultBlockState()) { + minutemanEntity.moveTo(randomPositionInArea, 0.0F, 0.0F); level.addFreshEntity(minutemanEntity); minutemanStatueBlockEntity.spawnParticles(); minutemanStatueBlockEntity.cooldown = 400; @@ -79,7 +85,15 @@ public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockStat private void spawnParticles() { ServerLevel serverWorld = (ServerLevel) getLevel(); if (serverWorld != null) { - serverWorld.sendParticles(ParticleTypes.HAPPY_VILLAGER, getBlockPos().getX() + 0.5d, getBlockPos().getY(), getBlockPos().getZ() + 0.75d, 5, GeneralUtilities.getRandomNumber(-0.05d, 0.05d), GeneralUtilities.getRandomNumber(-0.25d, 0.25d), GeneralUtilities.getRandomNumber(-0.05d, 0.05d), GeneralUtilities.getRandomNumber(-0.15d, 0.15d)); + serverWorld.sendParticles(ParticleTypes.HAPPY_VILLAGER, + getBlockPos().getX() + 0.5d, + getBlockPos().getY(), + getBlockPos().getZ() + 0.75d, + 5, + GeneralUtilities.getRandomNumber(-0.05d, 0.05d), + GeneralUtilities.getRandomNumber(-0.25d, 0.25d), + GeneralUtilities.getRandomNumber(-0.05d, 0.05d), + GeneralUtilities.getRandomNumber(-0.15d, 0.15d)); } } @@ -89,7 +103,9 @@ private void spawnParticles() { * @return BlockPos */ private BlockPos getRandomPositionInArea() { - return new BlockPos(getBlockPos().getX() + GeneralUtilities.getRandomNumber(-15, 15), getBlockPos().getY(), getBlockPos().getZ() + GeneralUtilities.getRandomNumber(-15, 15)); + return new BlockPos(getBlockPos().getX() + GeneralUtilities.getRandomNumber(-15, 15), + getBlockPos().getY(), + getBlockPos().getZ() + GeneralUtilities.getRandomNumber(-15, 15)); } /** diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/ImmersiveWeaponsJEIPlugin.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/ImmersiveWeaponsJEIPlugin.java index 8c3de1700..c608921e2 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/ImmersiveWeaponsJEIPlugin.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/ImmersiveWeaponsJEIPlugin.java @@ -8,9 +8,7 @@ import com.anonymoushacker1279.immersiveweapons.container.SmallPartsContainer; import com.anonymoushacker1279.immersiveweapons.container.TeslaSynthesizerContainer; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.item.crafting.ICustomRecipeType; -import com.anonymoushacker1279.immersiveweapons.item.crafting.SmallPartsRecipe; -import com.anonymoushacker1279.immersiveweapons.item.crafting.TeslaSynthesizerRecipe; +import com.anonymoushacker1279.immersiveweapons.item.crafting.*; import com.google.common.collect.ImmutableSet; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; @@ -58,8 +56,8 @@ public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { public void registerRecipes(IRecipeRegistration registration) { ClientLevel world = Objects.requireNonNull(Minecraft.getInstance().level); - Set smallPartsRecipes = ImmutableSet.copyOf(world.getRecipeManager().getAllRecipesFor(ICustomRecipeType.SMALL_PARTS)); - Set teslaSynthesizerRecipes = ImmutableSet.copyOf(world.getRecipeManager().getAllRecipesFor(ICustomRecipeType.TESLA_SYNTHESIZER)); + Set smallPartsRecipes = ImmutableSet.copyOf(world.getRecipeManager().getAllRecipesFor(CustomRecipeTypes.SMALL_PARTS)); + Set teslaSynthesizerRecipes = ImmutableSet.copyOf(world.getRecipeManager().getAllRecipesFor(CustomRecipeTypes.TESLA_SYNTHESIZER)); registration.addRecipes(smallPartsRecipes, SmallPartsRecipeCategory.UID); registration.addRecipes(teslaSynthesizerRecipes, TeslaSynthesizerRecipeCategory.UID); } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/model/LavaRevenantModel.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/model/LavaRevenantModel.java index b4b8da970..0f3f628f7 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/model/LavaRevenantModel.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/model/LavaRevenantModel.java @@ -1,6 +1,6 @@ package com.anonymoushacker1279.immersiveweapons.client.model; -import com.anonymoushacker1279.immersiveweapons.entity.monster.LavaRevenantEntity; +import com.anonymoushacker1279.immersiveweapons.entity.monster.lava_revenant.LavaRevenantEntity; import net.minecraft.client.model.HierarchicalModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.util.Mth; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/layers/LavaRevenantEyesLayer.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/layers/LavaRevenantEyesLayer.java index 4a2438854..af251104b 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/layers/LavaRevenantEyesLayer.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/layers/LavaRevenantEyesLayer.java @@ -2,7 +2,7 @@ import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.client.model.LavaRevenantModel; -import com.anonymoushacker1279.immersiveweapons.entity.monster.LavaRevenantEntity; +import com.anonymoushacker1279.immersiveweapons.entity.monster.lava_revenant.LavaRevenantEntity; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.EyesLayer; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/LavaRevenantRenderer.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/LavaRevenantRenderer.java index 9c553e915..eda528ae8 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/LavaRevenantRenderer.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/LavaRevenantRenderer.java @@ -3,7 +3,7 @@ import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.client.model.LavaRevenantModel; import com.anonymoushacker1279.immersiveweapons.client.renderer.entity.layers.LavaRevenantEyesLayer; -import com.anonymoushacker1279.immersiveweapons.entity.monster.LavaRevenantEntity; +import com.anonymoushacker1279.immersiveweapons.entity.monster.lava_revenant.LavaRevenantEntity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import net.minecraft.client.model.geom.ModelLayers; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/config/CommonConfig.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/config/CommonConfig.java index 36ec83bff..7b775f773 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/config/CommonConfig.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/config/CommonConfig.java @@ -2,59 +2,67 @@ import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.ForgeConfigSpec.Builder; +import net.minecraftforge.common.ForgeConfigSpec.DoubleValue; import org.apache.commons.lang3.tuple.Pair; -import java.util.*; - public class CommonConfig { public static final ForgeConfigSpec COMMON_SPEC; public static final CommonConfig COMMON; + // General settings public static ForgeConfigSpec.ConfigValue MAX_SMOKE_BOMB_PARTICLES; public static ForgeConfigSpec.ConfigValue BULLETS_BREAK_GLASS; - public static ForgeConfigSpec.ConfigValue DYING_SOLDIER_SPAWN; - public static ForgeConfigSpec.ConfigValue WANDERING_WARRIOR_SPAWN; - public static ForgeConfigSpec.ConfigValue HANS_SPAWN; - public static ForgeConfigSpec.ConfigValue LAVA_REVENANT_SPAWN; - public static ForgeConfigSpec.ConfigValue ROCK_SPIDER_SPAWN; - public static ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_SPAWN; public static ForgeConfigSpec.ConfigValue TILTROS_ENABLED; - public static ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_XZ_SPAWN_CHECK_RADIUS; - public static ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_Y_SPAWN_CHECK_RADIUS; - public static ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_MINIONS_WAVE_SIZE_MODIFIER; - public static ForgeConfigSpec.ConfigValue> MOLTEN_ORE_CONFIG; - public static ForgeConfigSpec.ConfigValue> NETHER_SULFUR_ORE_CONFIG; - public static ForgeConfigSpec.ConfigValue> SULFUR_ORE_CONFIG; - public static ForgeConfigSpec.ConfigValue> DEEPSLATE_SULFUR_ORE_CONFIG; - public static ForgeConfigSpec.ConfigValue> COBALT_ORE_CONFIG; - public static ForgeConfigSpec.ConfigValue> DEEPSLATE_COBALT_ORE_CONFIG; - public static ForgeConfigSpec.ConfigValue MAX_ABANDONED_FACTORY_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_ABANDONED_FACTORY_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_PITFALL_TRAP_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_PITFALL_TRAP_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_BEAR_TRAP_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_BEAR_TRAP_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_LANDMINE_TRAP_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_LANDMINE_TRAP_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_UNDERGROUND_BUNKER_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_UNDERGROUND_BUNKER_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_BATTLEFIELD_CAMP_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_BATTLEFIELD_CAMP_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_BATTLEFIELD_VILLAGE_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_BATTLEFIELD_VILLAGE_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_CLOUD_ISLAND_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_CLOUD_ISLAND_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_CAMPSITE_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_CAMPSITE_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_BATTLEFIELD_HOUSE_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_BATTLEFIELD_HOUSE_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_OUTHOUSE_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_OUTHOUSE_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_WATER_TOWER_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_WATER_TOWER_DISTANCE; - public static ForgeConfigSpec.ConfigValue MAX_GRAVEYARD_DISTANCE; - public static ForgeConfigSpec.ConfigValue MIN_GRAVEYARD_DISTANCE; + + // Celestial Tower entity specific + public static ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_SPAWN_CHECK_RADIUS; + public static ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_MINIONS_WAVE_SIZE_MODIFIER; + + // Ore configurations + + // Molten Ore + public static ForgeConfigSpec.ConfigValue ENABLE_MOLTEN_ORE; + public static ForgeConfigSpec.ConfigValue MOLTEN_ORE_WEIGHT; + public static ForgeConfigSpec.ConfigValue MOLTEN_ORE_TOP_ANCHOR; + public static ForgeConfigSpec.ConfigValue MOLTEN_ORE_BOTTOM_ANCHOR; + public static ForgeConfigSpec.ConfigValue MOLTEN_ORE_SIZE; + public static DoubleValue MOLTEN_ORE_EXPOSED_DISCARD_CHANCE; + // Nether Sulfur Ore + public static ForgeConfigSpec.ConfigValue ENABLE_NETHER_SULFUR_ORE; + public static ForgeConfigSpec.ConfigValue NETHER_SULFUR_ORE_WEIGHT; + public static ForgeConfigSpec.ConfigValue NETHER_SULFUR_ORE_TOP_ANCHOR; + public static ForgeConfigSpec.ConfigValue NETHER_SULFUR_ORE_BOTTOM_ANCHOR; + public static ForgeConfigSpec.ConfigValue NETHER_SULFUR_ORE_SIZE; + public static DoubleValue NETHER_SULFUR_ORE_EXPOSED_DISCARD_CHANCE; + // Sulfur Ore + public static ForgeConfigSpec.ConfigValue ENABLE_SULFUR_ORE; + public static ForgeConfigSpec.ConfigValue SULFUR_ORE_WEIGHT; + public static ForgeConfigSpec.ConfigValue SULFUR_ORE_TOP_ANCHOR; + public static ForgeConfigSpec.ConfigValue SULFUR_ORE_BOTTOM_ANCHOR; + public static ForgeConfigSpec.ConfigValue SULFUR_ORE_SIZE; + public static DoubleValue SULFUR_ORE_EXPOSED_DISCARD_CHANCE; + // Deepslate Sulfur Ore + public static ForgeConfigSpec.ConfigValue ENABLE_DEEPSLATE_SULFUR_ORE; + public static ForgeConfigSpec.ConfigValue DEEPSLATE_SULFUR_ORE_WEIGHT; + public static ForgeConfigSpec.ConfigValue DEEPSLATE_SULFUR_ORE_TOP_ANCHOR; + public static ForgeConfigSpec.ConfigValue DEEPSLATE_SULFUR_ORE_BOTTOM_ANCHOR; + public static ForgeConfigSpec.ConfigValue DEEPSLATE_SULFUR_ORE_SIZE; + public static DoubleValue DEEPSLATE_SULFUR_ORE_EXPOSED_DISCARD_CHANCE; + // Cobalt Ore + public static ForgeConfigSpec.ConfigValue ENABLE_COBALT_ORE; + public static ForgeConfigSpec.ConfigValue COBALT_ORE_WEIGHT; + public static ForgeConfigSpec.ConfigValue COBALT_ORE_TOP_ANCHOR; + public static ForgeConfigSpec.ConfigValue COBALT_ORE_BOTTOM_ANCHOR; + public static ForgeConfigSpec.ConfigValue COBALT_ORE_SIZE; + public static DoubleValue COBALT_ORE_EXPOSED_DISCARD_CHANCE; + // Deepslate Cobalt Ore + public static ForgeConfigSpec.ConfigValue ENABLE_DEEPSLATE_COBALT_ORE; + public static ForgeConfigSpec.ConfigValue DEEPSLATE_COBALT_ORE_WEIGHT; + public static ForgeConfigSpec.ConfigValue DEEPSLATE_COBALT_ORE_TOP_ANCHOR; + public static ForgeConfigSpec.ConfigValue DEEPSLATE_COBALT_ORE_BOTTOM_ANCHOR; + public static ForgeConfigSpec.ConfigValue DEEPSLATE_COBALT_ORE_SIZE; + public static DoubleValue DEEPSLATE_COBALT_ORE_EXPOSED_DISCARD_CHANCE; CommonConfig(ForgeConfigSpec.Builder builder) { builder.push("Server Configuration"); @@ -64,248 +72,94 @@ public class CommonConfig { .comment("Set the maximum number of particles produced by the smoke bomb - Default 96\n" + "Setting this higher can make clients laggy, setting to 0 effectively disables it") .translation("config.immersiveweapons.max_smoke_bomb_particles") - .define("max_smoke_bomb_particles", 96); + .define("Max smoke bomb particles", 96); BULLETS_BREAK_GLASS = builder .comment("Enable bullets breaking glass - Default true") .translation("config.immersiveweapons.bullets_break_glass") - .define("bullets_break_glass", true); + .define("Bullets can break glass", true); TILTROS_ENABLED = builder .comment("Enable the Tiltros dimension portal - Default true") .translation("config.immersiveweapons.tiltros_enabled") - .define("tiltros_enabled", true); - builder.pop(); - - builder.push("Entity Spawns"); - DYING_SOLDIER_SPAWN = builder - .comment("Enable the natural spawning of Dying Soldiers - Default true") - .translation("config.immersiveweapons.dying_soldier_spawn") - .define("dying_soldiers_spawn", true); - WANDERING_WARRIOR_SPAWN = builder - .comment("Enable the natural spawning of Wandering Warriors - Default true") - .translation("config.immersiveweapons.wandering_warrior_spawn") - .define("wandering_warriors_spawn", true); - HANS_SPAWN = builder - .comment("Enable the natural spawning of Hans the Almighty - Default true") - .translation("config.immersiveweapons.hans_spawn") - .define("hans_spawn", true); - LAVA_REVENANT_SPAWN = builder - .comment("Enable the natural spawning of Lava Revenants - Default true") - .translation("config.immersiveweapons.lava_revenant_spawn") - .define("lava_revenant_spawn", true); - ROCK_SPIDER_SPAWN = builder - .comment("Enable the natural spawning of Rock Spiders - Default true") - .translation("config.immersiveweapons.rock_spider_spawn") - .define("rock_spider_spawn", true); - CELESTIAL_TOWER_SPAWN = builder - .comment("Enable the natural spawning of Celestial Towers - Default true") - .translation("config.immersiveweapons.celestial_tower_spawn") - .define("celestial_tower_spawn", true); + .define("Tiltros dimension is accessible via the portal", true); builder.pop(); builder.push("Celestial Tower"); - CELESTIAL_TOWER_XZ_SPAWN_CHECK_RADIUS = builder - .comment("Set the X and Z spawn checking radius for the Celestial Tower.\n" + - "Setting this higher will negatively impact server ticks in Tiltros, but make Celestial Lanterns more effective - Default 56") - .translation("config.immersiveweapons.celestial_tower_xz_spawn_check_radius") - .define("celestial_tower_xz_spawn_check_radius", 56); - CELESTIAL_TOWER_Y_SPAWN_CHECK_RADIUS = builder - .comment("Set the Y spawn checking radius for the Celestial Tower.\n" + - "Setting this higher will negatively impact server ticks in Tiltros, but make Celestial Lanterns more effective - Default 20") - .translation("config.immersiveweapons.celestial_tower_y_spawn_check_radius") - .define("celestial_tower_y_spawn_check_radius", 20); + CELESTIAL_TOWER_SPAWN_CHECK_RADIUS = builder + .comment("Set the spawn checking radius for the Celestial Tower.\n" + + "Setting this higher may slightly negatively impact server ticks in Tiltros, but make Celestial Lanterns more effective - Default 128") + .translation("config.immersiveweapons.celestial_tower_spawn_check_radius") + .define("Celestial Tower spawn checking radius", 128); CELESTIAL_TOWER_MINIONS_WAVE_SIZE_MODIFIER = builder .comment(""" Multiplier to change the wave size from Celestial Tower summons. Set less than 1 to reduce, greater than 1 to increase. Increasing the wave size will negatively affect the server ticks in Tiltros. - Default 1.0""") .translation("config.immersiveweapons.celestial_tower_minions_wave_size_modifier") - .define("celestial_tower_minions_wave_size_modifier", "1.0"); - builder.pop(); - - builder.push("Structure Generation"); - - builder.push("Abandoned Factory"); - MAX_ABANDONED_FACTORY_DISTANCE = builder - .comment("Maximum distance in chunks between Abandoned Factories - Default 120") - .translation("config.immersiveweapons.max_abandoned_factory_distance") - .define("max_abandoned_factory_distance", 120); - MIN_ABANDONED_FACTORY_DISTANCE = builder - .comment("Minimum distance in chunks between Abandoned Factories - Default 90") - .translation("config.immersiveweapons.min_abandoned_factory_distance") - .define("min_abandoned_factory_distance", 90); - builder.pop(); - - builder.push("Pitfall Trap"); - MAX_PITFALL_TRAP_DISTANCE = builder - .comment("Maximum distance in chunks between Pitfall Traps - Default 8") - .translation("config.immersiveweapons.max_pitfall_trap_distance") - .define("max_pitfall_trap_distance", 8); - MIN_PITFALL_TRAP_DISTANCE = builder - .comment("Minimum distance in chunks between Pitfall Traps - Default 2") - .translation("config.immersiveweapons.min_pitfall_trap_distance") - .define("min_pitfall_trap_distance", 2); - builder.pop(); - - builder.push("Bear Trap"); - MAX_BEAR_TRAP_DISTANCE = builder - .comment("Maximum distance in chunks between Bear Traps - Default 10") - .translation("config.immersiveweapons.max_bear_trap_distance") - .define("max_bear_trap_distance", 10); - MIN_BEAR_TRAP_DISTANCE = builder - .comment("Minimum distance in chunks between Bear Traps - Default 4") - .translation("config.immersiveweapons.min_bear_trap_distance") - .define("min_bear_trap_distance", 4); - builder.pop(); - - builder.push("Landmine Trap"); - MAX_LANDMINE_TRAP_DISTANCE = builder - .comment("Minimum distance in chunks between Landmine Traps - Default 12") - .translation("config.immersiveweapons.max_landmine_trap_distance") - .define("max_landmine_trap_distance", 12); - MIN_LANDMINE_TRAP_DISTANCE = builder - .comment("Minimum distance in chunks between Landmine Traps - Default 6") - .translation("config.immersiveweapons.min_landmine_trap_distance") - .define("min_landmine_trap_distance", 6); - builder.pop(); - - builder.push("Underground Bunker"); - MAX_UNDERGROUND_BUNKER_DISTANCE = builder - .comment("Maximum distance in chunks between Underground Bunkers - Default 110") - .translation("config.immersiveweapons.max_underground_bunker_distance") - .define("max_underground_bunker_distance", 110); - MIN_UNDERGROUND_BUNKER_DISTANCE = builder - .comment("Minimum distance in chunks between Underground Bunkers - Default 80") - .translation("config.immersiveweapons.min_underground_bunker_distance") - .define("min_underground_bunker_distance", 80); - builder.pop(); - - builder.push("Battlefield Camp"); - MAX_BATTLEFIELD_CAMP_DISTANCE = builder - .comment("Maximum distance in chunks between Battlefield Camps - Default 16") - .translation("config.immersiveweapons.max_battlefield_camp_distance") - .define("max_battlefield_camp_distance", 16); - MIN_BATTLEFIELD_CAMP_DISTANCE = builder - .comment("Minimum distance in chunks between Battlefield Camps - Default 4") - .translation("config.immersiveweapons.min_battlefield_camp_distance") - .define("min_battlefield_camp_distance", 4); - builder.pop(); - - builder.push("Battlefield Village"); - MAX_BATTLEFIELD_VILLAGE_DISTANCE = builder - .comment("Maximum distance in chunks between Battlefield Villages - Default 30") - .translation("config.immersiveweapons.max_battlefield_village_distance") - .define("max_battlefield_village_distance", 30); - MIN_BATTLEFIELD_VILLAGE_DISTANCE = builder - .comment("Minimum distance in chunks between Battlefield Villages - Default 10") - .translation("config.immersiveweapons.min_battlefield_village_distance") - .define("min_battlefield_village_distance", 10); - builder.pop(); - - builder.push("Cloud Island"); - MAX_CLOUD_ISLAND_DISTANCE = builder - .comment("Maximum distance in chunks between Cloud Islands - Default 90") - .translation("config.immersiveweapons.max_cloud_island_distance") - .define("max_cloud_island_distance", 90); - MIN_CLOUD_ISLAND_DISTANCE = builder - .comment("Minimum distance in chunks between Cloud Islands - Default 70") - .translation("config.immersiveweapons.min_cloud_island_distance") - .define("min_cloud_island_distance", 70); - builder.pop(); - - builder.push("Campsite"); - MAX_CAMPSITE_DISTANCE = builder - .comment("Maximum distance in chunks between Campsites - Default 50") - .translation("config.immersiveweapons.max_campsite_distance") - .define("max_campsite_distance", 50); - MIN_CAMPSITE_DISTANCE = builder - .comment("Minimum distance in chunks between Campsites - Default 30") - .translation("config.immersiveweapons.min_campsite_distance") - .define("min_campsite_distance", 30); - builder.pop(); - - builder.push("Battlefield House"); - MAX_BATTLEFIELD_HOUSE_DISTANCE = builder - .comment("Maximum distance in chunks between Battlefield Houses - Default 12") - .translation("config.immersiveweapons.max_battlefield_house_distance") - .define("max_battlefield_house_distance", 12); - MIN_BATTLEFIELD_HOUSE_DISTANCE = builder - .comment("Minimum distance in chunks between Battlefield Houses - Default 4") - .translation("config.immersiveweapons.min_battlefield_house_distance") - .define("min_battlefield_house_distance", 4); - builder.pop(); - - builder.push("Outhouse"); - MAX_OUTHOUSE_DISTANCE = builder - .comment("Maximum distance in chunks between Outhouses - Default 40") - .translation("config.immersiveweapons.max_outhouse_distance") - .define("max_outhouse_distance", 40); - MIN_OUTHOUSE_DISTANCE = builder - .comment("Minimum distance in chunks between Outhouses - Default 20") - .translation("config.immersiveweapons.min_outhouse_distance") - .define("min_outhouse_distance", 20); - builder.pop(); - - builder.push("Water Tower"); - MAX_WATER_TOWER_DISTANCE = builder - .comment("Maximum distance in chunks between Water Towers - Default 30") - .translation("config.immersiveweapons.max_water_tower_distance") - .define("max_water_tower_distance", 30); - MIN_WATER_TOWER_DISTANCE = builder - .comment("Minimum distance in chunks between Water Towers - Default 12") - .translation("config.immersiveweapons.min_water_tower_distance") - .define("min_water_tower_distance", 12); - builder.pop(); - - builder.push("Graveyard"); - MAX_GRAVEYARD_DISTANCE = builder - .comment("Maximum distance in chunks between Graveyards - Default 50") - .translation("config.immersiveweapons.max_graveyard_distance") - .define("max_graveyard_distance", 50); - MIN_GRAVEYARD_DISTANCE = builder - .comment("Minimum distance in chunks between Graveyards - Default 30") - .translation("config.immersiveweapons.min_graveyard_distance") - .define("min_graveyard_distance", 30); - builder.pop(); - + .define("Celestial Tower wave size modifier", 1.0D); builder.pop(); builder.push("Ore Generation"); - List molten_ore_config_list = new ArrayList<>(3); - molten_ore_config_list.addAll(Arrays.asList(4, 8, 64)); - MOLTEN_ORE_CONFIG = builder - .comment("Configuration for Molten Ore. Specified as a list. [ore_per_vein, veins_per_chunk, max_y]. Default: [4, 8, 64]") - .translation("config.immersiveweapons.molten_ore_config") - .define("molten_ore_config", molten_ore_config_list); - List nether_sulfur_ore_config_list = new ArrayList<>(2); - nether_sulfur_ore_config_list.addAll(Arrays.asList(12, 16)); - NETHER_SULFUR_ORE_CONFIG = builder - .comment("Configuration for Nether Sulfur Ore. Specified as a list. [ore_per_vein, veins_per_chunk]. Default: [12, 16]") - .translation("config.immersiveweapons.nether_sulfur_ore_config") - .define("nether_sulfur_ore_config", nether_sulfur_ore_config_list); - List sulfur_ore_config_list = new ArrayList<>(2); - sulfur_ore_config_list.addAll(Arrays.asList(8, 14)); - SULFUR_ORE_CONFIG = builder - .comment("Configuration for Sulfur Ore. Specified as a list. [ore_per_vein, veins_per_chunk]. Default: [8, 14]") - .translation("config.immersiveweapons.sulfur_ore_config") - .define("sulfur_ore_config", sulfur_ore_config_list); - List cobalt_ore_config_list = new ArrayList<>(3); - cobalt_ore_config_list.addAll(Arrays.asList(6, 12, 24)); - COBALT_ORE_CONFIG = builder - .comment("Configuration for Cobalt Ore. Specified as a list. [ore_per_vein, veins_per_chunk, blocks_below_top]. Default: [6, 12, 24]") - .translation("config.immersiveweapons.cobalt_ore_config") - .define("cobalt_ore_config", cobalt_ore_config_list); - List deepslate_sulfur_ore_config_list = new ArrayList<>(2); - deepslate_sulfur_ore_config_list.addAll(Arrays.asList(8, 14)); - DEEPSLATE_SULFUR_ORE_CONFIG = builder - .comment("Configuration for Deepslate Sulfur Ore. Specified as a list. [ore_per_vein, veins_per_chunk]. Default: [8, 14]") - .translation("config.immersiveweapons.deepslate_sulfur_ore_config") - .define("deepslate_sulfur_ore_config", deepslate_sulfur_ore_config_list); - List deepslate_cobalt_ore_config_list = new ArrayList<>(2); - deepslate_cobalt_ore_config_list.addAll(Arrays.asList(8, 16)); - DEEPSLATE_COBALT_ORE_CONFIG = builder - .comment("Configuration for Deepslate Cobalt Ore. Specified as a list. [ore_per_vein, veins_per_chunk]. Default: [8, 16]") - .translation("config.immersiveweapons.deepslate_cobalt_ore_config") - .define("deepslate_cobalt_ore_config", deepslate_cobalt_ore_config_list); + builder.comment("Note: A configuration will not exist for every ore. Ores found in structures (like Electric Ore) will not have configurations." + + "\nInstead, modify the structure separation settings."); + + builder.push("Molten Ore"); + ENABLE_MOLTEN_ORE = builder.comment("Enable generation of Molten Ore") + .define("Enable Molten Ore Generation", true); + MOLTEN_ORE_WEIGHT = builder.defineInRange("Molten Ore weight", 6, 1, Integer.MAX_VALUE); + MOLTEN_ORE_TOP_ANCHOR = builder.defineInRange("Molten Ore top anchor", 64, -64, 320); + MOLTEN_ORE_BOTTOM_ANCHOR = builder.defineInRange("Molten Ore bottom anchor", -64, -64, 320); + MOLTEN_ORE_SIZE = builder.defineInRange("Molten Ore size", 2, 0, Integer.MAX_VALUE); + MOLTEN_ORE_EXPOSED_DISCARD_CHANCE = builder.defineInRange("Molten Ore exposed to air discard chance", 0.85D, 0D, 1D); + builder.pop(); + + builder.push("Nether Sulfur Ore"); + ENABLE_NETHER_SULFUR_ORE = builder.comment("Enable generation of Nether Sulfur Ore") + .define("Enable Nether Sulfur Ore generation", true); + NETHER_SULFUR_ORE_WEIGHT = builder.defineInRange("Nether Sulfur Ore weight", 16, 1, Integer.MAX_VALUE); + NETHER_SULFUR_ORE_TOP_ANCHOR = builder.defineInRange("Nether Sulfur Ore top anchor", 128, -64, 320); + NETHER_SULFUR_ORE_BOTTOM_ANCHOR = builder.defineInRange("Nether Sulfur Ore bottom anchor", -16, -64, 320); + NETHER_SULFUR_ORE_SIZE = builder.defineInRange("Nether Sulfur Ore size", 12, 0, Integer.MAX_VALUE); + NETHER_SULFUR_ORE_EXPOSED_DISCARD_CHANCE = builder.defineInRange("Nether Sulfur Ore exposed to air discard chance", 0.08D, 0D, 1D); + builder.pop(); + + builder.push("Sulfur Ore"); + ENABLE_SULFUR_ORE = builder.comment("Enable generation of Sulfur Ore") + .define("Enable Sulfur Ore generation", true); + SULFUR_ORE_WEIGHT = builder.defineInRange("Sulfur Ore weight", 6, 1, Integer.MAX_VALUE); + SULFUR_ORE_TOP_ANCHOR = builder.defineInRange("Sulfur Ore top anchor", 196, -64, 320); + SULFUR_ORE_BOTTOM_ANCHOR = builder.defineInRange("Sulfur Ore bottom anchor", 32, -64, 320); + SULFUR_ORE_SIZE = builder.defineInRange("Sulfur Ore size", 4, 0, Integer.MAX_VALUE); + SULFUR_ORE_EXPOSED_DISCARD_CHANCE = builder.defineInRange("Sulfur Ore exposed to air discard chance", 0.1D, 0D, 1D); + builder.pop(); + + builder.push("Deepslate Sulfur Ore"); + ENABLE_DEEPSLATE_SULFUR_ORE = builder.comment("Enable generation of Deepslate Sulfur Ore") + .define("Enable Deepslate Sulfur Ore generation", true); + DEEPSLATE_SULFUR_ORE_WEIGHT = builder.defineInRange("Deepslate Sulfur Ore weight", 16, 1, Integer.MAX_VALUE); + DEEPSLATE_SULFUR_ORE_TOP_ANCHOR = builder.defineInRange("Deepslate Sulfur Ore top anchor", 0, -64, 320); + DEEPSLATE_SULFUR_ORE_BOTTOM_ANCHOR = builder.defineInRange("Deepslate Sulfur Ore bottom anchor", -64, -64, 320); + DEEPSLATE_SULFUR_ORE_SIZE = builder.defineInRange("Deepslate Sulfur Ore size", 4, 0, Integer.MAX_VALUE); + DEEPSLATE_SULFUR_ORE_EXPOSED_DISCARD_CHANCE = builder.defineInRange("Deepslate Sulfur Ore exposed to air discard chance", 0.04D, 0D, 1D); + builder.pop(); + + builder.push("Cobalt Ore"); + ENABLE_COBALT_ORE = builder.comment("Enable generation of Cobalt Ore") + .define("Enable Cobalt Ore generation", true); + COBALT_ORE_WEIGHT = builder.defineInRange("Cobalt Ore weight", 12, 1, Integer.MAX_VALUE); + COBALT_ORE_TOP_ANCHOR = builder.defineInRange("Cobalt Ore top anchor", 196, -64, 320); + COBALT_ORE_BOTTOM_ANCHOR = builder.defineInRange("Cobalt Ore bottom anchor", 7, -64, 320); + COBALT_ORE_SIZE = builder.defineInRange("Cobalt Ore size", 6, 0, Integer.MAX_VALUE); + COBALT_ORE_EXPOSED_DISCARD_CHANCE = builder.defineInRange("Cobalt Ore exposed to air discard chance", 0.15D, 0D, 1D); + builder.pop(); + + builder.push("Deepslate Cobalt Ore"); + ENABLE_DEEPSLATE_COBALT_ORE = builder.comment("Enable generation of Deepslate Cobalt Ore") + .define("Enable Deepslate Cobalt Ore generation", true); + DEEPSLATE_COBALT_ORE_WEIGHT = builder.defineInRange("Deepslate Cobalt Ore weight", 12, 1, Integer.MAX_VALUE); + DEEPSLATE_COBALT_ORE_TOP_ANCHOR = builder.defineInRange("Deepslate Cobalt Ore top anchor", 0, -64, 320); + DEEPSLATE_COBALT_ORE_BOTTOM_ANCHOR = builder.defineInRange("Deepslate Cobalt Ore bottom anchor", -64, -64, 320); + DEEPSLATE_COBALT_ORE_SIZE = builder.defineInRange("Deepslate Cobalt Ore size", 12, 0, Integer.MAX_VALUE); + DEEPSLATE_COBALT_ORE_EXPOSED_DISCARD_CHANCE = builder.defineInRange("Deepslate Cobalt Ore exposed to air discard chance", 0.1D, 0D, 1D); builder.pop(); builder.pop(); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/container/SmallPartsContainer.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/container/SmallPartsContainer.java index 7fbff8809..4b827bfb9 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/container/SmallPartsContainer.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/container/SmallPartsContainer.java @@ -1,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.container; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.item.crafting.ICustomRecipeType; +import com.anonymoushacker1279.immersiveweapons.item.crafting.CustomRecipeTypes; import com.anonymoushacker1279.immersiveweapons.item.crafting.SmallPartsRecipe; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.player.Inventory; @@ -40,7 +40,7 @@ public SmallPartsContainer(int id, Inventory inv) { public SmallPartsContainer(int id, Inventory inv, ContainerLevelAccess access) { super(DeferredRegistryHandler.SMALL_PARTS_TABLE_CONTAINER.get(), id, inv, access); world = inv.player.level; - smallPartsRecipeList = world.getRecipeManager().getAllRecipesFor(ICustomRecipeType.SMALL_PARTS); + smallPartsRecipeList = world.getRecipeManager().getAllRecipesFor(CustomRecipeTypes.SMALL_PARTS); } /** @@ -91,7 +91,7 @@ protected void onTake(@NotNull Player player, ItemStack itemStack) { @Override public void createResult() { List recipes = world.getRecipeManager() - .getRecipesFor(ICustomRecipeType.SMALL_PARTS, inputSlots, world); + .getRecipesFor(CustomRecipeTypes.SMALL_PARTS, inputSlots, world); if (recipes.isEmpty()) { resultSlots.setItem(0, ItemStack.EMPTY); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/CustomDataGenerator.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/CustomDataGenerator.java index a54e32fa7..7f55bc0c6 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/CustomDataGenerator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/CustomDataGenerator.java @@ -4,8 +4,7 @@ import com.anonymoushacker1279.immersiveweapons.data.loot.LootTableGenerator; import com.anonymoushacker1279.immersiveweapons.data.models.ModelProvider; import com.anonymoushacker1279.immersiveweapons.data.recipes.RecipeGenerator; -import com.anonymoushacker1279.immersiveweapons.data.tags.BlockTagsGenerator; -import com.anonymoushacker1279.immersiveweapons.data.tags.ItemTagsGenerator; +import com.anonymoushacker1279.immersiveweapons.data.tags.*; import net.minecraft.data.DataGenerator; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -35,6 +34,7 @@ public static void gatherData(GatherDataEvent event) { BlockTagsGenerator blockTagsGenerator = new BlockTagsGenerator(generator, event.getExistingFileHelper()); generator.addProvider(blockTagsGenerator); generator.addProvider(new ItemTagsGenerator(generator, blockTagsGenerator, event.getExistingFileHelper())); + generator.addProvider(new BiomeTagsGenerator(generator, event.getExistingFileHelper())); } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/BlockLootTables.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/BlockLootTables.java index dbad33701..f2ef7a258 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/BlockLootTables.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/BlockLootTables.java @@ -1,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.data.loot; import com.anonymoushacker1279.immersiveweapons.block.base.SandbagBlock; -import com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior.WarriorStatueTorso; +import com.anonymoushacker1279.immersiveweapons.block.misc.warrior_statue.WarriorStatueTorso; import com.anonymoushacker1279.immersiveweapons.block.trap.LandmineBlock; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.google.common.collect.Maps; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/ChestLootTables.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/ChestLootTables.java index e0472a619..5a09959eb 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/ChestLootTables.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/ChestLootTables.java @@ -35,6 +35,7 @@ public void accept(BiConsumer resourceLocationBuilder .add(LootItem.lootTableItem(DeferredRegistryHandler.OBSIDIAN_SHARD.get()).setWeight(4)) .add(LootItem.lootTableItem(DeferredRegistryHandler.ELECTRIC_INGOT.get()).setWeight(3)) .add(LootItem.lootTableItem(DeferredRegistryHandler.TESLA_INGOT.get()).setWeight(1)))); + resourceLocationBuilderBiConsumer.accept(LootTableLocations.BATTLEFIELD_CAMP, LootTable.lootTable() .withPool(LootPool.lootPool() @@ -53,6 +54,7 @@ public void accept(BiConsumer resourceLocationBuilder .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 3.0f)))) .add(LootItem.lootTableItem(Items.EMERALD).setWeight(3)) .add(LootItem.lootTableItem(DeferredRegistryHandler.FLINTLOCK_PISTOL.get()).setWeight(1)))); + resourceLocationBuilderBiConsumer.accept(LootTableLocations.CAMPSITE, LootTable.lootTable() .withPool(LootPool.lootPool() @@ -72,6 +74,7 @@ public void accept(BiConsumer resourceLocationBuilder .add(LootItem.lootTableItem(DeferredRegistryHandler.FLARE.get()).setWeight(3) .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 4.0f)))) .add(LootItem.lootTableItem(DeferredRegistryHandler.FLARE_GUN.get()).setWeight(1)))); + resourceLocationBuilderBiConsumer.accept(LootTableLocations.UNDERGROUND_BUNKER, LootTable.lootTable() .withPool(LootPool.lootPool() @@ -90,6 +93,7 @@ public void accept(BiConsumer resourceLocationBuilder .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 3.0f)))) .add(LootItem.lootTableItem(DeferredRegistryHandler.FLINTLOCK_PISTOL.get()).setWeight(2)) .add(LootItem.lootTableItem(DeferredRegistryHandler.BLUNDERBUSS.get()).setWeight(1)))); + resourceLocationBuilderBiConsumer.accept(LootTableLocations.BATTLEFIELD_VILLAGE_MEDIC_STATION, LootTable.lootTable() .withPool(LootPool.lootPool() @@ -102,11 +106,42 @@ public void accept(BiConsumer resourceLocationBuilder .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 3.0F)))) .add(LootItem.lootTableItem(Items.IRON_AXE).setWeight(4) .apply(EnchantRandomlyFunction.randomApplicableEnchantment()) - .apply(SetNameFunction.setName(new TranslatableComponent("loot.immersiveweapons.chest.village.battlefield.medic_station.iron_axe").withStyle(ChatFormatting.RED)))) + .apply(SetNameFunction + .setName(new TranslatableComponent("loot.immersiveweapons.chest.village.battlefield.medic_station.iron_axe") + .withStyle(ChatFormatting.RED)))) .add(LootItem.lootTableItem(DeferredRegistryHandler.USED_SYRINGE.get()).setWeight(4) .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 3.0f)))) .add(LootItem.lootTableItem(DeferredRegistryHandler.SYRINGE.get()).setWeight(2) .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 2.0f)))) .add(LootItem.lootTableItem(DeferredRegistryHandler.MORPHINE.get()).setWeight(1)))); + + resourceLocationBuilderBiConsumer.accept(LootTableLocations.HANS_HUT, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(UniformGenerator.between(4.0F, 6.0F)) + .add(LootItem.lootTableItem(Items.SALMON).setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 6.0F)))) + .add(LootItem.lootTableItem(Items.COD).setWeight(5) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 6.0F)))) + .add(LootItem.lootTableItem(DeferredRegistryHandler.BOTTLE_OF_ALCOHOL.get()).setWeight(4) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 3.0f)))) + .add(LootItem.lootTableItem(DeferredRegistryHandler.BOTTLE_OF_WINE.get()).setWeight(4) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 3.0f)))) + .add(LootItem.lootTableItem(Items.IRON_SWORD).setWeight(3) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 1.0f))) + .apply(EnchantRandomlyFunction.randomApplicableEnchantment())) + .add(LootItem.lootTableItem(Items.IRON_HELMET).setWeight(2) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0f, 1.0f))) + .apply(EnchantRandomlyFunction.randomApplicableEnchantment())))); + + + resourceLocationBuilderBiConsumer.accept(LootTableLocations.HANS_HUT_CASK, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(UniformGenerator.between(6.0F, 9.0F)) + .add(LootItem.lootTableItem(Items.WHEAT).setWeight(2) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(8.0F, 32.0F)))) + .add(LootItem.lootTableItem(Items.SWEET_BERRIES).setWeight(1) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(8.0f, 16.0f)))))); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/LootTableLocations.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/LootTableLocations.java index b48c56fb7..f6d05a083 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/LootTableLocations.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/LootTableLocations.java @@ -18,6 +18,9 @@ public class LootTableLocations { public static final ResourceLocation UNDERGROUND_BUNKER = register("chests/underground_bunker"); public static final ResourceLocation BATTLEFIELD_VILLAGE_MEDIC_STATION = register("chests/village/battlefield/medic_station"); + public static final ResourceLocation HANS_HUT = register("chests/hans_hut"); + public static final ResourceLocation HANS_HUT_CASK = register("chests/hans_hut_cask"); + private static ResourceLocation register(String pId) { return register(new ResourceLocation(ImmersiveWeapons.MOD_ID, pId)); } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/recipes/RecipeGenerator.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/recipes/RecipeGenerator.java index e6b7f5461..3e75ff111 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/recipes/RecipeGenerator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/recipes/RecipeGenerator.java @@ -13,7 +13,7 @@ import net.minecraft.data.DataGenerator; import net.minecraft.data.recipes.*; import net.minecraft.tags.ItemTags; -import net.minecraft.tags.Tag.Named; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.*; import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; @@ -1865,7 +1865,7 @@ private static void createFlagPole(ItemLike flagPoleItem) { .save(finishedRecipeConsumer); } - private static void createBulletproofStainedGlass(ItemLike stainedGlassItem, Named colorTag) { + private static void createBulletproofStainedGlass(ItemLike stainedGlassItem, TagKey colorTag) { ShapedRecipeBuilder.shaped(stainedGlassItem, 8) .define('a', DeferredRegistryHandler.BULLETPROOF_GLASS.get()) .define('b', colorTag) @@ -1926,7 +1926,7 @@ private static void createSulfur(ItemLike rawItem, ItemLike material) { .save(finishedRecipeConsumer); } - private static void createArrow(ShapedRecipeBuilder builder, Named material) { + private static void createArrow(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .define('b', Items.STICK) .define('c', Items.FEATHER) @@ -1936,7 +1936,7 @@ private static void createArrow(ShapedRecipeBuilder builder, Named materia .save(finishedRecipeConsumer); } - private static void createSword(ShapedRecipeBuilder builder, Named material, Item stick) { + private static void createSword(ShapedRecipeBuilder builder, TagKey material, Item stick) { builder.define('a', material) .define('b', stick) .pattern(" a ") @@ -1945,7 +1945,7 @@ private static void createSword(ShapedRecipeBuilder builder, Named materia .save(finishedRecipeConsumer); } - private static void createPickaxe(ShapedRecipeBuilder builder, Named material) { + private static void createPickaxe(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .define('b', Items.STICK) .pattern("aaa") @@ -1954,7 +1954,7 @@ private static void createPickaxe(ShapedRecipeBuilder builder, Named mater .save(finishedRecipeConsumer); } - private static void createAxe(ShapedRecipeBuilder builder, Named material) { + private static void createAxe(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .define('b', Items.STICK) .pattern("aa ") @@ -1963,7 +1963,7 @@ private static void createAxe(ShapedRecipeBuilder builder, Named material) .save(finishedRecipeConsumer); } - private static void createShovel(ShapedRecipeBuilder builder, Named material) { + private static void createShovel(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .define('b', Items.STICK) .pattern(" a ") @@ -1972,7 +1972,7 @@ private static void createShovel(ShapedRecipeBuilder builder, Named materi .save(finishedRecipeConsumer); } - private static void createHoe(ShapedRecipeBuilder builder, Named material) { + private static void createHoe(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .define('b', Items.STICK) .pattern("aa ") @@ -1981,14 +1981,14 @@ private static void createHoe(ShapedRecipeBuilder builder, Named material) .save(finishedRecipeConsumer); } - private static void createHelmet(ShapedRecipeBuilder builder, Named material) { + private static void createHelmet(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .pattern("aaa") .pattern("a a") .save(finishedRecipeConsumer); } - private static void createChestplate(ShapedRecipeBuilder builder, Named material) { + private static void createChestplate(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .pattern("a a") .pattern("aaa") @@ -1996,7 +1996,7 @@ private static void createChestplate(ShapedRecipeBuilder builder, Named ma .save(finishedRecipeConsumer); } - private static void createLeggings(ShapedRecipeBuilder builder, Named material) { + private static void createLeggings(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .pattern("aaa") .pattern("a a") @@ -2004,14 +2004,14 @@ private static void createLeggings(ShapedRecipeBuilder builder, Named mate .save(finishedRecipeConsumer); } - private static void createBoots(ShapedRecipeBuilder builder, Named material) { + private static void createBoots(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .pattern("a a") .pattern("a a") .save(finishedRecipeConsumer); } - private static void createGauntlet(ShapedRecipeBuilder builder, Named material) { + private static void createGauntlet(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .define('b', DeferredRegistryHandler.GAUNTLET_SCAFFOLDING.get()) .pattern("aaa") @@ -2019,7 +2019,7 @@ private static void createGauntlet(ShapedRecipeBuilder builder, Named mate .save(finishedRecipeConsumer); } - private static void createPike(ShapedRecipeBuilder builder, Named material, ItemLike pikeHead) { + private static void createPike(ShapedRecipeBuilder builder, TagKey material, ItemLike pikeHead) { builder.define('a', pikeHead) .define('b', material) .define('c', DeferredRegistryHandler.WOOD_TOOL_ROD.get()) @@ -2029,7 +2029,7 @@ private static void createPike(ShapedRecipeBuilder builder, Named material .save(finishedRecipeConsumer); } - private static void createPikeHead(ShapedRecipeBuilder builder, Named material, Named material1) { + private static void createPikeHead(ShapedRecipeBuilder builder, TagKey material, TagKey material1) { builder.define('a', material) .define('b', material1) .pattern(" a ") @@ -2037,7 +2037,7 @@ private static void createPikeHead(ShapedRecipeBuilder builder, Named mate .save(finishedRecipeConsumer); } - private static void createMusketBall(ShapedRecipeBuilder builder, Named material) { + private static void createMusketBall(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .define('b', Items.GUNPOWDER) .pattern(" a ") @@ -2045,13 +2045,13 @@ private static void createMusketBall(ShapedRecipeBuilder builder, Named ma .save(finishedRecipeConsumer); } - private static void createPlateItem(ShapedRecipeBuilder builder, Named material) { + private static void createPlateItem(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .pattern("aa ") .save(finishedRecipeConsumer); } - private static void create3x3Object(ShapedRecipeBuilder builder, Named material) { + private static void create3x3Object(ShapedRecipeBuilder builder, TagKey material) { builder.define('a', material) .pattern("aaa") .pattern("aaa") @@ -2088,7 +2088,7 @@ private static void createIngotFromBlock(ShapelessRecipeBuilder builder, ItemLik .save(finishedRecipeConsumer, ImmersiveWeapons.MOD_ID + ":" + getItemName(builder.getResult()) + "_from_" + getItemName(ingotBlock)); } - private static void createNuggetFromIngot(ShapelessRecipeBuilder builder, Named ingotBlock) { + private static void createNuggetFromIngot(ShapelessRecipeBuilder builder, TagKey ingotBlock) { builder.requires(ingotBlock) .save(finishedRecipeConsumer); } @@ -2106,7 +2106,7 @@ private static void createSmokeBomb(ItemLike smokeBombItem) { .save(finishedRecipeConsumer); } - private static void createColoredSmokeBomb(ItemLike smokeBombItem, Named colorTag) { + private static void createColoredSmokeBomb(ItemLike smokeBombItem, TagKey colorTag) { ShapedRecipeBuilder.shaped(smokeBombItem, 2) .define('a', Items.BAMBOO) .define('b', DeferredRegistryHandler.SMALL_PARTS_METAL_THROWABLE_BOMB.get()) @@ -2131,7 +2131,7 @@ private static void createSmokeBombArrow(ItemLike arrowItem) { .save(finishedRecipeConsumer); } - private static void createColoredSmokeBombArrow(ItemLike arrowItem, Named colorTag) { + private static void createColoredSmokeBombArrow(ItemLike arrowItem, TagKey colorTag) { ShapedRecipeBuilder.shaped(arrowItem, 4) .define('a', Items.ARROW) .define('b', DeferredRegistryHandler.SMOKE_POWDER.get()) @@ -2199,7 +2199,7 @@ private static void createShard(ShapelessRecipeBuilder builder, ItemLike materia .save(finishedRecipeConsumer); } - private static void createPistolLikeGun(ItemLike gunItem, Named material) { + private static void createPistolLikeGun(ItemLike gunItem, TagKey material) { ShapedRecipeBuilder.shaped(gunItem) .define('a', ItemTags.PLANKS) .define('b', DeferredRegistryHandler.SMALL_PARTS_IRON.get()) @@ -2268,21 +2268,21 @@ private static void teslaSynthesizing(ItemLike block, ItemLike material1, ItemLi .save(finishedRecipeConsumer, ImmersiveWeapons.MOD_ID + ":" + getItemName(result) + "_tesla_synthesizing"); } - private static void smallPartsTinkering(Named material, ItemLike blueprint, ItemLike result) { + private static void smallPartsTinkering(TagKey material, ItemLike blueprint, ItemLike result) { SmallPartsRecipeBuilder.tinker(Ingredient.of(material), Ingredient.of(blueprint), result.asItem()) .unlocks("copper_ingot", has(ForgeItemTagGroups.COPPER_INGOTS)) .save(finishedRecipeConsumer, ImmersiveWeapons.MOD_ID + ":" + getItemName(result) + "_tinkering"); } - private static String getConversionRecipeName(ItemLike pResult, ItemLike pIngredient) { + protected static String getConversionRecipeName(ItemLike pResult, ItemLike pIngredient) { return getItemName(pResult) + "_from_" + getItemName(pIngredient); } - private static String getItemName(ItemLike pItemLike) { + protected static @NotNull String getItemName(ItemLike pItemLike) { return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(pItemLike.asItem())).getPath(); } - private static String getHasName(ItemLike pItemLike) { + protected static String getHasName(ItemLike pItemLike) { return "has_" + getItemName(pItemLike); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BiomeTagsGenerator.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BiomeTagsGenerator.java new file mode 100644 index 000000000..6c29ff81f --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BiomeTagsGenerator.java @@ -0,0 +1,74 @@ +package com.anonymoushacker1279.immersiveweapons.data.tags; + +import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; +import com.anonymoushacker1279.immersiveweapons.data.tags.groups.forge.ForgeWorldGenTagGroups; +import com.anonymoushacker1279.immersiveweapons.data.tags.groups.immersiveweapons.ImmersiveWeaponsWorldGenTagGroups; +import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes.BiomesAndDimensions; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.tags.TagsProvider; +import net.minecraft.tags.BiomeTags; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import net.minecraftforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.NotNull; + +public class BiomeTagsGenerator extends TagsProvider { + + public BiomeTagsGenerator(DataGenerator generator, ExistingFileHelper fileHelper) { + super(generator, BuiltinRegistries.BIOME, ImmersiveWeapons.MOD_ID, fileHelper); + } + + @Override + @SuppressWarnings("unchecked") + protected void addTags() { + tag(ForgeWorldGenTagGroups.IS_PLAINS) + .add(Biomes.PLAINS, Biomes.SNOWY_PLAINS, Biomes.SUNFLOWER_PLAINS); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_ABANDONED_FACTORY) + .addTags(ForgeWorldGenTagGroups.IS_PLAINS, BiomeTags.IS_FOREST); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_PITFALL_TRAP) + .addTag(BiomeTags.IS_JUNGLE); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_BEAR_TRAP) + .addTags(ForgeWorldGenTagGroups.IS_PLAINS, BiomeTags.IS_FOREST); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_LANDMINE_TRAP) + .add(Biomes.DESERT); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_UNDERGROUND_BUNKER) + .addTags(ForgeWorldGenTagGroups.IS_PLAINS, BiomeTags.IS_FOREST); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_CLOUD_ISLAND) + .addTag(BiomeTags.IS_TAIGA); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_CAMPSITE) + .addTag(ForgeWorldGenTagGroups.IS_PLAINS) + .add(Biomes.DESERT); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_WATER_TOWER) + .addTag(ForgeWorldGenTagGroups.IS_PLAINS); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_HANS_HUT) + .add(Biomes.LUSH_CAVES) + .add(Biomes.DRIPSTONE_CAVES); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_DESTROYED_HOUSE) + .add(BiomesAndDimensions.BATTLEFIELD); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_BATTLEFIELD_CAMP) + .add(BiomesAndDimensions.BATTLEFIELD); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_GRAVEYARD) + .add(BiomesAndDimensions.BATTLEFIELD); + + tag(ImmersiveWeaponsWorldGenTagGroups.HAS_BATTLEFIELD_TOWN) + .add(BiomesAndDimensions.BATTLEFIELD); + } + + @Override + public @NotNull String getName() { + return "Biome Tags"; + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BlockTagsGenerator.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BlockTagsGenerator.java index 7b2a2cb8e..3eea5f041 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BlockTagsGenerator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BlockTagsGenerator.java @@ -152,7 +152,7 @@ private void addMiningBlockTags() { } else if (block == DeferredRegistryHandler.SPOTLIGHT.get() || block == DeferredRegistryHandler.WOODEN_SPIKES.get() || block == DeferredRegistryHandler.PUNJI_STICKS.get()) { - + tier = 1; } else if (block == DeferredRegistryHandler.BARBED_WIRE_FENCE.get()) { tier = 2; @@ -162,17 +162,17 @@ private void addMiningBlockTags() { if (tagStage != 3) { switch (tagStage) { - case 1 -> tag(BlockTags.bind(BlockTags.MINEABLE_WITH_AXE.getName().toString())).add(block); - case 2 -> tag(BlockTags.bind(BlockTags.MINEABLE_WITH_SHOVEL.getName().toString())).add(block); - default -> tag(BlockTags.bind(BlockTags.MINEABLE_WITH_PICKAXE.getName().toString())).add(block); + case 1 -> tag(BlockTags.MINEABLE_WITH_AXE).add(block); + case 2 -> tag(BlockTags.MINEABLE_WITH_SHOVEL).add(block); + default -> tag(BlockTags.MINEABLE_WITH_PICKAXE).add(block); } } if (tier != 0) { switch (tier) { - case 2 -> tag(BlockTags.bind(BlockTags.NEEDS_IRON_TOOL.getName().toString())).add(block); - case 3 -> tag(BlockTags.bind(BlockTags.NEEDS_DIAMOND_TOOL.getName().toString())).add(block); - default -> tag(BlockTags.bind(BlockTags.NEEDS_STONE_TOOL.getName().toString())).add(block); + case 2 -> tag(BlockTags.NEEDS_IRON_TOOL).add(block); + case 3 -> tag(BlockTags.NEEDS_DIAMOND_TOOL).add(block); + default -> tag(BlockTags.NEEDS_STONE_TOOL).add(block); } } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeBlockTagGroups.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeBlockTagGroups.java index 8884c3781..e362976cd 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeBlockTagGroups.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeBlockTagGroups.java @@ -1,12 +1,16 @@ package com.anonymoushacker1279.immersiveweapons.data.tags.groups.forge; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; -import net.minecraft.tags.Tag.Named; +import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; public class ForgeBlockTagGroups { - public static final Named BULLETPROOF_GLASS = BlockTags.bind("forge:bulletproof_glass"); - public static final Named STAINED_GLASS = BlockTags.bind("forge:stained_glass"); - public static final Named COBALT_ORES = BlockTags.bind("forge:ores/cobalt"); + public static final TagKey BULLETPROOF_GLASS = BlockTags.create(new ResourceLocation("forge", + "bulletproof_glass")); + public static final TagKey STAINED_GLASS = BlockTags.create(new ResourceLocation("forge", + "stained_glass")); + public static final TagKey COBALT_ORES = BlockTags.create(new ResourceLocation("forge", + "ores/cobalt")); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeItemTagGroups.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeItemTagGroups.java index ccf686432..ad269aaec 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeItemTagGroups.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeItemTagGroups.java @@ -1,18 +1,28 @@ package com.anonymoushacker1279.immersiveweapons.data.tags.groups.forge; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; -import net.minecraft.tags.Tag.Named; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; public class ForgeItemTagGroups { - public static final Named COBALT_ORES = ItemTags.bind("forge:ores/cobalt"); - public static final Named COBALT_INGOTS = ItemTags.bind("forge:ingots/cobalt"); - public static final Named COPPER_INGOTS = ItemTags.bind("forge:ingots/copper"); - public static final Named METAL_INGOTS = ItemTags.bind("forge:ingots/metal"); - public static final Named COBALT_NUGGETS = ItemTags.bind("forge:nuggets/cobalt"); - public static final Named COPPER_NUGGETS = ItemTags.bind("forge:nuggets/copper"); - public static final Named METAL_NUGGETS = ItemTags.bind("forge:nuggets/metal"); - public static final Named SULFUR_DUSTS = ItemTags.bind("forge:dusts/sulfur"); - public static final Named PICKAXES = ItemTags.bind("forge:pickaxes"); + public static final TagKey COBALT_ORES = ItemTags.create(new ResourceLocation("forge", + "ores/cobalt")); + public static final TagKey COBALT_INGOTS = ItemTags.create(new ResourceLocation("forge", + "ingots/cobalt")); + public static final TagKey COPPER_INGOTS = ItemTags.create(new ResourceLocation("forge", + "ingots/copper")); + public static final TagKey METAL_INGOTS = ItemTags.create(new ResourceLocation("forge", + "ingots/metal")); + public static final TagKey COBALT_NUGGETS = ItemTags.create(new ResourceLocation("forge", + "nuggets/cobalt")); + public static final TagKey COPPER_NUGGETS = ItemTags.create(new ResourceLocation("forge", + "nuggets/copper")); + public static final TagKey METAL_NUGGETS = ItemTags.create(new ResourceLocation("forge", + "nuggets/metal")); + public static final TagKey SULFUR_DUSTS = ItemTags.create(new ResourceLocation("forge", + "dusts/sulfur")); + public static final TagKey PICKAXES = ItemTags.create(new ResourceLocation("forge", + "pickaxes")); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeWorldGenTagGroups.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeWorldGenTagGroups.java new file mode 100644 index 000000000..1cf1915af --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/forge/ForgeWorldGenTagGroups.java @@ -0,0 +1,11 @@ +package com.anonymoushacker1279.immersiveweapons.data.tags.groups.forge; + +import net.minecraft.tags.BiomeTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; + +public class ForgeWorldGenTagGroups { + + // For some reason Mojang doesn't have tags for plains biomes... + public static final TagKey IS_PLAINS = BiomeTags.create("forge:plains"); +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsBlockTagGroups.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsBlockTagGroups.java index d69327604..d024c3b19 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsBlockTagGroups.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsBlockTagGroups.java @@ -1,10 +1,13 @@ package com.anonymoushacker1279.immersiveweapons.data.tags.groups.immersiveweapons; +import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; -import net.minecraft.tags.Tag.Named; +import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; public class ImmersiveWeaponsBlockTagGroups { - public static final Named BURNED_OAK_LOGS = BlockTags.bind("immersiveweapons:burned_oak_logs"); + public static final TagKey BURNED_OAK_LOGS = BlockTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "burned_oak_logs")); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsItemTagGroups.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsItemTagGroups.java index b9aa60e14..ff01e6007 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsItemTagGroups.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsItemTagGroups.java @@ -1,20 +1,33 @@ package com.anonymoushacker1279.immersiveweapons.data.tags.groups.immersiveweapons; +import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; -import net.minecraft.tags.Tag.Named; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; public class ImmersiveWeaponsItemTagGroups { - public static final Named BURNED_OAK_LOGS = ItemTags.bind("immersiveweapons:burned_oak_logs"); - public static final Named FLARES = ItemTags.bind("immersiveweapons:projectiles/flares"); - public static final Named MUSKET_BALLS = ItemTags.bind("immersiveweapons:projectiles/musket_balls"); - public static final Named MOLTEN_INGOTS = ItemTags.bind("immersiveweapons:ingots/molten"); - public static final Named ELECTRIC_INGOTS = ItemTags.bind("immersiveweapons:ingots/electric"); - public static final Named TESLA_INGOTS = ItemTags.bind("immersiveweapons:ingots/tesla"); - public static final Named MOLTEN_SHARDS = ItemTags.bind("immersiveweapons:shards/molten"); - public static final Named VENTUS_SHARDS = ItemTags.bind("immersiveweapons:shards/ventus"); - public static final Named DIAMOND_SHARDS = ItemTags.bind("immersiveweapons:shards/diamond"); - public static final Named STONE_SHARDS = ItemTags.bind("immersiveweapons:shards/stone"); - public static final Named WOOD_SHARDS = ItemTags.bind("immersiveweapons:shards/wood"); + public static final TagKey BURNED_OAK_LOGS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "burned_oak_logs")); + public static final TagKey FLARES = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "projectiles/flares")); + public static final TagKey MUSKET_BALLS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "projectiles/musket_balls")); + public static final TagKey MOLTEN_INGOTS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "ingots/molten")); + public static final TagKey ELECTRIC_INGOTS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "ingots/electric")); + public static final TagKey TESLA_INGOTS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "ingots/tesla")); + public static final TagKey MOLTEN_SHARDS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "shards/molten")); + public static final TagKey VENTUS_SHARDS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "shards/ventus")); + public static final TagKey DIAMOND_SHARDS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "shards/diamond")); + public static final TagKey STONE_SHARDS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "shards/stone")); + public static final TagKey WOOD_SHARDS = ItemTags.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, + "shards/wood")); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsWorldGenTagGroups.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsWorldGenTagGroups.java new file mode 100644 index 000000000..23a0b862a --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/immersiveweapons/ImmersiveWeaponsWorldGenTagGroups.java @@ -0,0 +1,35 @@ +package com.anonymoushacker1279.immersiveweapons.data.tags.groups.immersiveweapons; + +import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; +import net.minecraft.tags.BiomeTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; + +public class ImmersiveWeaponsWorldGenTagGroups { + + // Biome Tags + public static final TagKey HAS_ABANDONED_FACTORY = createStructureTag("abandoned_factory"); + public static final TagKey HAS_PITFALL_TRAP = createStructureTag("pitfall_trap"); + public static final TagKey HAS_BEAR_TRAP = createStructureTag("bear_trap"); + public static final TagKey HAS_LANDMINE_TRAP = createStructureTag("landmine_trap"); + public static final TagKey HAS_UNDERGROUND_BUNKER = createStructureTag("underground_bunker"); + public static final TagKey HAS_CLOUD_ISLAND = createStructureTag("cloud_island"); + public static final TagKey HAS_CAMPSITE = createStructureTag("campsite"); + public static final TagKey HAS_WATER_TOWER = createStructureTag("water_tower"); + public static final TagKey HAS_HANS_HUT = createStructureTag("hans_hut"); + public static final TagKey HAS_DESTROYED_HOUSE = createStructureTag("destroyed_house"); + public static final TagKey HAS_BATTLEFIELD_CAMP = createStructureTag("battlefield_camp"); + public static final TagKey HAS_GRAVEYARD = createStructureTag("graveyard"); + public static final TagKey HAS_BATTLEFIELD_TOWN = createStructureTag("battlefield_town"); + + // Structure Tags + + /** + * Helper method for creating a biome tag for containing structures. + * + * @param tag a string to be used for the tag + */ + private static TagKey createStructureTag(String tag) { + return BiomeTags.create(ImmersiveWeapons.MOD_ID + ":has_structure/" + tag); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/minecraft/MinecraftBlockTagGroups.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/minecraft/MinecraftBlockTagGroups.java index 0ea847a0f..2e50c25a5 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/minecraft/MinecraftBlockTagGroups.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/minecraft/MinecraftBlockTagGroups.java @@ -1,24 +1,25 @@ package com.anonymoushacker1279.immersiveweapons.data.tags.groups.minecraft; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; -import net.minecraft.tags.Tag.Named; +import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; public class MinecraftBlockTagGroups { - public static final Named FENCES = BlockTags.bind("minecraft:fences"); - public static final Named LOGS_THAT_BURN = BlockTags.bind("minecraft:logs_that_burn"); - public static final Named PLANKS = BlockTags.bind("minecraft:planks"); - public static final Named SLABS = BlockTags.bind("minecraft:slabs"); - public static final Named STAIRS = BlockTags.bind("minecraft:stairs"); - public static final Named STANDING_SIGNS = BlockTags.bind("minecraft:standing_signs"); - public static final Named WALL_SIGNS = BlockTags.bind("minecraft:wall_signs"); - public static final Named WOODEN_BUTTONS = BlockTags.bind("minecraft:wooden_buttons"); - public static final Named WOODEN_DOORS = BlockTags.bind("minecraft:wooden_doors"); - public static final Named WOODEN_FENCES = BlockTags.bind("minecraft:wooden_fences"); - public static final Named WOODEN_PRESSURE_PLATES = BlockTags.bind("minecraft:wooden_pressure_plates"); - public static final Named WOODEN_SLABS = BlockTags.bind("minecraft:wooden_slabs"); - public static final Named WOODEN_STAIRS = BlockTags.bind("minecraft:wooden_stairs"); - public static final Named WOODEN_TRAPDOORS = BlockTags.bind("minecraft:wooden_trapdoors"); - public static final Named NON_FLAMMABLE_WOOD = BlockTags.bind("minecraft:non_flammable_wood"); + public static final TagKey FENCES = BlockTags.create(new ResourceLocation("fences")); + public static final TagKey LOGS_THAT_BURN = BlockTags.create(new ResourceLocation("logs_that_burn")); + public static final TagKey PLANKS = BlockTags.create(new ResourceLocation("planks")); + public static final TagKey SLABS = BlockTags.create(new ResourceLocation("slabs")); + public static final TagKey STAIRS = BlockTags.create(new ResourceLocation("stairs")); + public static final TagKey STANDING_SIGNS = BlockTags.create(new ResourceLocation("standing_signs")); + public static final TagKey WALL_SIGNS = BlockTags.create(new ResourceLocation("wall_signs")); + public static final TagKey WOODEN_BUTTONS = BlockTags.create(new ResourceLocation("wooden_buttons")); + public static final TagKey WOODEN_DOORS = BlockTags.create(new ResourceLocation("wooden_doors")); + public static final TagKey WOODEN_FENCES = BlockTags.create(new ResourceLocation("wooden_fences")); + public static final TagKey WOODEN_PRESSURE_PLATES = BlockTags.create(new ResourceLocation("wooden_pressure_plates")); + public static final TagKey WOODEN_SLABS = BlockTags.create(new ResourceLocation("wooden_slabs")); + public static final TagKey WOODEN_STAIRS = BlockTags.create(new ResourceLocation("wooden_stairs")); + public static final TagKey WOODEN_TRAPDOORS = BlockTags.create(new ResourceLocation("wooden_trapdoors")); + public static final TagKey NON_FLAMMABLE_WOOD = BlockTags.create(new ResourceLocation("non_flammable_wood")); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/minecraft/MinecraftItemTagGroups.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/minecraft/MinecraftItemTagGroups.java index 9163de641..602398ab0 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/minecraft/MinecraftItemTagGroups.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/groups/minecraft/MinecraftItemTagGroups.java @@ -1,25 +1,26 @@ package com.anonymoushacker1279.immersiveweapons.data.tags.groups.minecraft; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; -import net.minecraft.tags.Tag.Named; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; public class MinecraftItemTagGroups { - - public static final Named FENCES = ItemTags.bind("minecraft:fences"); - public static final Named LOGS_THAT_BURN = ItemTags.bind("minecraft:logs_that_burn"); - public static final Named PLANKS = ItemTags.bind("minecraft:planks"); - public static final Named SLABS = ItemTags.bind("minecraft:slabs"); - public static final Named STAIRS = ItemTags.bind("minecraft:stairs"); - public static final Named SIGNS = ItemTags.bind("minecraft:signs"); - public static final Named WOODEN_BUTTONS = ItemTags.bind("minecraft:wooden_buttons"); - public static final Named WOODEN_DOORS = ItemTags.bind("minecraft:wooden_doors"); - public static final Named WOODEN_FENCES = ItemTags.bind("minecraft:wooden_fences"); - public static final Named WOODEN_PRESSURE_PLATES = ItemTags.bind("minecraft:wooden_pressure_plates"); - public static final Named WOODEN_SLABS = ItemTags.bind("minecraft:wooden_slabs"); - public static final Named WOODEN_STAIRS = ItemTags.bind("minecraft:wooden_stairs"); - public static final Named WOODEN_TRAPDOORS = ItemTags.bind("minecraft:wooden_trapdoors"); - public static final Named BOATS = ItemTags.bind("minecraft:boats"); - public static final Named ARROWS = ItemTags.bind("minecraft:arrows"); + + public static final TagKey FENCES = ItemTags.create(new ResourceLocation("fences")); + public static final TagKey LOGS_THAT_BURN = ItemTags.create(new ResourceLocation("logs_that_burn")); + public static final TagKey PLANKS = ItemTags.create(new ResourceLocation("planks")); + public static final TagKey SLABS = ItemTags.create(new ResourceLocation("slabs")); + public static final TagKey STAIRS = ItemTags.create(new ResourceLocation("stairs")); + public static final TagKey SIGNS = ItemTags.create(new ResourceLocation("signs")); + public static final TagKey WOODEN_BUTTONS = ItemTags.create(new ResourceLocation("wooden_buttons")); + public static final TagKey WOODEN_DOORS = ItemTags.create(new ResourceLocation("wooden_doors")); + public static final TagKey WOODEN_FENCES = ItemTags.create(new ResourceLocation("wooden_fences")); + public static final TagKey WOODEN_PRESSURE_PLATES = ItemTags.create(new ResourceLocation("wooden_pressure_plates")); + public static final TagKey WOODEN_SLABS = ItemTags.create(new ResourceLocation("wooden_slabs")); + public static final TagKey WOODEN_STAIRS = ItemTags.create(new ResourceLocation("wooden_stairs")); + public static final TagKey WOODEN_TRAPDOORS = ItemTags.create(new ResourceLocation("wooden_trapdoors")); + public static final TagKey BOATS = ItemTags.create(new ResourceLocation("boats")); + public static final TagKey ARROWS = ItemTags.create(new ResourceLocation("arrows")); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/ai/goal/CelestialTowerSummonGoal.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/ai/goal/CelestialTowerSummonGoal.java index eba25f4dd..ee952a812 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/ai/goal/CelestialTowerSummonGoal.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/ai/goal/CelestialTowerSummonGoal.java @@ -11,6 +11,8 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.BossEvent.BossBarColor; import net.minecraft.world.InteractionHand; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -30,7 +32,7 @@ public class CelestialTowerSummonGoal extends Goal { private final CelestialTowerEntity mob; private int waveSpawnCooldown = 100; private AABB searchBox; - private static final float MINION_WAVE_SIZE_MODIFIER = Float.parseFloat(CommonConfig.CELESTIAL_TOWER_MINIONS_WAVE_SIZE_MODIFIER.get()); + private static final double MINION_WAVE_SIZE_MODIFIER = CommonConfig.CELESTIAL_TOWER_MINIONS_WAVE_SIZE_MODIFIER.get(); public CelestialTowerSummonGoal(CelestialTowerEntity pMob) { mob = pMob; @@ -56,61 +58,113 @@ public void tick() { int fodderMobsToSpawn = (int) (mobsToSpawn * 0.3f); // Get the number of "fodder" mobs to spawn mobsToSpawn = mobsToSpawn - fodderMobsToSpawn; // Reduce the total number left to spawn int powerMobsToSpawn = isWavesPastHalf() ? (int) (mobsToSpawn * 0.2f) : 0; // Get the number of "power" mobs to spawn, if over halfway through the waves - mobsToSpawn = mobsToSpawn - powerMobsToSpawn; //Reduce the total number left to spawn + mobsToSpawn = mobsToSpawn - powerMobsToSpawn; // Reduce the total number left to spawn for (int i = fodderMobsToSpawn; i > 0; i--) { - BlockPos summonPos = new BlockPos(mob.getX() + GeneralUtilities.getRandomNumber(-8, 9), mob.getY(), mob.getZ() + GeneralUtilities.getRandomNumber(-8, 9)); - RockSpiderEntity entity = new RockSpiderEntity(DeferredRegistryHandler.ROCK_SPIDER_ENTITY.get(), mob.level); - entity.setPersistenceRequired(); - entity.teleportTo(summonPos.getX(), summonPos.getY(), summonPos.getZ()); - mob.level.addFreshEntity(entity); - ((ServerLevel) mob.level).sendParticles(ParticleTypes.POOF, mob.position().x, mob.position().y, mob.position().z, 1, GeneralUtilities.getRandomNumber(-0.03d, 0.03d), GeneralUtilities.getRandomNumber(-0.1d, -0.08d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); + BlockPos summonPos = new BlockPos(mob.getX() + GeneralUtilities.getRandomNumber(-8, 9), + mob.getY(), + mob.getZ() + GeneralUtilities.getRandomNumber(-8, 9)); + + RockSpiderEntity rockSpiderEntity = new RockSpiderEntity(DeferredRegistryHandler.ROCK_SPIDER_ENTITY.get(), mob.level); + rockSpiderEntity.setPersistenceRequired(); + rockSpiderEntity.teleportTo(summonPos.getX(), summonPos.getY(), summonPos.getZ()); + mob.level.addFreshEntity(rockSpiderEntity); + ((ServerLevel) mob.level) + .sendParticles(ParticleTypes.POOF, + mob.position().x, + mob.position().y, + mob.position().z, + 1, + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), + GeneralUtilities.getRandomNumber(-0.1d, -0.08d), + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); + } for (int i = powerMobsToSpawn; i > 0; i--) { - BlockPos summonPos = new BlockPos(mob.getX() + GeneralUtilities.getRandomNumber(-8, 9), mob.getY(), mob.getZ() + GeneralUtilities.getRandomNumber(-8, 9)); - Zombie entity = new Zombie(EntityType.ZOMBIE, mob.level); - entity.setPersistenceRequired(); + BlockPos summonPos = new BlockPos(mob.getX() + GeneralUtilities.getRandomNumber(-8, 9), + mob.getY(), + mob.getZ() + GeneralUtilities.getRandomNumber(-8, 9)); + + Zombie zombieEntity = new Zombie(EntityType.ZOMBIE, mob.level); + zombieEntity.setPersistenceRequired(); ItemStack sword = new ItemStack(Items.IRON_SWORD); sword.enchant(Enchantments.SHARPNESS, GeneralUtilities.getRandomNumber(2, 4 + mob.getWavesSpawned())); sword.enchant(Enchantments.KNOCKBACK, GeneralUtilities.getRandomNumber(1, 3 + mob.getWavesSpawned())); sword.enchant(Enchantments.FIRE_ASPECT, GeneralUtilities.getRandomNumber(1, 2 + mob.getWavesSpawned())); - entity.setItemSlot(EquipmentSlot.HEAD, new ItemStack(Items.IRON_HELMET)); - entity.setItemSlot(EquipmentSlot.CHEST, new ItemStack(Items.IRON_CHESTPLATE)); - entity.setItemSlot(EquipmentSlot.LEGS, new ItemStack(Items.IRON_LEGGINGS)); - entity.setItemSlot(EquipmentSlot.FEET, new ItemStack(Items.IRON_BOOTS)); - Objects.requireNonNull(entity.getAttribute(Attributes.MAX_HEALTH)).setBaseValue(20 + (GeneralUtilities.getRandomNumber(5, 11) * mob.getWaveSizeModifier())); - entity.heal(entity.getMaxHealth()); - entity.setItemInHand(InteractionHand.MAIN_HAND, sword); - entity.teleportTo(summonPos.getX(), summonPos.getY(), summonPos.getZ()); - mob.level.addFreshEntity(entity); - ((ServerLevel) mob.level).sendParticles(ParticleTypes.POOF, mob.position().x, mob.position().y, mob.position().z, 1, GeneralUtilities.getRandomNumber(-0.03d, 0.03d), GeneralUtilities.getRandomNumber(-0.1d, -0.08d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); + zombieEntity.setItemSlot(EquipmentSlot.HEAD, new ItemStack(Items.IRON_HELMET)); + zombieEntity.setItemSlot(EquipmentSlot.CHEST, new ItemStack(Items.IRON_CHESTPLATE)); + zombieEntity.setItemSlot(EquipmentSlot.LEGS, new ItemStack(Items.IRON_LEGGINGS)); + zombieEntity.setItemSlot(EquipmentSlot.FEET, new ItemStack(Items.IRON_BOOTS)); + Objects.requireNonNull(zombieEntity.getAttribute(Attributes.MAX_HEALTH)) + .setBaseValue(20 + (GeneralUtilities.getRandomNumber(5, 11) * mob.getWaveSizeModifier())); + + zombieEntity.heal(zombieEntity.getMaxHealth()); + zombieEntity.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 9999, 0, true, true)); + zombieEntity.setItemInHand(InteractionHand.MAIN_HAND, sword); + zombieEntity.teleportTo(summonPos.getX(), summonPos.getY(), summonPos.getZ()); + mob.level.addFreshEntity(zombieEntity); + ((ServerLevel) mob.level).sendParticles(ParticleTypes.POOF, + mob.position().x, + mob.position().y, + mob.position().z, + 1, + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), + GeneralUtilities.getRandomNumber(-0.1d, -0.08d), + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); + } for (int i = mobsToSpawn; i > 0; i--) { - BlockPos summonPos = new BlockPos(mob.getX() + GeneralUtilities.getRandomNumber(-8, 9), mob.getY(), mob.getZ() + GeneralUtilities.getRandomNumber(-8, 9)); - Skeleton entity = new Skeleton(EntityType.SKELETON, mob.level); - entity.setPersistenceRequired(); + BlockPos summonPos = new BlockPos(mob.getX() + GeneralUtilities.getRandomNumber(-8, 9), + mob.getY(), + mob.getZ() + GeneralUtilities.getRandomNumber(-8, 9)); + + Skeleton skeletonEntity = new Skeleton(EntityType.SKELETON, mob.level); + skeletonEntity.setPersistenceRequired(); ItemStack bow = new ItemStack(Items.BOW); bow.enchant(Enchantments.POWER_ARROWS, GeneralUtilities.getRandomNumber(1, 3 + mob.getWavesSpawned())); bow.enchant(Enchantments.PUNCH_ARROWS, GeneralUtilities.getRandomNumber(1, 2 + mob.getWavesSpawned())); - entity.setItemSlot(EquipmentSlot.HEAD, new ItemStack(Items.IRON_HELMET)); - Objects.requireNonNull(entity.getAttribute(Attributes.MAX_HEALTH)).setBaseValue(20 + (GeneralUtilities.getRandomNumber(0, 6) * mob.getWaveSizeModifier())); - entity.heal(entity.getMaxHealth()); - entity.setItemInHand(InteractionHand.MAIN_HAND, bow); - entity.teleportTo(summonPos.getX(), summonPos.getY(), summonPos.getZ()); - mob.level.addFreshEntity(entity); - ((ServerLevel) mob.level).sendParticles(ParticleTypes.POOF, mob.position().x, mob.position().y, mob.position().z, 1, GeneralUtilities.getRandomNumber(-0.03d, 0.03d), GeneralUtilities.getRandomNumber(-0.1d, -0.08d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); + skeletonEntity.setItemSlot(EquipmentSlot.HEAD, new ItemStack(Items.IRON_HELMET)); + Objects.requireNonNull(skeletonEntity.getAttribute(Attributes.MAX_HEALTH)) + .setBaseValue(20 + (GeneralUtilities.getRandomNumber(0, 6) * mob.getWaveSizeModifier())); + + skeletonEntity.heal(skeletonEntity.getMaxHealth()); + skeletonEntity.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 9999, 0, true, true)); + skeletonEntity.setItemInHand(InteractionHand.MAIN_HAND, bow); + skeletonEntity.teleportTo(summonPos.getX(), summonPos.getY(), summonPos.getZ()); + mob.level.addFreshEntity(skeletonEntity); + ((ServerLevel) mob.level).sendParticles(ParticleTypes.POOF, + mob.position().x, + mob.position().y, + mob.position().z, + 1, + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), + GeneralUtilities.getRandomNumber(-0.1d, -0.08d), + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); } // Spawn some particles for (int i = 96; i > 0; i--) { - ((ServerLevel) mob.level).sendParticles(ParticleTypes.FLAME, mob.position().x, mob.position().y, mob.position().z, 1, GeneralUtilities.getRandomNumber(-0.03d, 0.03d), GeneralUtilities.getRandomNumber(-0.1d, -0.08d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); + ((ServerLevel) mob.level).sendParticles(ParticleTypes.FLAME, + mob.position().x, + mob.position().y, + mob.position().z, + 1, + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), + GeneralUtilities.getRandomNumber(-0.1d, -0.08d), + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), 1.0f); } mob.setWavesSpawned(mob.getWavesSpawned() + 1); // Increment the total spawned waves mob.bossEvent.setProgress((float) mob.getWavesSpawned() / mob.getTotalWavesToSpawn()); - mob.bossEvent.setName(new TranslatableComponent("immersiveweapons.boss.celestial_tower.waves", mob.getWavesSpawned(), mob.getTotalWavesToSpawn())); + mob.bossEvent.setName(new TranslatableComponent("immersiveweapons.boss.celestial_tower.waves", + mob.getWavesSpawned(), + mob.getTotalWavesToSpawn())); + mob.setNoActionTime(0); - mob.playSound(DeferredRegistryHandler.CELESTIAL_TOWER_SUMMON.get(), 1.0f, 1.0f + GeneralUtilities.getRandomNumber(-0.3f, 0.2f)); + mob.playSound(DeferredRegistryHandler.CELESTIAL_TOWER_SUMMON.get(), + 1.0f, + 1.0f + GeneralUtilities.getRandomNumber(-0.3f, 0.2f)); + waveSpawnCooldown = 100; // Set the wave spawn cooldown } else if (waveSpawnCooldown > 0) { waveSpawnCooldown--; @@ -120,17 +174,26 @@ public void tick() { mob.bossEvent.setName(mob.getDisplayName()); mob.bossEvent.setProgress(1f); mob.setNoActionTime(0); - mob.playSound(DeferredRegistryHandler.CELESTIAL_TOWER_VULNERABLE.get(), 1.0f, 1.0f + GeneralUtilities.getRandomNumber(-0.3f, 0.2f)); + mob.playSound(DeferredRegistryHandler.CELESTIAL_TOWER_VULNERABLE.get(), + 1.0f, + 1.0f + GeneralUtilities.getRandomNumber(-0.3f, 0.2f)); + } } // Only return major mobs in the area; "fodder" entities are ignored private int getEligibleMobsInArea() { if (searchBox == null) { - searchBox = new AABB(mob.getX() - 32, mob.getY() - 16, mob.getZ() - 32, mob.getX() + 16, mob.getY() + 16, mob.getZ() + 32); + searchBox = new AABB(mob.getX() - 32, + mob.getY() - 16, + mob.getZ() - 32, + mob.getX() + 16, + mob.getY() + 16, + mob.getZ() + 32); + } - int mobs; - mobs = mob.level.getNearbyEntities(Skeleton.class, TargetingConditions.forNonCombat(), mob, searchBox).size(); + + int mobs = mob.level.getNearbyEntities(Skeleton.class, TargetingConditions.forNonCombat(), mob, searchBox).size(); mobs = mobs + mob.level.getNearbyEntities(Zombie.class, TargetingConditions.forNonCombat(), mob, searchBox).size(); return mobs; } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractDyingSoldierEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractDyingSoldierEntity.java index f1b2fec9c..449df40fd 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractDyingSoldierEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractDyingSoldierEntity.java @@ -26,8 +26,7 @@ import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ProjectileWeaponItem; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; @@ -64,18 +63,18 @@ public void start() { /** * Constructor for AbstractDyingSoldierEntity. * - * @param type the EntityType instance - * @param worldIn the World the entity is in + * @param type the EntityType instance + * @param level the Level the entity is in */ - AbstractDyingSoldierEntity(EntityType type, Level worldIn) { - super(type, worldIn); + AbstractDyingSoldierEntity(EntityType type, Level level) { + super(type, level); setCombatTask(); } /** * Register this entity's attributes. * - * @return AttributeModifierMap.MutableAttribute + * @return AttributeSupplier.Builder */ public static AttributeSupplier.Builder registerAttributes() { return Monster.createMonsterAttributes() @@ -106,11 +105,11 @@ protected void registerGoals() { /** * Play the step sound. * - * @param pos the BlockPos the entity is at - * @param blockIn the BlockState of the block being stepped on + * @param pos the BlockPos the entity is at + * @param state the BlockState of the block being stepped on */ @Override - protected void playStepSound(@NotNull BlockPos pos, @NotNull BlockState blockIn) { + protected void playStepSound(@NotNull BlockPos pos, @NotNull BlockState state) { playSound(getStepSound(), 0.15F, 1.0F); } @@ -119,7 +118,7 @@ protected void playStepSound(@NotNull BlockPos pos, @NotNull BlockState blockIn) /** * Get the mob type. * - * @return CreatureAttribute + * @return MobType */ @Override public @NotNull MobType getMobType() { @@ -151,31 +150,37 @@ protected void populateDefaultEquipmentSlots(@NotNull DifficultyInstance difficu /** * Finalize spawn information. * - * @param worldIn the IServerWorld the entity is in - * @param difficultyIn the DifficultyInstance of the world - * @param reason the SpawnReason for the entity - * @param spawnDataIn the ILivingEntitySpawnData for the entity - * @param dataTag the CompoundNBT data tag for the entity - * @return ILivingEntityData + * @param level the ServerLevelAccessor the entity is in + * @param difficulty the DifficultyInstance of the world + * @param spawnType the MobSpawnType for the entity + * @param groupData the SpawnGroupData for the entity + * @param tag the CompoundTag data tag for the entity + * @return SpawnGroupData */ @Override - public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldIn, @NotNull DifficultyInstance difficultyIn, @NotNull MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { - spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - populateDefaultEquipmentSlots(difficultyIn); - populateDefaultEquipmentEnchantments(difficultyIn); + public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor level, @NotNull DifficultyInstance difficulty, + @NotNull MobSpawnType spawnType, @Nullable SpawnGroupData groupData, + @Nullable CompoundTag tag) { + + groupData = super.finalizeSpawn(level, difficulty, spawnType, groupData, tag); + populateDefaultEquipmentSlots(difficulty); + populateDefaultEquipmentEnchantments(difficulty); setCombatTask(); - setCanPickUpLoot(random.nextFloat() < 0.55F * difficultyIn.getSpecialMultiplier()); + setCanPickUpLoot(random.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); + if (getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { - LocalDate localdate = LocalDate.now(); - int day = localdate.get(ChronoField.DAY_OF_MONTH); - int month = localdate.get(ChronoField.MONTH_OF_YEAR); + LocalDate date = LocalDate.now(); + int day = date.get(ChronoField.DAY_OF_MONTH); + int month = date.get(ChronoField.MONTH_OF_YEAR); if (month == 10 && day == 31 && random.nextFloat() < 0.25F) { - setItemSlot(EquipmentSlot.HEAD, new ItemStack(random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); + setItemSlot(EquipmentSlot.HEAD, + new ItemStack(random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); + armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } } - return spawnDataIn; + return groupData; } /** @@ -272,12 +277,12 @@ public void readAdditionalSaveData(@NotNull CompoundTag compound) { /** * Set item slots. * - * @param slotIn the EquipmentSlotType to set - * @param stack the ItemStack to set in the slot + * @param slot the EquipmentSlot to set + * @param stack the ItemStack to set in the slot */ @Override - public void setItemSlot(@NotNull EquipmentSlot slotIn, @NotNull ItemStack stack) { - super.setItemSlot(slotIn, stack); + public void setItemSlot(@NotNull EquipmentSlot slot, @NotNull ItemStack stack) { + super.setItemSlot(slot, stack); if (!level.isClientSide) { setCombatTask(); } @@ -287,12 +292,12 @@ public void setItemSlot(@NotNull EquipmentSlot slotIn, @NotNull ItemStack stack) /** * Get the standing eye height of the entity. * - * @param poseIn the Pose instance - * @param sizeIn the EntitySize of the entity + * @param pose the Pose instance + * @param dimensions the EntityDimensions of the entity * @return float */ @Override - protected float getStandingEyeHeight(@NotNull Pose poseIn, @NotNull EntityDimensions sizeIn) { + protected float getStandingEyeHeight(@NotNull Pose pose, @NotNull EntityDimensions dimensions) { return 1.74F; } @@ -305,4 +310,12 @@ protected float getStandingEyeHeight(@NotNull Pose poseIn, @NotNull EntityDimens public double getMyRidingOffset() { return -0.6D; } + + @Override + public boolean checkSpawnRules(@NotNull LevelAccessor pLevel, @NotNull MobSpawnType pSpawnReason) { + boolean walkTargetAboveZero = super.checkSpawnRules(pLevel, pSpawnReason); + boolean onGround = pLevel.getBlockState(blockPosition().below()).getFluidState().isEmpty(); + + return walkTargetAboveZero && onGround; + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractWanderingWarriorEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractWanderingWarriorEntity.java index 87204f59d..e9b60861d 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractWanderingWarriorEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractWanderingWarriorEntity.java @@ -15,8 +15,7 @@ import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.*; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; @@ -44,18 +43,18 @@ public void start() { /** * Constructor for AbstractWanderingWarriorEntity. * - * @param type the EntityType instance - * @param worldIn the World the entity is in + * @param type the EntityType instance + * @param level the Level the entity is in */ - AbstractWanderingWarriorEntity(EntityType type, Level worldIn) { - super(type, worldIn); + AbstractWanderingWarriorEntity(EntityType type, Level level) { + super(type, level); setCombatTask(); } /** * Register this entity's attributes. * - * @return AttributeModifierMap.MutableAttribute + * @return AttributeSupplier.Builder */ public static AttributeSupplier.Builder registerAttributes() { return Monster.createMonsterAttributes() @@ -82,11 +81,11 @@ protected void registerGoals() { /** * Play the step sound. * - * @param pos the BlockPos the entity is at - * @param blockIn the BlockState of the block being stepped on + * @param pos the BlockPos the entity is at + * @param state the BlockState of the block being stepped on */ @Override - protected void playStepSound(@NotNull BlockPos pos, @NotNull BlockState blockIn) { + protected void playStepSound(@NotNull BlockPos pos, @NotNull BlockState state) { playSound(getStepSound(), 0.15F, 1.0F); } @@ -146,31 +145,37 @@ protected void populateDefaultEquipmentSlots(@NotNull DifficultyInstance difficu /** * Finalize spawn information. * - * @param worldIn the IServerWorld the entity is in - * @param difficultyIn the DifficultyInstance of the world - * @param reason the SpawnReason for the entity - * @param spawnDataIn the ILivingEntitySpawnData for the entity - * @param dataTag the CompoundNBT data tag for the entity - * @return ILivingEntityData + * @param level the ServerLevelAccessor the entity is in + * @param difficulty the DifficultyInstance of the world + * @param spawnType the MobSpawnType for the entity + * @param groupData the SpawnGroupData for the entity + * @param tag the CompoundTag data tag for the entity + * @return SpawnGroupData */ @Override - public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldIn, @NotNull DifficultyInstance difficultyIn, @NotNull MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { - spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - populateDefaultEquipmentSlots(difficultyIn); - populateDefaultEquipmentEnchantments(difficultyIn); + public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor level, @NotNull DifficultyInstance difficulty, + @NotNull MobSpawnType spawnType, @Nullable SpawnGroupData groupData, + @Nullable CompoundTag tag) { + + groupData = super.finalizeSpawn(level, difficulty, spawnType, groupData, tag); + populateDefaultEquipmentSlots(difficulty); + populateDefaultEquipmentEnchantments(difficulty); setCombatTask(); - setCanPickUpLoot(random.nextFloat() < 0.55F * difficultyIn.getSpecialMultiplier()); + setCanPickUpLoot(random.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); + if (getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { LocalDate date = LocalDate.now(); int day = date.get(ChronoField.DAY_OF_MONTH); int month = date.get(ChronoField.MONTH_OF_YEAR); if (month == 10 && day == 31 && random.nextFloat() < 0.25F) { - setItemSlot(EquipmentSlot.HEAD, new ItemStack(random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); + setItemSlot(EquipmentSlot.HEAD, + new ItemStack(random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); + armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } } - return spawnDataIn; + return groupData; } /** @@ -189,10 +194,18 @@ void setCombatTask() { /** * Read entity NBT data. * - * @param compound the CompoundNBT to read from + * @param compound the CompoundTag to read from */ @Override public void readAdditionalSaveData(@NotNull CompoundTag compound) { super.readAdditionalSaveData(compound); } + + @Override + public boolean checkSpawnRules(@NotNull LevelAccessor pLevel, @NotNull MobSpawnType pSpawnReason) { + boolean walkTargetAboveZero = super.checkSpawnRules(pLevel, pSpawnReason); + boolean onGround = pLevel.getBlockState(blockPosition().below()).getFluidState().isEmpty(); + + return walkTargetAboveZero && onGround; + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/CelestialTowerEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/CelestialTowerEntity.java index 3733a4d12..1447b4c1e 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/CelestialTowerEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/CelestialTowerEntity.java @@ -1,16 +1,17 @@ package com.anonymoushacker1279.immersiveweapons.entity.monster; +import com.anonymoushacker1279.immersiveweapons.block.decoration.CelestialLanternBlock; import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.entity.ai.goal.CelestialTowerSummonGoal; import com.anonymoushacker1279.immersiveweapons.entity.ai.goal.HoverGoal; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerBossEvent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; @@ -26,12 +27,11 @@ import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.level.*; -import net.minecraft.world.level.block.state.BlockBehaviour.BlockStateBase; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.util.List; import java.util.Objects; public class CelestialTowerEntity extends Monster { @@ -42,10 +42,7 @@ public class CelestialTowerEntity extends Monster { private int waveSizeModifier = 1; private int wavesSpawned = 0; private boolean doneSpawningWaves = false; - private static int lastSpawnAttemptTick = -1; - private final MinecraftServer server = getServer(); - private static final int XZ_SPAWN_CHECK_RADIUS = CommonConfig.CELESTIAL_TOWER_XZ_SPAWN_CHECK_RADIUS.get(); - private static final int Y_SPAWN_CHECK_RADIUS = CommonConfig.CELESTIAL_TOWER_Y_SPAWN_CHECK_RADIUS.get(); + private static final int SPAWN_CHECK_RADIUS = CommonConfig.CELESTIAL_TOWER_SPAWN_CHECK_RADIUS.get(); public CelestialTowerEntity(EntityType type, Level level) { super(type, level); @@ -208,40 +205,28 @@ public boolean checkSpawnRules(@NotNull LevelAccessor pLevel, @NotNull MobSpawnT if (pSpawnReason == MobSpawnType.SPAWNER || pSpawnReason == MobSpawnType.SPAWN_EGG) { return true; } - if (server.getTickCount() - CelestialTowerEntity.lastSpawnAttemptTick >= 40) { - CelestialTowerEntity.lastSpawnAttemptTick = server.getTickCount(); - BlockPos blockPos = blockPosition(); - long nearbyCelestialLanterns = level.getBlockStatesIfLoaded(new AABB(blockPos.getX() - XZ_SPAWN_CHECK_RADIUS, - blockPos.getY() - Y_SPAWN_CHECK_RADIUS, blockPos.getZ() - XZ_SPAWN_CHECK_RADIUS, - blockPos.getX() + XZ_SPAWN_CHECK_RADIUS, blockPos.getY() + Y_SPAWN_CHECK_RADIUS, - blockPos.getZ() + XZ_SPAWN_CHECK_RADIUS)) - .filter(blockState -> blockState == DeferredRegistryHandler.CELESTIAL_LANTERN.get().defaultBlockState()) - .limit(3) - .count(); - if (nearbyCelestialLanterns >= 3) { - return false; - } else if (nearbyCelestialLanterns == 0) { - return canSpawn(level, blockPos); - } else if (GeneralUtilities.getRandomNumber(0.0f, 1.0f) <= ( - nearbyCelestialLanterns == 2 ? 0.125f : 0.25f)) { - return canSpawn(level, blockPos); - } - } else if (CelestialTowerEntity.lastSpawnAttemptTick == -1) { - CelestialTowerEntity.lastSpawnAttemptTick = server.getTickCount(); + + if (!pLevel.getBlockState(blockPosition().below()).isValidSpawn(pLevel, blockPosition().below(), getType())) { + return false; } - return false; - } + Vec3 position = position(); + List ALL_TILTROS_LANTERNS = CelestialLanternBlock.ALL_TILTROS_LANTERNS; + int nearbyLanterns = 0; - private boolean canSpawn(LevelAccessor pLevel, BlockPos blockPos) { - BlockState belowState = pLevel.getBlockState(blockPos.below()); - boolean isValidSpawn = belowState.isValidSpawn(pLevel, blockPos.below(), getType()); - boolean hasSufficientGround = pLevel.getBlockStatesIfLoaded(new AABB(blockPos.getX() - 8, - blockPos.getY() - 1, blockPos.getZ() - 8, blockPos.getX() + 8, blockPos.getY(), - blockPos.getZ() + 8)) - .filter(BlockStateBase::isAir) - .count() / 256.0f >= 0.8f; - return isValidSpawn && hasSufficientGround; + for (BlockPos lanternPos : ALL_TILTROS_LANTERNS) { + if (nearbyLanterns < 3) { + if (lanternPos.distManhattan(new Vec3i(position.x, position.y, position.z)) < SPAWN_CHECK_RADIUS) { + nearbyLanterns++; + } + } + } + + if (nearbyLanterns == 3) { + return false; + } else if (nearbyLanterns == 0) { + return true; + } else return GeneralUtilities.getRandomNumber(0.0f, 1.0f) <= (nearbyLanterns == 2 ? 0.125f : 0.25f); } @Override diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/LavaRevenantEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/lava_revenant/LavaRevenantEntity.java similarity index 69% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/LavaRevenantEntity.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/lava_revenant/LavaRevenantEntity.java index 00d5c9dea..c147f4b33 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/LavaRevenantEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/lava_revenant/LavaRevenantEntity.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.entity.monster; +package com.anonymoushacker1279.immersiveweapons.entity.monster.lava_revenant; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; @@ -25,9 +25,13 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent.Context; @@ -40,24 +44,43 @@ public class LavaRevenantEntity extends FlyingMob implements Enemy { - public static final int TICKS_PER_FLAP = Mth.ceil(24.166098F); + private static final int TICKS_PER_FLAP = Mth.ceil(24.166098F); private static final EntityDataAccessor ID_SIZE = SynchedEntityData.defineId(LavaRevenantEntity.class, EntityDataSerializers.INT); Vec3 moveTargetPoint = Vec3.ZERO; BlockPos anchorPoint = BlockPos.ZERO; LavaRevenantEntity.AttackPhase attackPhase = LavaRevenantEntity.AttackPhase.CIRCLE; + private final LavaRevenantPart[] subEntities; + private final LavaRevenantPart wing1; + private final LavaRevenantPart wing2; + private final LavaRevenantPart head; + private final LavaRevenantPart body; + private final LavaRevenantPart tail; + private final double[][] positions = new double[64][3]; + private int posPointer = -1; + private float yRotA; + private boolean inWall; public LavaRevenantEntity(EntityType entityType, Level level) { super(entityType, level); xpReward = 25; moveControl = new LavaRevenantMoveControl(this); lookControl = new LavaRevenantLookControl(this); + + wing1 = new LavaRevenantPart(this, "wing", (6.0F * getScale()), 2.0F); + wing2 = new LavaRevenantPart(this, "wing", (6.0F * getScale()), 2.0F); + head = new LavaRevenantPart(this, "head", (3.0F * getScale()), (2.7F * getScale())); + body = new LavaRevenantPart(this, "body", (5.0F * (getScale() * 0.8f)), (2.0F * getScale())); + tail = new LavaRevenantPart(this, "tail", (2.5F * (getScale() * 0.8f)), 1.0F); + subEntities = new LavaRevenantPart[]{wing1, wing2, head, body, tail}; + + noPhysics = true; } /** * Register this entity's attributes. * - * @return AttributeModifierMap.MutableAttribute + * @return AttributeSupplier.Builder */ public static AttributeSupplier.Builder registerAttributes() { return Monster.createMonsterAttributes() @@ -76,7 +99,8 @@ public boolean removeWhenFarAway(double pDistanceToClosestPlayer) { } @Override - protected @NotNull BodyRotationControl createBodyControl() { + protected @NotNull + BodyRotationControl createBodyControl() { return new LavaRevenantBodyRotationControl(this); } @@ -137,13 +161,18 @@ protected boolean shouldDespawnInPeaceful() { @Override public void tick() { super.tick(); + if (level.isClientSide) { float flapTick = Mth.cos((float) (getUniqueFlapTickOffset() + tickCount) * 7.448451F * ((float) Math.PI / 180F) + (float) Math.PI); - float flapTick1 = Mth.cos((float) (getUniqueFlapTickOffset() + tickCount + 1) * 7.448451F + float nextFlapTick = Mth.cos((float) (getUniqueFlapTickOffset() + tickCount + 1) * 7.448451F * ((float) Math.PI / 180F) + (float) Math.PI); - if (flapTick > 0.0F && flapTick1 <= 0.0F) { + if (inWall) { + nextFlapTick *= 2.0f; + } + + if (flapTick > 0.0F && nextFlapTick <= 0.0F) { level.playLocalSound(getX(), getY(), getZ(), DeferredRegistryHandler.LAVA_REVENANT_FLAP.get(), getSoundSource(), 0.95F + random.nextFloat() * 0.05F, 0.95F + random.nextFloat() * 0.05F, false); @@ -158,16 +187,184 @@ public void tick() { getZ() + (double) zSizeModifier, 0.0D, 0.0D, 0.0D); level.addParticle(ParticleTypes.LAVA, getX() - (double) xSizeModifier, getY() + (double) ySizeModifier, getZ() - (double) zSizeModifier, 0.0D, 0.0D, 0.0D); + + } + + if (posPointer < 0) { + for (int i = 0; i < positions.length; ++i) { + positions[i][0] = getYRot(); + positions[i][1] = getY(); + } + } + + if (++posPointer == positions.length) { + posPointer = 0; + } + + Vec3[] subEntitiesLengthVector = new Vec3[subEntities.length]; + + for (int i = 0; i < subEntities.length; ++i) { + subEntitiesLengthVector[i] = new Vec3(subEntities[i].getX(), subEntities[i].getY(), subEntities[i].getZ()); + } + + double moveTargetDeltaX = moveTargetPoint.x - getX(); + double moveTargetDeltaZ = moveTargetPoint.z - getZ(); + + if (Math.abs(moveTargetDeltaX) > (double) 1.0E-5F || Math.abs(moveTargetDeltaZ) > (double) 1.0E-5F) { + float yRotAModifier = Mth.clamp( + Mth.wrapDegrees(180.0F - (float) Mth.atan2(moveTargetDeltaX, moveTargetDeltaZ) + * (180F / (float) Math.PI) - getYRot()), + -10.0F, 10.0F); + + yRotA *= 0.8F; + yRotA += yRotAModifier * getTurnSpeed(); + } + + float latencyPosModifier = (float) (getLatencyPos(5, 1.0F)[1] + - getLatencyPos(10, 1.0F)[1]) * 10.0F * ((float) Math.PI / 180F); + float cosLatencyPosModifier = Mth.cos(latencyPosModifier); + float sinLatencyPosModifier = Mth.sin(latencyPosModifier); + float sinRotModifier = Mth.sin(getYRot() * ((float) Math.PI / 180F) - yRotA * 0.01F); + float cosRotModifier = Mth.cos(getYRot() * ((float) Math.PI / 180F) - yRotA * 0.01F); + float yHeadOffset = getHeadYOffset(); + + float yRadians = getYRot() * ((float) Math.PI / 180F); + float wingXOffset = Mth.cos(yRadians); + float wingZOffset = Mth.sin(yRadians); + + tickPart(wing1, wingXOffset * 4.5f, 2f, wingZOffset * 4.5f); + tickPart(wing2, wingXOffset * -4.5f, 2f, wingZOffset * -4.5f); + + tickPart(body, (sinRotModifier * 0.5F), 0.0D, (-cosRotModifier * 0.5F)); + + tickPart(head, (-sinRotModifier * (4.5f * getScale() * 0.8f) * cosLatencyPosModifier), + (yHeadOffset + sinLatencyPosModifier * 6.5f), + (cosRotModifier * (4.5f * getScale() * 0.8f) * cosLatencyPosModifier)); + + tickPart(tail, (sinRotModifier * (4.5f * getScale() * 0.8f) * cosLatencyPosModifier), + (yHeadOffset + sinLatencyPosModifier * 6.5f), + (-cosRotModifier * (4.5f * getScale() * 0.8f) * cosLatencyPosModifier)); + + if (!level.isClientSide) { + inWall = checkWalls(head.getBoundingBox()) | checkWalls(body.getBoundingBox()); + } + + for (int i = 0; i < subEntities.length; ++i) { + subEntities[i].xo = subEntitiesLengthVector[i].x; + subEntities[i].yo = subEntitiesLengthVector[i].y; + subEntities[i].zo = subEntitiesLengthVector[i].z; + subEntities[i].xOld = subEntitiesLengthVector[i].x; + subEntities[i].yOld = subEntitiesLengthVector[i].y; + subEntities[i].zOld = subEntitiesLengthVector[i].z; + } + + } + + private void tickPart(LavaRevenantPart pPart, double offsetX, double offsetY, double offsetZ) { + pPart.setPos(getX() + offsetX, getY() + offsetY, getZ() + offsetZ); + } + + public double[] getLatencyPos(int pointer, float multiplier) { + if (isDeadOrDying()) { + multiplier = 0.0F; + } + + multiplier = 1.0F - multiplier; + int item = posPointer - pointer & 63; + int previousItem = posPointer - pointer - 1 & 63; + double[] latencyPos = new double[3]; + double yawOffset = positions[item][0]; + double yOffsetMinusYawOffset = Mth.wrapDegrees(positions[previousItem][0] - yawOffset); + latencyPos[0] = yawOffset + yOffsetMinusYawOffset * (double) multiplier; + yawOffset = positions[item][1]; + yOffsetMinusYawOffset = positions[previousItem][1] - yawOffset; + latencyPos[1] = yawOffset + yOffsetMinusYawOffset * (double) multiplier; + latencyPos[2] = Mth.lerp(multiplier, positions[item][2], positions[previousItem][2]); + return latencyPos; + } + + private float getHeadYOffset() { + double[] latencyPos = getLatencyPos(5, 1.0F); + double[] latencyPos1 = getLatencyPos(0, 1.0F); + return (float) (latencyPos[1] - latencyPos1[1]); + } + + public float getTurnSpeed() { + float deltaDistance = (float) (getDeltaMovement().horizontalDistance() + 1.0F); + float min = Math.min(deltaDistance, 40.0F); + return 0.7F / min / deltaDistance; + } + + public boolean hurt(LavaRevenantPart part, DamageSource source, float damage) { + if (part == wing1 || part == wing2) { + damage = damage * 0.65f; + } else if (part == head) { + damage = damage * 1.5f; + } else if (part == tail) { + damage = damage * 0.35f; + } + + return hurt(source, damage); + } + + /** + * Destroys weak blocks that are in the way + */ + private boolean checkWalls(AABB pArea) { + int minX = Mth.floor(pArea.minX); + int minY = Mth.floor(pArea.minY); + int minZ = Mth.floor(pArea.minZ); + int maxX = Mth.floor(pArea.maxX); + int maxY = Mth.floor(pArea.maxY); + int maxZ = Mth.floor(pArea.maxZ); + boolean stuck = false; + boolean blockRemoved = false; + + for (int i = minX; i <= maxX; ++i) { + for (int lMinY = minY; lMinY <= maxY; ++lMinY) { + for (int lMinZ = minZ; lMinZ <= maxZ; ++lMinZ) { + BlockPos pos = new BlockPos(i, lMinY, lMinZ); + BlockState state = level.getBlockState(pos); + if (!state.isAir() && state.getMaterial() != Material.FIRE) { + if (ForgeHooks.canEntityDestroy(level, pos, this) + && state.getDestroySpeed(level, pos) < 5.0f) { + + blockRemoved = level.removeBlock(pos, false) || blockRemoved; + } else { + stuck = true; + } + } + } + } + } + + if (blockRemoved) { + BlockPos randomPos = new BlockPos(minX + random.nextInt(maxX - minX + 1), + minY + random.nextInt(maxY - minY + 1), + minZ + random.nextInt(maxZ - minZ + 1)); + level.levelEvent(2008, randomPos, 0); } + return stuck; + } + + @Override + public boolean isMultipartEntity() { + return true; + } + + @Override + public net.minecraftforge.entity.PartEntity[] getParts() { + return subEntities; } @Override public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNull DifficultyInstance pDifficulty, @NotNull MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + anchorPoint = blockPosition().above(15); - setSize(GeneralUtilities.getRandomNumber(1, 4)); + setSize(GeneralUtilities.getRandomNumber(1, 3)); setHealth(getMaxHealth()); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } @@ -179,7 +376,9 @@ public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNul public void readAdditionalSaveData(@NotNull CompoundTag pCompound) { super.readAdditionalSaveData(pCompound); if (pCompound.contains("AX")) { - anchorPoint = new BlockPos(pCompound.getInt("AX"), pCompound.getInt("AY"), pCompound.getInt("AZ")); + anchorPoint = new BlockPos(pCompound.getInt("AX"), + pCompound.getInt("AY"), + pCompound.getInt("AZ")); } setSize(pCompound.getInt("Size")); @@ -203,7 +402,8 @@ public boolean shouldRenderAtSqrDistance(double pDistance) { } @Override - public @NotNull SoundSource getSoundSource() { + public @NotNull + SoundSource getSoundSource() { return SoundSource.HOSTILE; } @@ -223,7 +423,8 @@ protected SoundEvent getDeathSound() { } @Override - public @NotNull MobType getMobType() { + public @NotNull + MobType getMobType() { return MobType.UNDEAD; } @@ -241,7 +442,8 @@ public boolean canAttackType(@NotNull EntityType pType) { } @Override - public @NotNull EntityDimensions getDimensions(@NotNull Pose pPose) { + public @NotNull + EntityDimensions getDimensions(@NotNull Pose pPose) { int size = getSize(); EntityDimensions dimensions = super.getDimensions(pPose); float scaleFactor = (dimensions.width + 0.2F * (float) size) / dimensions.width; @@ -532,17 +734,21 @@ public void tick() { float deltaTargetZ = (float) (moveTargetPoint.z - getZ()); double sqrtXZ = Mth.sqrt(deltaTargetX * deltaTargetX + deltaTargetZ * deltaTargetZ); if (Math.abs(sqrtXZ) > (double) 1.0E-5F) { - double d1 = 1.0D - (double) Mth.abs(deltaTargetY * 0.7F) / sqrtXZ; - deltaTargetX = (float) ((double) deltaTargetX * d1); - deltaTargetZ = (float) ((double) deltaTargetZ * d1); + double absolute = 1.0D - (double) Mth.abs(deltaTargetY * 0.7F) / sqrtXZ; + deltaTargetX = (float) ((double) deltaTargetX * absolute); + deltaTargetZ = (float) ((double) deltaTargetZ * absolute); sqrtXZ = Mth.sqrt(deltaTargetX * deltaTargetX + deltaTargetZ * deltaTargetZ); - double sqrtXZY = Mth.sqrt(deltaTargetX * deltaTargetX + deltaTargetZ * deltaTargetZ + deltaTargetY * deltaTargetY); + double sqrtXZY = Mth.sqrt(deltaTargetX * deltaTargetX + deltaTargetZ + * deltaTargetZ + deltaTargetY * deltaTargetY); + float yRotation = getYRot(); float angle = (float) Mth.atan2(deltaTargetZ, deltaTargetX); float yRotationWrapped90 = Mth.wrapDegrees(getYRot() + 90.0F); float angleWrapped = Mth.wrapDegrees(angle * (180F / (float) Math.PI)); + setYRot(Mth.approachDegrees(yRotationWrapped90, angleWrapped, 4.0F) - 90.0F); yBodyRot = getYRot(); + if (Mth.degreesDifferenceAbs(yRotation, getYRot()) < 3.0F) { speed = Mth.approach(speed, 1.8F, 0.005F * (1.8F / speed)); } else { @@ -552,13 +758,24 @@ public void tick() { float xRotation = (float) (-(Mth.atan2(-deltaTargetY, sqrtXZ) * (double) (180F / (float) Math.PI))); setXRot(xRotation); float yRotationPlus90 = getYRot() + 90.0F; - double x = (double) (speed * Mth.cos(yRotationPlus90 * ((float) Math.PI / 180F))) * Math.abs((double) deltaTargetX / sqrtXZY); - double y = (double) (speed * Mth.sin(yRotationPlus90 * ((float) Math.PI / 180F))) * Math.abs((double) deltaTargetZ / sqrtXZY); - double z = (double) (speed * Mth.sin(xRotation * ((float) Math.PI / 180F))) * Math.abs((double) deltaTargetY / sqrtXZY); + + double x = (double) (speed * Mth.cos(yRotationPlus90 * ((float) Math.PI / 180F))) + * Math.abs((double) deltaTargetX / sqrtXZY); + double y = (double) (speed * Mth.sin(yRotationPlus90 * ((float) Math.PI / 180F))) + * Math.abs((double) deltaTargetZ / sqrtXZY); + double z = (double) (speed * Mth.sin(xRotation * ((float) Math.PI / 180F))) + * Math.abs((double) deltaTargetY / sqrtXZY); + Vec3 deltaMovement = getDeltaMovement(); + + if (inWall) { + setYRot(yRotation - 180f); + deltaMovement.scale(0.8f); + deltaMovement.reverse(); + } + setDeltaMovement(deltaMovement.add((new Vec3(x, z, y)).subtract(deltaMovement).scale(0.2D))); } - } } @@ -624,7 +841,9 @@ public void tick() { if (target != null) { moveTargetPoint = new Vec3(target.getX(), target.getY(0.5D), target.getZ()); if (getBoundingBox().inflate(0.2F).intersects(target.getBoundingBox())) { - doHurtTarget(target); + if (!inWall) { + doHurtTarget(target); + } attackPhase = LavaRevenantEntity.AttackPhase.CIRCLE; if (!isSilent()) { PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/lava_revenant/LavaRevenantPart.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/lava_revenant/LavaRevenantPart.java new file mode 100644 index 000000000..3d6a699b9 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/lava_revenant/LavaRevenantPart.java @@ -0,0 +1,76 @@ +package com.anonymoushacker1279.immersiveweapons.entity.monster.lava_revenant; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraftforge.entity.PartEntity; +import org.jetbrains.annotations.NotNull; + +public class LavaRevenantPart extends PartEntity { + public final LavaRevenantEntity parentMob; + public final String name; + private final EntityDimensions size; + + public LavaRevenantPart(LavaRevenantEntity entity, String name, float width, float height) { + super(entity); + size = EntityDimensions.scalable(width, height); + refreshDimensions(); + parentMob = entity; + this.name = name; + } + + @Override + protected void defineSynchedData() { + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + protected void readAdditionalSaveData(@NotNull CompoundTag pCompound) { + } + + @Override + protected void addAdditionalSaveData(@NotNull CompoundTag pCompound) { + } + + /** + * Returns true if other Entities should be prevented from moving through this Entity. + */ + @Override + public boolean isPickable() { + return true; + } + + /** + * Called when the entity is attacked. + */ + @Override + public boolean hurt(@NotNull DamageSource pSource, float pAmount) { + return !isInvulnerableTo(pSource) && parentMob.hurt(this, pSource, pAmount); + } + + /** + * Returns true if Entity argument is equal to this Entity + */ + @Override + public boolean is(@NotNull Entity pEntity) { + return this == pEntity || parentMob == pEntity; + } + + @Override + public Packet getAddEntityPacket() { + throw new UnsupportedOperationException(); + } + + @Override + public @NotNull EntityDimensions getDimensions(@NotNull Pose pPose) { + return size; + } + + @Override + public boolean shouldBeSaved() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractMinutemanEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractMinutemanEntity.java index 3e3edf4bc..2e3e81c6b 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractMinutemanEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractMinutemanEntity.java @@ -109,11 +109,11 @@ protected void registerGoals() { targetSelector.addGoal(1, new HurtByTargetGoal(this, MinutemanEntity.class, IronGolem.class)); targetSelector.addGoal(4, new DefendVillageTargetGoal(this)); targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AbstractDyingSoldierEntity.class, - false)); + true)); targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 8, true, false, this::isAngryAt)); targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Monster.class, 10, - false, false, (targetPredicate) -> !(targetPredicate instanceof Creeper))); + true, false, (targetPredicate) -> !(targetPredicate instanceof Creeper))); targetSelector.addGoal(5, new ResetUniversalAngerTargetGoal<>(this, false)); } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/AbstractBulletEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/AbstractBulletEntity.java index 46b2ac465..bde9f8d5c 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/AbstractBulletEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/AbstractBulletEntity.java @@ -1,6 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.entity.projectile; import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; +import com.anonymoushacker1279.immersiveweapons.data.tags.groups.forge.ForgeBlockTagGroups; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import net.minecraft.core.BlockPos; @@ -24,6 +25,7 @@ import net.minecraft.world.phys.*; import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.Tags.Blocks; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; @@ -387,7 +389,7 @@ protected void onHitBlock(BlockHitResult blockHitResult) { // Check if the bullet hit a permeable block like leaves, if so // keep moving and decrease velocity - if (inBlockState.is(BlockTags.bind("minecraft:leaves"))) { + if (inBlockState.is(BlockTags.LEAVES)) { push(0, -0.1, 0); shakeTime = 4; } else { @@ -405,9 +407,9 @@ protected void onHitBlock(BlockHitResult blockHitResult) { // Check if glass can be broken, and if it hasn't already broken glass if (canBreakGlass && !hasAlreadyBrokeGlass - && !inBlockState.is(BlockTags.bind("forge:bulletproof_glass")) - && inBlockState.is(BlockTags.bind("forge:glass")) - || inBlockState.is(BlockTags.bind("forge:glass_panes"))) { + && !inBlockState.is(ForgeBlockTagGroups.BULLETPROOF_GLASS) + && inBlockState.is(Blocks.GLASS) + || inBlockState.is(Blocks.GLASS_PANES)) { level.destroyBlock(blockHitResult.getBlockPos(), false); hasAlreadyBrokeGlass = true; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ForgeEventSubscriber.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ForgeEventSubscriber.java index a8428984b..3ffa81704 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ForgeEventSubscriber.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ForgeEventSubscriber.java @@ -2,13 +2,11 @@ import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; -import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.OreGeneratorHandler; -import net.minecraft.world.entity.MobCategory; +import net.minecraft.core.Holder; import net.minecraft.world.level.biome.Biome.BiomeCategory; -import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraftforge.common.world.BiomeGenerationSettingsBuilder; import net.minecraftforge.event.world.BiomeLoadingEvent; import net.minecraftforge.eventbus.api.EventPriority; @@ -30,33 +28,40 @@ public class ForgeEventSubscriber { @SubscribeEvent(priority = EventPriority.HIGH) public static void onBiomeLoading(BiomeLoadingEvent event) { BiomeGenerationSettingsBuilder generation = event.getGeneration(); - if (event.getCategory() != BiomeCategory.NETHER && event.getCategory() != BiomeCategory.THEEND) { - generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, OreGeneratorHandler.COBALT_ORE_FEATURE); - generation.addFeature(Decoration.UNDERGROUND_ORES, OreGeneratorHandler.DEEPSLATE_COBALT_ORE_FEATURE); + BiomeCategory biomeCategory = event.getCategory(); - if (event.getCategory() == BiomeCategory.RIVER || event.getCategory() == BiomeCategory.OCEAN) { - generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, OreGeneratorHandler.SULFUR_ORE_FEATURE); - generation.addFeature(Decoration.UNDERGROUND_ORES, OreGeneratorHandler.DEEPSLATE_SULFUR_ORE_FEATURE); + if (biomeCategory == BiomeCategory.NETHER) { + if (CommonConfig.ENABLE_MOLTEN_ORE.get()) { + generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, + Holder.direct(OreGeneratorHandler.MOLTEN_ORE_BLOB_PLACEMENT)); } - - if (event.getCategory() != BiomeCategory.OCEAN && event.getCategory() != BiomeCategory.RIVER) { - if (CommonConfig.WANDERING_WARRIOR_SPAWN.get()) - event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.WANDERING_WARRIOR_ENTITY.get(), 13, 1, 1)); - if (CommonConfig.HANS_SPAWN.get()) - event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.HANS_ENTITY.get(), 1, 1, 1)); + if (CommonConfig.ENABLE_NETHER_SULFUR_ORE.get()) { + generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, + Holder.direct(OreGeneratorHandler.NETHER_SULFUR_ORE_BLOB_PLACEMENT)); + } + } else if (biomeCategory != BiomeCategory.THEEND) { + if (CommonConfig.ENABLE_COBALT_ORE.get()) { + generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, + Holder.direct(OreGeneratorHandler.COBALT_ORE_BLOB_PLACEMENT)); + } + if (CommonConfig.ENABLE_DEEPSLATE_COBALT_ORE.get()) { + generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, + Holder.direct(OreGeneratorHandler.DEEPSLATE_COBALT_ORE_BLOB_PLACEMENT)); } } - if (event.getCategory() == BiomeCategory.NETHER) { - generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, OreGeneratorHandler.MOLTEN_ORE_FEATURE); - generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, OreGeneratorHandler.NETHER_SULFUR_ORE_FEATURE); + + if (biomeCategory == BiomeCategory.RIVER || biomeCategory == BiomeCategory.OCEAN) { + if (CommonConfig.ENABLE_SULFUR_ORE.get()) { + generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, + Holder.direct(OreGeneratorHandler.SULFUR_ORE_BLOB_PLACEMENT)); + } } - if (Objects.requireNonNull(event.getName()).toString().equals("immersiveweapons:tiltros")) { - if (CommonConfig.LAVA_REVENANT_SPAWN.get()) - event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.LAVA_REVENANT_ENTITY.get(), 1, 0, 1)); - if (CommonConfig.ROCK_SPIDER_SPAWN.get()) - event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.ROCK_SPIDER_ENTITY.get(), 5, 4, 12)); - if (CommonConfig.CELESTIAL_TOWER_SPAWN.get()) - event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.CELESTIAL_TOWER_ENTITY.get(), 2, 0, 1)); + if (Objects.equals(event.getName(), Biomes.LUSH_CAVES.location()) + || Objects.equals(event.getName(), Biomes.DRIPSTONE_CAVES.location())) { + if (CommonConfig.ENABLE_DEEPSLATE_SULFUR_ORE.get()) { + generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, + Holder.direct(OreGeneratorHandler.DEEPSLATE_SULFUR_ORE_BLOB_PLACEMENT)); + } } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ModEventSubscriber.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ModEventSubscriber.java index 3d786a612..9971782db 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ModEventSubscriber.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ModEventSubscriber.java @@ -2,6 +2,7 @@ import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.entity.monster.*; +import com.anonymoushacker1279.immersiveweapons.entity.monster.lava_revenant.LavaRevenantEntity; import com.anonymoushacker1279.immersiveweapons.entity.neutral.AbstractFieldMedicEntity; import com.anonymoushacker1279.immersiveweapons.entity.neutral.AbstractMinutemanEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DeferredRegistryHandler.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DeferredRegistryHandler.java index 45f490a9b..77768321a 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DeferredRegistryHandler.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DeferredRegistryHandler.java @@ -8,7 +8,7 @@ import com.anonymoushacker1279.immersiveweapons.block.decoration.*; import com.anonymoushacker1279.immersiveweapons.block.misc.MedicStatueBlock; import com.anonymoushacker1279.immersiveweapons.block.misc.MinutemanStatueBlock; -import com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior.*; +import com.anonymoushacker1279.immersiveweapons.block.misc.warrior_statue.*; import com.anonymoushacker1279.immersiveweapons.block.properties.WoodTypes; import com.anonymoushacker1279.immersiveweapons.block.sign.BurnedOakStandingSignBlock; import com.anonymoushacker1279.immersiveweapons.block.sign.BurnedOakWallSignBlock; @@ -19,6 +19,7 @@ import com.anonymoushacker1279.immersiveweapons.container.TeslaSynthesizerContainer; import com.anonymoushacker1279.immersiveweapons.entity.misc.ChairEntity; import com.anonymoushacker1279.immersiveweapons.entity.monster.*; +import com.anonymoushacker1279.immersiveweapons.entity.monster.lava_revenant.LavaRevenantEntity; import com.anonymoushacker1279.immersiveweapons.entity.neutral.FieldMedicEntity; import com.anonymoushacker1279.immersiveweapons.entity.neutral.MinutemanEntity; import com.anonymoushacker1279.immersiveweapons.entity.projectile.BulletEntity.*; @@ -102,7 +103,7 @@ public class DeferredRegistryHandler { // Particle Register public static final DeferredRegister> PARTICLE_TYPES = DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, ImmersiveWeapons.MOD_ID); // Global Loot Modifier Register - public static final DeferredRegister> GLOBAL_LOOT_MODIFIER_SERIALIZER = DeferredRegister.create(ForgeRegistries.LOOT_MODIFIER_SERIALIZERS, ImmersiveWeapons.MOD_ID); + public static final DeferredRegister> GLOBAL_LOOT_MODIFIER_SERIALIZER = DeferredRegister.create(ForgeRegistries.Keys.LOOT_MODIFIER_SERIALIZERS, ImmersiveWeapons.MOD_ID); // Tile Entity Register public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITIES, ImmersiveWeapons.MOD_ID); // Biome Register @@ -204,7 +205,7 @@ public static void init() { public static final RegistryObject VENTUS_STAFF_CORE = ITEMS.register("ventus_staff_core", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject AZUL_KEYSTONE = ITEMS.register("azul_keystone", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject AZUL_KEYSTONE_FRAGMENT = ITEMS.register("azul_keystone_fragment", () -> new Item(new Properties().tab(ITEM_GROUP))); - public static final RegistryObject CELESTIAL_FRAGMENT = ITEMS.register("celestial_fragment", () -> new Item(new Properties().tab(ITEM_GROUP))); + public static final RegistryObject CELESTIAL_FRAGMENT = ITEMS.register("celestial_fragment", () -> new Item(new Properties().tab(ITEM_GROUP).fireResistant())); public static final RegistryObject WOOD_PIKE_HEAD = ITEMS.register("wood_pike_head", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject STONE_PIKE_HEAD = ITEMS.register("stone_pike_head", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject GOLD_PIKE_HEAD = ITEMS.register("gold_pike_head", () -> new Item(new Properties().tab(ITEM_GROUP))); @@ -452,7 +453,7 @@ public static void init() { public static final RegistryObject> MORTAR_SHELL_ENTITY = ENTITY_TYPES.register("mortar_shell", () -> EntityType.Builder.of(MortarShellEntity::new, MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "mortar_shell").toString())); public static final RegistryObject> BURNED_OAK_BOAT_ENTITY = ENTITY_TYPES.register("burned_oak_boat", () -> EntityType.Builder. of(BurnedOakBoatEntity::new, MobCategory.MISC).sized(1.375f, 0.5625f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "burned_oak_boat").toString())); public static final RegistryObject> MUD_BALL_ENTITY = ENTITY_TYPES.register("mud_ball", () -> EntityType.Builder. of(MudBallEntity::new, MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "mud_ball").toString())); - public static final RegistryObject> LAVA_REVENANT_ENTITY = ENTITY_TYPES.register("lava_revenant", () -> EntityType.Builder.of(LavaRevenantEntity::new, MobCategory.MONSTER).sized(15.0f, 5.0f).clientTrackingRange(128).fireImmune().build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "lava_revenant").toString())); + public static final RegistryObject> LAVA_REVENANT_ENTITY = ENTITY_TYPES.register("lava_revenant", () -> EntityType.Builder.of(LavaRevenantEntity::new, MobCategory.MONSTER).sized(16.0f, 6.0f).clientTrackingRange(32).fireImmune().build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "lava_revenant").toString())); public static final RegistryObject> ROCK_SPIDER_ENTITY = ENTITY_TYPES.register("rock_spider", () -> EntityType.Builder.of(RockSpiderEntity::new, MobCategory.MONSTER).sized(0.30f, 0.30f).clientTrackingRange(16).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "rock_spider").toString())); public static final RegistryObject> CELESTIAL_TOWER_ENTITY = ENTITY_TYPES.register("celestial_tower", () -> EntityType.Builder.of(CelestialTowerEntity::new, MobCategory.MONSTER).sized(8.0f, 9.0f).clientTrackingRange(32).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "celestial_tower").toString())); @@ -639,6 +640,7 @@ public static void init() { public static final RegistryObject> MEDIC_STATUE_BLOCK_ENTITY = BLOCK_ENTITIES.register("medic_statue", () -> new BlockEntityType<>(MedicStatueBlockEntity::new, Sets.newHashSet(MEDIC_STATUE.get()), null)); public static final RegistryObject> TESLA_SYNTHESIZER_BLOCK_ENTITY = BLOCK_ENTITIES.register("tesla_synthesizer", () -> new BlockEntityType<>(TeslaSynthesizerBlockEntity::new, Sets.newHashSet(TESLA_SYNTHESIZER.get()), null)); public static final RegistryObject> BURNED_OAK_SIGN_ENTITY = BLOCK_ENTITIES.register("custom_sign", () -> BlockEntityType.Builder.of(BurnedOakSignEntity::new, BURNED_OAK_SIGN.get(), BURNED_OAK_WALL_SIGN.get()).build(null)); + public static final RegistryObject> CELESTIAL_LANTERN_BLOCK_ENTITY = BLOCK_ENTITIES.register("celestial_lantern", () -> new BlockEntityType<>(CelestialLanternBlockEntity::new, Sets.newHashSet(CELESTIAL_LANTERN.get()), null)); // Effects public static final RegistryObject MORPHINE_EFFECT = EFFECTS.register("morphine", () -> new MorphineEffect(MobEffectCategory.NEUTRAL, 3484189)); @@ -649,13 +651,9 @@ public static void init() { public static final RegistryObject> BURNED_BRANCH_DECORATOR = TREE_DECORATORS.register("burned_branch", () -> new TreeDecoratorType<>(BurnedBranchDecorator.CODEC)); // Structures - public static final RegistryObject> ABANDONED_FACTORY_STRUCTURE = STRUCTURES.register("abandoned_factory", AbandonedFactoryStructure::new); - public static final RegistryObject> BEAR_TRAP_STRUCTURE = STRUCTURES.register("bear_trap", BearTrapStructure::new); - public static final RegistryObject> CAMPSITE_STRUCTURE = STRUCTURES.register("campsite", CampsiteStructure::new); public static final RegistryObject> CLOUD_ISLAND_STRUCTURE = STRUCTURES.register("cloud_island", CloudIslandStructure::new); - public static final RegistryObject> LANDMINE_TRAP_STRUCTURE = STRUCTURES.register("landmine_trap", LandmineTrapStructure::new); - public static final RegistryObject> OUTHOUSE_STRUCTURE = STRUCTURES.register("outhouse", OuthouseStructure::new); + public static final RegistryObject> HANS_HUT_STRUCTURE = STRUCTURES.register("hans_hut", HansHut::new); public static final RegistryObject> PITFALL_TRAP_STRUCTURE = STRUCTURES.register("pitfall_trap", PitfallTrapStructure::new); public static final RegistryObject> UNDERGROUND_BUNKER_STRUCTURE = STRUCTURES.register("underground_bunker", UndergroundBunkerStructure::new); - public static final RegistryObject> WATER_TOWER_STRUCTURE = STRUCTURES.register("water_tower", WaterTowerStructure::new); + public static final RegistryObject> DESTROYED_HOUSE = STRUCTURES.register("destroyed_house", DestroyedHouse::new); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PacketHandler.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PacketHandler.java index 48b12cefd..ac2216731 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PacketHandler.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PacketHandler.java @@ -2,9 +2,9 @@ import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.block.base.MortarBlock.MortarBlockPacketHandler; -import com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior.WarriorStatueTorso.WarriorStatueTorsoPacketHandler; +import com.anonymoushacker1279.immersiveweapons.block.misc.warrior_statue.WarriorStatueTorso.WarriorStatueTorsoPacketHandler; import com.anonymoushacker1279.immersiveweapons.block.trap.SpikeTrapBlock.SpikeTrapBlockPacketHandler; -import com.anonymoushacker1279.immersiveweapons.entity.monster.LavaRevenantEntity.LavaRevenantEntityPacketHandler; +import com.anonymoushacker1279.immersiveweapons.entity.monster.lava_revenant.LavaRevenantEntity.LavaRevenantEntityPacketHandler; import com.anonymoushacker1279.immersiveweapons.entity.neutral.AbstractFieldMedicEntity.AbstractFieldMedicEntityPacketHandler; import com.anonymoushacker1279.immersiveweapons.entity.projectile.CustomArrowEntity.SmokeBombArrowEntityPacketHandler; import com.anonymoushacker1279.immersiveweapons.entity.projectile.SmokeBombEntity.SmokeBombEntityPacketHandler; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PostSetupHandler.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PostSetupHandler.java index c5f25c5f9..f9344d1a6 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PostSetupHandler.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PostSetupHandler.java @@ -27,7 +27,13 @@ public static void init() { // Pike Special Attributes Builder builder = ImmutableMultimap.builder(); - ImmutableMultimap newAttributes = builder.put(ForgeMod.REACH_DISTANCE.get(), new AttributeModifier(GeneralUtilities.ATTACK_REACH_MODIFIER, "Weapon modifier", 0.5d, AttributeModifier.Operation.ADDITION)).build(); + ImmutableMultimap newAttributes = + builder.put(ForgeMod.REACH_DISTANCE.get(), + new AttributeModifier(GeneralUtilities.ATTACK_REACH_MODIFIER, + "Weapon modifier", + 0.5d, + AttributeModifier.Operation.ADDITION)) + .build(); Builder combineBuilder = ImmutableMultimap.builder(); // Wood Pike Item @@ -79,7 +85,12 @@ public static void init() { // Gauntlet Special Attributes builder = ImmutableMultimap.builder(); - newAttributes = builder.put(ForgeMod.REACH_DISTANCE.get(), new AttributeModifier(GeneralUtilities.ATTACK_REACH_MODIFIER, "Weapon modifier", -2.0d, Operation.ADDITION)).build(); + newAttributes = builder.put(ForgeMod.REACH_DISTANCE.get(), + new AttributeModifier(GeneralUtilities.ATTACK_REACH_MODIFIER, + "Weapon modifier", + -2.0d, + Operation.ADDITION)) + .build(); combineBuilder = ImmutableMultimap.builder(); // Wood Gauntlet Item @@ -130,7 +141,12 @@ public static void init() { NetheriteGauntletItem.gauntletAttributes = combineBuilder.build(); // Add custom logs to be stripped in AxeItem - AxeItem.STRIPPABLES = new ImmutableMap.Builder().putAll(AxeItem.STRIPPABLES).put(DeferredRegistryHandler.BURNED_OAK_LOG.get(), DeferredRegistryHandler.STRIPPED_BURNED_OAK_LOG.get()).put(DeferredRegistryHandler.BURNED_OAK_WOOD.get(), DeferredRegistryHandler.STRIPPED_BURNED_OAK_WOOD.get()).build(); + AxeItem.STRIPPABLES = new ImmutableMap.Builder().putAll(AxeItem.STRIPPABLES) + .put(DeferredRegistryHandler.BURNED_OAK_LOG.get(), + DeferredRegistryHandler.STRIPPED_BURNED_OAK_LOG.get()) + .put(DeferredRegistryHandler.BURNED_OAK_WOOD.get(), + DeferredRegistryHandler.STRIPPED_BURNED_OAK_WOOD.get()) + .build(); // Set custom armor equip sounds, as these don't exist during the initialization of materials CustomArmorMaterials.TESLA.setEquipSound(DeferredRegistryHandler.TESLA_ARMOR_EQUIP.get()); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/ICustomRecipeType.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/CustomRecipeTypes.java similarity index 68% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/ICustomRecipeType.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/CustomRecipeTypes.java index c5c6843f4..614d60ba4 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/ICustomRecipeType.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/CustomRecipeTypes.java @@ -6,9 +6,14 @@ import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeType; -public interface ICustomRecipeType { - RecipeType SMALL_PARTS = register(ImmersiveWeapons.MOD_ID + ":small_parts"); - RecipeType TESLA_SYNTHESIZER = register(ImmersiveWeapons.MOD_ID + ":tesla_synthesizer"); +public class CustomRecipeTypes { + public static RecipeType SMALL_PARTS; + public static RecipeType TESLA_SYNTHESIZER; + + public static void init() { + SMALL_PARTS = register(ImmersiveWeapons.MOD_ID + ":small_parts"); + TESLA_SYNTHESIZER = register(ImmersiveWeapons.MOD_ID + ":tesla_synthesizer"); + } /** * Register recipe types. diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/SmallPartsRecipe.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/SmallPartsRecipe.java index 12bede9d4..b7b4a55cc 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/SmallPartsRecipe.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/SmallPartsRecipe.java @@ -129,7 +129,7 @@ public boolean isValidAdditionItem(ItemStack blueprint) { */ @Override public @NotNull RecipeType getType() { - return ICustomRecipeType.SMALL_PARTS; + return CustomRecipeTypes.SMALL_PARTS; } /** diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/TeslaSynthesizerRecipe.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/TeslaSynthesizerRecipe.java index 501ae53b5..1aafd21a0 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/TeslaSynthesizerRecipe.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/crafting/TeslaSynthesizerRecipe.java @@ -132,7 +132,7 @@ public boolean canCraftInDimensions(int width, int height) { */ @Override public @NotNull RecipeType getType() { - return ICustomRecipeType.TESLA_SYNTHESIZER; + return CustomRecipeTypes.TESLA_SYNTHESIZER; } /** diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/GeneralUtilities.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/util/GeneralUtilities.java index 1311a1632..7844a554c 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/GeneralUtilities.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/util/GeneralUtilities.java @@ -1,15 +1,10 @@ package com.anonymoushacker1279.immersiveweapons.util; -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.StainedGlassBlock; import net.minecraft.world.level.block.state.BlockBehaviour.Properties; @@ -18,8 +13,6 @@ public class GeneralUtilities { public static final UUID ATTACK_REACH_MODIFIER = UUID.fromString("9f470b49-0445-4341-ae85-55b9e5ec2a1c"); - public static final ResourceKey TILTROS = ResourceKey.create(Registry.DIMENSION_REGISTRY, new ResourceLocation(ImmersiveWeapons.MOD_ID, "tiltros")); - /** * Get a random number between a minimum and maximum. diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/TiltrosTeleporter.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/TiltrosTeleporter.java index c4d069149..97e51e876 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/TiltrosTeleporter.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/TiltrosTeleporter.java @@ -1,6 +1,6 @@ package com.anonymoushacker1279.immersiveweapons.world; -import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; +import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes.BiomesAndDimensions; import net.minecraft.BlockUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -33,8 +33,8 @@ public Optional makePortal(BlockPos pos) { @Nullable @Override public PortalInfo getPortalInfo(Entity entity, ServerLevel level, Function defaultPortalInfo) { - boolean destinationIsUG = level.dimension() == GeneralUtilities.TILTROS; - if (entity.level.dimension() != GeneralUtilities.TILTROS && !destinationIsUG) { + boolean destinationIsUG = level.dimension() == BiomesAndDimensions.TILTROS; + if (entity.level.dimension() != BiomesAndDimensions.TILTROS && !destinationIsUG) { return null; } else { WorldBorder border = level.getWorldBorder(); @@ -42,22 +42,32 @@ public PortalInfo getPortalInfo(Entity entity, ServerLevel level, Function { - BlockState blockstate = entity.level.getBlockState(entity.portalEntrancePos); + double coordinateDifference = DimensionType.getTeleportationScale(entity.level.dimensionType(), + level.dimensionType()); + + BlockPos portalPosition = new BlockPos(Mth.clamp(entity.getX() * coordinateDifference, minX, maxX), + entity.getY(), + Mth.clamp(entity.getZ() * coordinateDifference, minZ, maxZ)); + + return getOrMakePortal(portalPosition).map((result) -> { + BlockState portalEntranceState = entity.level.getBlockState(entity.portalEntrancePos); Direction.Axis axis; - Vec3 vector3d; - if (blockstate.hasProperty(BlockStateProperties.HORIZONTAL_AXIS)) { - axis = blockstate.getValue(BlockStateProperties.HORIZONTAL_AXIS); - BlockUtil.FoundRectangle rectangle = BlockUtil.getLargestRectangleAround(entity.portalEntrancePos, axis, 21, Direction.Axis.Y, 21, (pos) -> entity.level.getBlockState(pos) == blockstate); - vector3d = PortalShape.getRelativePosition(rectangle, axis, entity.position(), entity.getDimensions(entity.getPose())); + Vec3 portalShape; + if (portalEntranceState.hasProperty(BlockStateProperties.HORIZONTAL_AXIS)) { + axis = portalEntranceState.getValue(BlockStateProperties.HORIZONTAL_AXIS); + BlockUtil.FoundRectangle rectangle = BlockUtil.getLargestRectangleAround(entity.portalEntrancePos, + axis, 21, Direction.Axis.Y, 21, + (pos) -> entity.level.getBlockState(pos) == portalEntranceState); + + portalShape = PortalShape.getRelativePosition(rectangle, axis, entity.position(), + entity.getDimensions(entity.getPose())); } else { axis = Direction.Axis.X; - vector3d = new Vec3(0.5D, 0.0D, 0.0D); + portalShape = new Vec3(0.5D, 0.0D, 0.0D); } - return PortalShape.createPortalInfo(level, result, axis, vector3d, entity.getDimensions(entity.getPose()), entity.getDeltaMovement(), entity.getYRot(), entity.getXRot()); + return PortalShape.createPortalInfo(level, result, axis, portalShape, + entity.getDimensions(entity.getPose()), entity.getDeltaMovement(), entity.getYRot(), entity.getXRot()); }).orElse(null); } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/OreGeneratorHandler.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/OreGeneratorHandler.java index fe2403e51..6cae794ba 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/OreGeneratorHandler.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/OreGeneratorHandler.java @@ -1,151 +1,133 @@ package com.anonymoushacker1279.immersiveweapons.world.level.levelgen; -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import net.minecraft.data.worldgen.features.FeatureUtils; -import net.minecraft.data.worldgen.features.OreFeatures; -import net.minecraft.data.worldgen.placement.PlacementUtils; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.VerticalAnchor; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; -import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration.TargetBlockState; import net.minecraft.world.level.levelgen.placement.*; +import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; +import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; import java.util.List; public class OreGeneratorHandler { - static List targetBlockStates; - static ConfiguredFeature configuredFeature; - - public static PlacedFeature MOLTEN_ORE_FEATURE; - public static PlacedFeature NETHER_SULFUR_ORE_FEATURE; - public static PlacedFeature SULFUR_ORE_FEATURE; - public static PlacedFeature COBALT_ORE_FEATURE; - public static PlacedFeature DEEPSLATE_SULFUR_ORE_FEATURE; - public static PlacedFeature DEEPSLATE_COBALT_ORE_FEATURE; - - static final List MOLTEN_ORE_CONFIG = CommonConfig.MOLTEN_ORE_CONFIG.get(); - static final List NETHER_SULFUR_ORE_CONFIG = CommonConfig.NETHER_SULFUR_ORE_CONFIG.get(); - static final List SULFUR_ORE_CONFIG = CommonConfig.SULFUR_ORE_CONFIG.get(); - static final List COBALT_ORE_CONFIG = CommonConfig.COBALT_ORE_CONFIG.get(); - static final List DEEPSLATE_SULFUR_ORE_CONFIG = CommonConfig.DEEPSLATE_SULFUR_ORE_CONFIG.get(); - static final List DEEPSLATE_COBALT_ORE_CONFIG = CommonConfig.DEEPSLATE_COBALT_ORE_CONFIG.get(); - - /** - * Initialize ore generation setup. - */ - public static void init() { - setupMoltenOre(); - setupNetherSulfurOre(); - setupSulfurOre(); - setupCobaltOre(); - setupDeepslateCobaltOre(); - setupDeepslateSulfurOre(); - } - - public static void setupMoltenOre() { - int orePerVein = MOLTEN_ORE_CONFIG.get(0), veinsPerChunk = MOLTEN_ORE_CONFIG.get(1), maxY = MOLTEN_ORE_CONFIG.get(2); - - BlockState blockState = DeferredRegistryHandler.MOLTEN_ORE.get().defaultBlockState(); - - targetBlockStates = List.of(OreConfiguration.target(OreFeatures.NETHERRACK, blockState)); - - configuredFeature = FeatureUtils.register(ImmersiveWeapons.MOD_ID + "block/netherrack_molten_ore", - Feature.ORE.configured(new OreConfiguration(targetBlockStates, orePerVein))); - - MOLTEN_ORE_FEATURE = PlacementUtils.register(ImmersiveWeapons.MOD_ID + "ore/netherrack_molten_ore", - configuredFeature.placed(List.of(CountPlacement.of(veinsPerChunk), InSquarePlacement.spread(), - HeightRangePlacement.triangle(VerticalAnchor.bottom(), - VerticalAnchor.absolute(maxY)), - BiomeFilter.biome()))); - } - - public static void setupNetherSulfurOre() { - int orePerVein = NETHER_SULFUR_ORE_CONFIG.get(0), veinsPerChunk = NETHER_SULFUR_ORE_CONFIG.get(1); - - BlockState blockState = DeferredRegistryHandler.NETHER_SULFUR_ORE.get().defaultBlockState(); - - targetBlockStates = List.of(OreConfiguration.target(OreFeatures.NETHERRACK, blockState)); - - configuredFeature = FeatureUtils.register(ImmersiveWeapons.MOD_ID + "block/netherrack_nether_sulfur_ore", - Feature.ORE.configured(new OreConfiguration(targetBlockStates, orePerVein))); - - NETHER_SULFUR_ORE_FEATURE = PlacementUtils.register(ImmersiveWeapons.MOD_ID + "ore/netherrack_nether_sulfur_ore", - configuredFeature.placed(List.of(CountPlacement.of(veinsPerChunk), InSquarePlacement.spread(), - HeightRangePlacement.triangle(VerticalAnchor.bottom(), - VerticalAnchor.top()), - BiomeFilter.biome()))); - } - - public static void setupSulfurOre() { - int orePerVein = SULFUR_ORE_CONFIG.get(0), veinsPerChunk = SULFUR_ORE_CONFIG.get(1); - - BlockState blockState = DeferredRegistryHandler.SULFUR_ORE.get().defaultBlockState(); + public static PlacedFeature MOLTEN_ORE_BLOB_PLACEMENT; + public static PlacedFeature NETHER_SULFUR_ORE_BLOB_PLACEMENT; + public static PlacedFeature SULFUR_ORE_BLOB_PLACEMENT; + public static PlacedFeature DEEPSLATE_SULFUR_ORE_BLOB_PLACEMENT; + public static PlacedFeature COBALT_ORE_BLOB_PLACEMENT; + public static PlacedFeature DEEPSLATE_COBALT_ORE_BLOB_PLACEMENT; - targetBlockStates = List.of(OreConfiguration.target(OreFeatures.NATURAL_STONE, blockState)); - - configuredFeature = FeatureUtils.register(ImmersiveWeapons.MOD_ID + "block/stone_sulfur_ore", - Feature.ORE.configured(new OreConfiguration(targetBlockStates, orePerVein))); - - SULFUR_ORE_FEATURE = PlacementUtils.register(ImmersiveWeapons.MOD_ID + "ore/stone_sulfur_ore", - configuredFeature.placed(List.of(CountPlacement.of(veinsPerChunk), InSquarePlacement.spread(), - HeightRangePlacement.triangle(VerticalAnchor.absolute(32), - VerticalAnchor.top()), - BiomeFilter.biome()))); - } - - public static void setupCobaltOre() { - int orePerVein = COBALT_ORE_CONFIG.get(0), veinsPerChunk = COBALT_ORE_CONFIG.get(1), belowTop = COBALT_ORE_CONFIG.get(2); - - BlockState blockState = DeferredRegistryHandler.COBALT_ORE.get().defaultBlockState(); - - targetBlockStates = List.of(OreConfiguration.target(OreFeatures.NATURAL_STONE, blockState)); - - configuredFeature = FeatureUtils.register(ImmersiveWeapons.MOD_ID + "block/stone_cobalt_ore", - Feature.ORE.configured(new OreConfiguration(targetBlockStates, orePerVein))); - - COBALT_ORE_FEATURE = PlacementUtils.register(ImmersiveWeapons.MOD_ID + "ore/stone_cobalt_ore", - configuredFeature.placed(List.of(CountPlacement.of(veinsPerChunk), InSquarePlacement.spread(), - HeightRangePlacement.triangle(VerticalAnchor.absolute(7), - VerticalAnchor.belowTop(belowTop)), - BiomeFilter.biome()))); + public static void init() { + MOLTEN_ORE_BLOB_PLACEMENT = new PlacedFeature( + Holder.direct(new ConfiguredFeature<>(Feature.SCATTERED_ORE, + new OreConfiguration(OreReplacementTargets.MOLTEN_ORE_TARGETS, CommonConfig.MOLTEN_ORE_SIZE.get(), + (float) ((double) CommonConfig.MOLTEN_ORE_EXPOSED_DISCARD_CHANCE.get())))), + + List.of(HeightRangePlacement.triangle(VerticalAnchor.absolute(CommonConfig.MOLTEN_ORE_BOTTOM_ANCHOR.get()), + VerticalAnchor.absolute(CommonConfig.MOLTEN_ORE_TOP_ANCHOR.get())), + BiomeFilter.biome(), + InSquarePlacement.spread(), + CountPlacement.of(CommonConfig.MOLTEN_ORE_WEIGHT.get()) + )); + NETHER_SULFUR_ORE_BLOB_PLACEMENT = new PlacedFeature( + Holder.direct(new ConfiguredFeature<>(Feature.ORE, + new OreConfiguration(OreReplacementTargets.SULFUR_ORE_TARGETS, CommonConfig.NETHER_SULFUR_ORE_SIZE.get(), + (float) ((double) CommonConfig.NETHER_SULFUR_ORE_EXPOSED_DISCARD_CHANCE.get())))), + + List.of(HeightRangePlacement.uniform(VerticalAnchor.absolute(CommonConfig.NETHER_SULFUR_ORE_BOTTOM_ANCHOR.get()), + VerticalAnchor.absolute(CommonConfig.NETHER_SULFUR_ORE_TOP_ANCHOR.get())), + BiomeFilter.biome(), + InSquarePlacement.spread(), + CountPlacement.of(CommonConfig.NETHER_SULFUR_ORE_WEIGHT.get()) + )); + SULFUR_ORE_BLOB_PLACEMENT = new PlacedFeature( + Holder.direct(new ConfiguredFeature<>(Feature.ORE, + new OreConfiguration(OreReplacementTargets.SULFUR_ORE_TARGETS, CommonConfig.SULFUR_ORE_SIZE.get(), + (float) ((double) CommonConfig.SULFUR_ORE_EXPOSED_DISCARD_CHANCE.get())))), + + List.of(HeightRangePlacement.uniform(VerticalAnchor.absolute(CommonConfig.SULFUR_ORE_BOTTOM_ANCHOR.get()), + VerticalAnchor.absolute(CommonConfig.SULFUR_ORE_TOP_ANCHOR.get())), + InSquarePlacement.spread(), + BiomeFilter.biome(), + CountPlacement.of(CommonConfig.SULFUR_ORE_WEIGHT.get()) + )); + DEEPSLATE_SULFUR_ORE_BLOB_PLACEMENT = new PlacedFeature( + Holder.direct(new ConfiguredFeature<>(Feature.ORE, + new OreConfiguration(OreReplacementTargets.SULFUR_ORE_TARGETS, CommonConfig.DEEPSLATE_SULFUR_ORE_SIZE.get(), + (float) ((double) CommonConfig.DEEPSLATE_SULFUR_ORE_EXPOSED_DISCARD_CHANCE.get())))), + + List.of(HeightRangePlacement.uniform(VerticalAnchor.absolute(CommonConfig.DEEPSLATE_SULFUR_ORE_BOTTOM_ANCHOR.get()), + VerticalAnchor.absolute(CommonConfig.DEEPSLATE_SULFUR_ORE_TOP_ANCHOR.get())), + InSquarePlacement.spread(), + BiomeFilter.biome(), + CountPlacement.of(CommonConfig.DEEPSLATE_SULFUR_ORE_WEIGHT.get()) + )); + COBALT_ORE_BLOB_PLACEMENT = new PlacedFeature( + Holder.direct(new ConfiguredFeature<>(Feature.ORE, + new OreConfiguration(OreReplacementTargets.COBALT_ORE_TARGETS, CommonConfig.COBALT_ORE_SIZE.get(), + (float) ((double) CommonConfig.COBALT_ORE_EXPOSED_DISCARD_CHANCE.get())))), + + List.of(HeightRangePlacement.triangle(VerticalAnchor.absolute(CommonConfig.COBALT_ORE_BOTTOM_ANCHOR.get()), + VerticalAnchor.absolute(CommonConfig.COBALT_ORE_TOP_ANCHOR.get())), + InSquarePlacement.spread(), + BiomeFilter.biome(), + CountPlacement.of(CommonConfig.COBALT_ORE_WEIGHT.get()) + )); + DEEPSLATE_COBALT_ORE_BLOB_PLACEMENT = new PlacedFeature( + Holder.direct(new ConfiguredFeature<>(Feature.ORE, + new OreConfiguration(OreReplacementTargets.COBALT_ORE_TARGETS, CommonConfig.DEEPSLATE_COBALT_ORE_SIZE.get(), + (float) ((double) CommonConfig.DEEPSLATE_COBALT_ORE_EXPOSED_DISCARD_CHANCE.get())))), + + List.of(HeightRangePlacement.uniform(VerticalAnchor.absolute(CommonConfig.DEEPSLATE_COBALT_ORE_BOTTOM_ANCHOR.get()), + VerticalAnchor.absolute(CommonConfig.DEEPSLATE_COBALT_ORE_TOP_ANCHOR.get())), + InSquarePlacement.spread(), + BiomeFilter.biome(), + CountPlacement.of(CommonConfig.DEEPSLATE_COBALT_ORE_WEIGHT.get()) + )); } - public static void setupDeepslateSulfurOre() { - int orePerVein = DEEPSLATE_SULFUR_ORE_CONFIG.get(0), veinsPerChunk = DEEPSLATE_SULFUR_ORE_CONFIG.get(1); - - BlockState blockState = DeferredRegistryHandler.DEEPSLATE_SULFUR_ORE.get().defaultBlockState(); - - targetBlockStates = List.of(OreConfiguration.target(OreFeatures.NATURAL_STONE, blockState)); - - configuredFeature = FeatureUtils.register(ImmersiveWeapons.MOD_ID + "block/deepslate_sulfur_ore", - Feature.ORE.configured(new OreConfiguration(targetBlockStates, orePerVein))); - - DEEPSLATE_SULFUR_ORE_FEATURE = PlacementUtils.register(ImmersiveWeapons.MOD_ID + "ore/deepslate_sulfur_ore", - configuredFeature.placed(List.of(CountPlacement.of(veinsPerChunk), InSquarePlacement.spread(), - HeightRangePlacement.triangle(VerticalAnchor.bottom(), - VerticalAnchor.absolute(7)), - BiomeFilter.biome()))); + public static class OreReplacementTargets { + public static final List MOLTEN_ORE_TARGETS = List.of( + OreConfiguration.target(ReplacementRules.NETHER_STONE, + DeferredRegistryHandler.MOLTEN_ORE.get().defaultBlockState()) + ); + public static final List SULFUR_ORE_TARGETS = List.of( + OreConfiguration.target(ReplacementRules.REGULAR_STONE, + DeferredRegistryHandler.SULFUR_ORE.get().defaultBlockState()), + + OreConfiguration.target(ReplacementRules.DEEPSLATE_STONE, + DeferredRegistryHandler.DEEPSLATE_SULFUR_ORE.get().defaultBlockState()), + + OreConfiguration.target(ReplacementRules.NETHER_STONE, + DeferredRegistryHandler.NETHER_SULFUR_ORE.get().defaultBlockState()) + ); + public static final List COBALT_ORE_TARGETS = List.of( + OreConfiguration.target(ReplacementRules.REGULAR_STONE, + DeferredRegistryHandler.COBALT_ORE.get().defaultBlockState()), + OreConfiguration.target(ReplacementRules.DEEPSLATE_STONE, + DeferredRegistryHandler.DEEPSLATE_COBALT_ORE.get().defaultBlockState()) + ); } - public static void setupDeepslateCobaltOre() { - int orePerVein = DEEPSLATE_COBALT_ORE_CONFIG.get(0), veinsPerChunk = DEEPSLATE_COBALT_ORE_CONFIG.get(1); - - BlockState blockState = DeferredRegistryHandler.DEEPSLATE_COBALT_ORE.get().defaultBlockState(); - - targetBlockStates = List.of(OreConfiguration.target(OreFeatures.NATURAL_STONE, blockState)); + public static final class ReplacementRules { + public static final RuleTest REGULAR_STONE = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); + public static final RuleTest DEEPSLATE_STONE = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); - configuredFeature = FeatureUtils.register(ImmersiveWeapons.MOD_ID + "block/deepslate_cobalt_ore", - Feature.ORE.configured(new OreConfiguration(targetBlockStates, orePerVein))); + public static final RuleTest NETHER_STONE = createRuleFromTag("forge:ore_bearing_ground/netherrack"); - DEEPSLATE_COBALT_ORE_FEATURE = PlacementUtils.register(ImmersiveWeapons.MOD_ID + "ore/deepslate_cobalt_ore", - configuredFeature.placed(List.of(CountPlacement.of(veinsPerChunk), InSquarePlacement.spread(), - HeightRangePlacement.triangle(VerticalAnchor.bottom(), - VerticalAnchor.absolute(7)), - BiomeFilter.biome()))); + public static RuleTest createRuleFromTag(String tagLocation) { + TagKey blockTag = TagKey.create(Registry.BLOCK_REGISTRY, new ResourceLocation(tagLocation)); + return new TagMatchTest(blockTag); + } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/Structures.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/Structures.java deleted file mode 100644 index de850b9ab..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/Structures.java +++ /dev/null @@ -1,329 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.world.level.levelgen; - -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; -import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.google.common.collect.*; -import net.minecraft.core.Registry; -import net.minecraft.data.BuiltinRegistries; -import net.minecraft.data.worldgen.PlainVillagePools; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biome.BiomeCategory; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.FlatLevelSource; -import net.minecraft.world.level.levelgen.StructureSettings; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.configurations.StructureFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraftforge.event.world.WorldEvent; - -import java.util.*; -import java.util.Map.Entry; - -public class Structures { - - /** - * Static instances of structures that can be referenced and added to biomes easily. - * I cannot get my own pool here during initialization, so I use PlainVillagePools.START. - * I'll modify this pool at runtime later in #createPiecesGenerator - */ - public static final ConfiguredStructureFeature CONFIGURED_ABANDONED_FACTORY = DeferredRegistryHandler.ABANDONED_FACTORY_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - public static final ConfiguredStructureFeature CONFIGURED_BEAR_TRAP = DeferredRegistryHandler.BEAR_TRAP_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - public static final ConfiguredStructureFeature CONFIGURED_CAMPSITE = DeferredRegistryHandler.CAMPSITE_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - public static final ConfiguredStructureFeature CONFIGURED_CLOUD_ISLAND = DeferredRegistryHandler.CLOUD_ISLAND_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - public static final ConfiguredStructureFeature CONFIGURED_LANDMINE_TRAP = DeferredRegistryHandler.LANDMINE_TRAP_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - public static final ConfiguredStructureFeature CONFIGURED_OUTHOUSE = DeferredRegistryHandler.OUTHOUSE_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - public static final ConfiguredStructureFeature CONFIGURED_PITFALL_TRAP = DeferredRegistryHandler.PITFALL_TRAP_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - public static final ConfiguredStructureFeature CONFIGURED_UNDERGROUND_BUNKER = DeferredRegistryHandler.UNDERGROUND_BUNKER_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - public static final ConfiguredStructureFeature CONFIGURED_WATER_TOWER = DeferredRegistryHandler.WATER_TOWER_STRUCTURE.get() - .configured(new JigsawConfiguration(() -> PlainVillagePools.START, 0)); - - - /** - * Registers the configured structure, which is what gets added to biomes. - * I'm not using a Forge registry because there are none for configured structures. - */ - public static void registerConfiguredStructures() { - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "abandoned_factory"), CONFIGURED_ABANDONED_FACTORY); - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "bear_trap"), CONFIGURED_BEAR_TRAP); - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "campsite"), CONFIGURED_CAMPSITE); - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "cloud_island"), CONFIGURED_CLOUD_ISLAND); - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "landmine_trap"), CONFIGURED_LANDMINE_TRAP); - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "outhouse"), CONFIGURED_OUTHOUSE); - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "pitfall_trap"), CONFIGURED_PITFALL_TRAP); - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "underground_bunker"), CONFIGURED_UNDERGROUND_BUNKER); - Registry.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, new ResourceLocation(ImmersiveWeapons.MOD_ID, - "water_tower"), CONFIGURED_WATER_TOWER); - } - - /** - * Set the rarity of structures and determine if land conforms to it. - */ - public static void setupStructures() { - setupStructure( - DeferredRegistryHandler.ABANDONED_FACTORY_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_ABANDONED_FACTORY_DISTANCE.get(), - CommonConfig.MIN_ABANDONED_FACTORY_DISTANCE.get(), - 959874384), - true); - setupStructure( - DeferredRegistryHandler.BEAR_TRAP_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_BEAR_TRAP_DISTANCE.get(), - CommonConfig.MIN_BEAR_TRAP_DISTANCE.get(), - 794532168), - false); - setupStructure( - DeferredRegistryHandler.CAMPSITE_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_CAMPSITE_DISTANCE.get(), - CommonConfig.MIN_CAMPSITE_DISTANCE.get(), - 671249835), - true); - setupStructure( - DeferredRegistryHandler.CLOUD_ISLAND_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_CLOUD_ISLAND_DISTANCE.get(), - CommonConfig.MIN_CLOUD_ISLAND_DISTANCE.get(), - 349821657), - false); - setupStructure( - DeferredRegistryHandler.LANDMINE_TRAP_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_LANDMINE_TRAP_DISTANCE.get(), - CommonConfig.MIN_LANDMINE_TRAP_DISTANCE.get(), - 959874384), - true); - setupStructure( - DeferredRegistryHandler.OUTHOUSE_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_OUTHOUSE_DISTANCE.get(), - CommonConfig.MIN_OUTHOUSE_DISTANCE.get(), - 845721365), - false); - setupStructure( - DeferredRegistryHandler.PITFALL_TRAP_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_PITFALL_TRAP_DISTANCE.get(), - CommonConfig.MIN_PITFALL_TRAP_DISTANCE.get(), - 875412395), - false); - setupStructure( - DeferredRegistryHandler.UNDERGROUND_BUNKER_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_UNDERGROUND_BUNKER_DISTANCE.get(), - CommonConfig.MIN_UNDERGROUND_BUNKER_DISTANCE.get(), - 548796135), - false); - setupStructure( - DeferredRegistryHandler.WATER_TOWER_STRUCTURE.get(), - new StructureFeatureConfiguration( - CommonConfig.MAX_WATER_TOWER_DISTANCE.get(), - CommonConfig.MIN_WATER_TOWER_DISTANCE.get(), - 246975135), - true); - } - - /** - * Adds the provided structure to the registry, and adds separation settings. - * The rarity of the structure is determined based on the values passed into - * this method in the StructureFeatureConfiguration argument. - *

- * This method is called by #setupStructures. - */ - private static > void setupStructure( - F structure, - StructureFeatureConfiguration structureFeatureConfiguration, - boolean transformSurroundingLand) { - // Add our own structure into the structure feature map. Otherwise, you get errors - StructureFeature.STRUCTURES_REGISTRY.put(Objects.requireNonNull(structure.getRegistryName()).toString(), structure); - - // Adapt the surrounding land to the bottom of our structure - if (transformSurroundingLand) { - StructureFeature.NOISE_AFFECTING_FEATURES = - ImmutableList.> builder() - .addAll(StructureFeature.NOISE_AFFECTING_FEATURES) - .add(structure) - .build(); - } - - // This is the map that holds the default spacing of all structures - StructureSettings.DEFAULTS = - ImmutableMap., StructureFeatureConfiguration> builder() - .putAll(StructureSettings.DEFAULTS) - .put(structure, structureFeatureConfiguration) - .build(); - - - // Add the structure to all the noise generator settings - BuiltinRegistries.NOISE_GENERATOR_SETTINGS.entrySet().forEach(settings -> { - Map, StructureFeatureConfiguration> structureMap = settings.getValue() - .structureSettings().structureConfig(); - - // Be careful with mods that make the structure map immutable (like datapacks do) - if (structureMap instanceof ImmutableMap) { - Map, StructureFeatureConfiguration> tempMap = new HashMap<>(structureMap); - tempMap.put(structure, structureFeatureConfiguration); - settings.getValue().structureSettings().structureConfig = tempMap; - } else { - structureMap.put(structure, structureFeatureConfiguration); - } - }); - } - - /** - * Tells the chunk generator which biomes my structures can spawn in. - * It will go into the world's chunk generator where I manually add structure spacing. - * If the spacing is not added, the structure doesn't spawn. - *

- * It also functions as a dimension blacklist for structures. - */ - public static void addDimensionalSpacing(WorldEvent.Load event) { - if (event.getWorld() instanceof ServerLevel serverLevel) { - ChunkGenerator chunkGenerator = serverLevel.getChunkSource().getGenerator(); - // Skip superflat generators to prevent issues. - // Additionally, users don't want structures clogging up their superflat worlds. - if (chunkGenerator instanceof FlatLevelSource && serverLevel.dimension().equals(Level.OVERWORLD)) { - return; - } - - StructureSettings worldStructureConfig = chunkGenerator.getSettings(); - - /* - * NOTE: BiomeLoadingEvent does not work with structures anymore. - * Instead, I will use the below to add my structures to biomes. - * This is temporary until Forge finds a better solution for adding structures to biomes. - * TODO: Replace with better solution, as BiomeLoadingEvent doesn't work with structures - */ - - // Create a mutable map, which biomes will be added to for now - HashMap, HashMultimap, ResourceKey>> - structureToMultiMap = new HashMap<>(1); - - // Add the resource key of all biomes that the configured structures can spawn in. - for (Map.Entry, Biome> biomeEntry : - serverLevel.registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).entrySet()) { - - BiomeCategory category = biomeEntry.getValue().getBiomeCategory(); - // Add structures to biomes here - if (category == BiomeCategory.FOREST) { - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_ABANDONED_FACTORY, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_BEAR_TRAP, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_OUTHOUSE, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_UNDERGROUND_BUNKER, biomeEntry.getKey()); - } - if (category == BiomeCategory.PLAINS) { - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_ABANDONED_FACTORY, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_BEAR_TRAP, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_CAMPSITE, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_OUTHOUSE, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_UNDERGROUND_BUNKER, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_WATER_TOWER, biomeEntry.getKey()); - } - if (category == BiomeCategory.DESERT) { - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_CAMPSITE, biomeEntry.getKey()); - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_LANDMINE_TRAP, biomeEntry.getKey()); - } - if (category == BiomeCategory.TAIGA) { - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_CLOUD_ISLAND, biomeEntry.getKey()); - } - if (category == BiomeCategory.JUNGLE) { - associateBiomeToConfiguredStructure(structureToMultiMap, CONFIGURED_PITFALL_TRAP, biomeEntry.getKey()); - } - } - - // Grab the map that holds what ConfigureStructures a structure has and what biomes it can spawn in. - ImmutableMap.Builder, ImmutableMultimap, - ResourceKey>> tempStructureToMultiMap = ImmutableMap.builder(); - - worldStructureConfig.configuredStructures.entrySet() - .stream() - .filter(entry -> !structureToMultiMap.containsKey(entry.getKey())) - .forEach(tempStructureToMultiMap::put); - - // Add our structures to the structure map/multimap and set the world to use this combined map/multimap. - structureToMultiMap.forEach((key, value) -> tempStructureToMultiMap.put(key, ImmutableMultimap.copyOf(value))); - - worldStructureConfig.configuredStructures = tempStructureToMultiMap.build(); - } - } - - /** - * Helper method that handles setting up the map to multimap relationship to help prevent issues. - */ - private static void associateBiomeToConfiguredStructure(Map, HashMultimap, - ResourceKey>> structureToMultimap, ConfiguredStructureFeature configuredStructureFeature, - ResourceKey biomeRegistryKey) { - - structureToMultimap.putIfAbsent(configuredStructureFeature.feature, HashMultimap.create()); - HashMultimap, ResourceKey> configuredStructureToBiomeMultiMap = - structureToMultimap.get(configuredStructureFeature.feature); - - if (configuredStructureToBiomeMultiMap.containsValue(biomeRegistryKey)) { - Optional, ResourceKey>> keyEntry = - configuredStructureToBiomeMultiMap.entries() - .stream() - .filter(e -> e.getValue() == biomeRegistryKey) - .findFirst(); - - int keyID = 0; // This should always be set below, but the IDE throws a fit if I call all this directly in the logger - if (keyEntry.isPresent()) { - keyID = BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getId(keyEntry.get().getKey()); - } - - ImmersiveWeapons.LOGGER.error(""" - Detected 2 ConfiguredStructureFeatures that share the same base StructureFeature trying to be added to same biome. One will be prevented from spawning. - The two conflicting ConfiguredStructures are: {}, {} - The biome that is attempting to be shared: {} - """, - BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getId(configuredStructureFeature), - keyID, - biomeRegistryKey - ); - } else { - configuredStructureToBiomeMultiMap.put(configuredStructureFeature, biomeRegistryKey); - } - } - - /** - * Create a copy of a piece generator context with another config. This is used by the structures. - */ - public static PieceGeneratorSupplier.Context - createContextWithConfig(PieceGeneratorSupplier.Context context, JigsawConfiguration newConfig) { - - return new PieceGeneratorSupplier.Context<>( - context.chunkGenerator(), - context.biomeSource(), - context.seed(), - context.chunkPos(), - newConfig, - context.heightAccessor(), - context.validBiome(), - context.structureManager(), - context.registryAccess() - ); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/BiomesAndDimensions.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/BiomesAndDimensions.java new file mode 100644 index 000000000..1066e8c02 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/BiomesAndDimensions.java @@ -0,0 +1,20 @@ +package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes; + +import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; + +public class BiomesAndDimensions { + + public static final ResourceKey BATTLEFIELD = register("battlefield"); + + public static final ResourceKey TILTROS = ResourceKey.create(Registry.DIMENSION_REGISTRY, + new ResourceLocation(ImmersiveWeapons.MOD_ID, "tiltros")); + + private static ResourceKey register(String name) { + return ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(ImmersiveWeapons.MOD_ID, name)); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/IWOverworldBiomesProvider.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/IWOverworldBiomesProvider.java new file mode 100644 index 000000000..650d0f76a --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/IWOverworldBiomesProvider.java @@ -0,0 +1,33 @@ +package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Climate.ParameterPoint; +import terrablender.api.ParameterUtils.*; +import terrablender.api.Region; +import terrablender.api.RegionType; + +import java.util.function.Consumer; + +public class IWOverworldBiomesProvider extends Region { + + public IWOverworldBiomesProvider(ResourceLocation name, RegionType type, int weight) { + super(name, type, weight); + } + + @Override + public void addBiomes(Registry registry, Consumer>> mapper) { + addBiome(mapper, + Temperature.WARM.parameter(), + Humidity.span(Humidity.ARID, Humidity.NEUTRAL), + Continentalness.span(Continentalness.NEAR_INLAND, Continentalness.FAR_INLAND), + Erosion.span(Erosion.EROSION_0, Erosion.EROSION_1), + Weirdness.span(Weirdness.MID_SLICE_VARIANT_ASCENDING, Weirdness.MID_SLICE_VARIANT_DESCENDING), + Depth.SURFACE.parameter(), + 0.5f, + BiomesAndDimensions.BATTLEFIELD); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/SurfaceRuleData.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/SurfaceRuleData.java new file mode 100644 index 000000000..d5c410045 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/biomes/SurfaceRuleData.java @@ -0,0 +1,28 @@ +package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.biomes; + +import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.surface.SurfaceRuleBuilder; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; +import net.minecraft.world.level.levelgen.VerticalAnchor; + +public class SurfaceRuleData { + + public static SurfaceRules.RuleSource makeRules() { + + RuleSource battlefield = SurfaceRuleBuilder.start() + .biome(BiomesAndDimensions.BATTLEFIELD) + .surface(Blocks.GRASS_BLOCK.defaultBlockState()) + .subsurface(Blocks.COARSE_DIRT.defaultBlockState(), 3) + .filler(Blocks.STONE.defaultBlockState()) + .rule(3, SurfaceRules.ifTrue(SurfaceRules.verticalGradient("deepslate", + VerticalAnchor.absolute(0), + VerticalAnchor.absolute(8)), + SurfaceRules.state(Blocks.DEEPSLATE.defaultBlockState()))) + .build(); + + return SurfaceRules.sequence( + SurfaceRules.ifTrue(SurfaceRules.isBiome(BiomesAndDimensions.BATTLEFIELD), battlefield) + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/feature/treedecorators/BurnedBranchDecorator.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/feature/treedecorators/BurnedBranchDecorator.java index a2fa2225d..303e7413b 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/feature/treedecorators/BurnedBranchDecorator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/feature/treedecorators/BurnedBranchDecorator.java @@ -18,7 +18,8 @@ public class BurnedBranchDecorator extends TreeDecorator { - public static final Codec CODEC = Codec.floatRange(0.0F, 1.0F).fieldOf("probability").xmap(BurnedBranchDecorator::new, (decorator) -> decorator.probability).codec(); + public static final Codec CODEC = Codec.floatRange(0.0F, 1.0F).fieldOf("probability") + .xmap(BurnedBranchDecorator::new, (decorator) -> decorator.probability).codec(); private final float probability; public BurnedBranchDecorator(float chance) { @@ -31,16 +32,19 @@ public BurnedBranchDecorator(float chance) { } @Override - public void place(@NotNull LevelSimulatedReader simulatedReader, @NotNull BiConsumer biConsumer, Random random, @NotNull List pos, @NotNull List posList) { - if (!(random.nextFloat() >= probability)) { - int i = pos.get(0).getY(); - pos.stream().filter((blockPos) -> blockPos.getY() - i <= 8).forEach((blockPos) -> { + public void place(@NotNull LevelSimulatedReader simulatedReader, @NotNull BiConsumer biConsumer, + Random random, @NotNull List pos, @NotNull List posList) { + + if (random.nextFloat() <= probability) { + pos.forEach((blockPos) -> { for (Direction direction : Direction.Plane.HORIZONTAL) { - if (random.nextFloat() <= 0.25F) { - Direction direction1 = direction.getOpposite(); - BlockPos blockpos = blockPos.offset(direction1.getStepX(), 0, direction1.getStepZ()); - if (Feature.isAir(simulatedReader, blockpos)) { - biConsumer.accept(blockpos, DeferredRegistryHandler.BURNED_OAK_BRANCH.get().defaultBlockState().setValue(BranchBlock.FACING, direction)); + if (random.nextFloat() <= 0.25f) { + Direction oppositeDirection = direction.getOpposite(); + BlockPos position = blockPos.offset(oppositeDirection.getStepX(), 0, oppositeDirection.getStepZ()); + + if (Feature.isAir(simulatedReader, position)) { + biConsumer.accept(position, DeferredRegistryHandler.BURNED_OAK_BRANCH.get().defaultBlockState() + .setValue(BranchBlock.FACING, direction)); } } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/AbandonedFactoryStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/AbandonedFactoryStructure.java deleted file mode 100644 index 0d0ab3698..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/AbandonedFactoryStructure.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; - -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; -import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; -import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -public class AbandonedFactoryStructure extends StructureFeature { - - public AbandonedFactoryStructure() { - super(JigsawConfiguration.CODEC, context -> { - if (!isFeatureChunk(context)) { - return Optional.empty(); - } else { - return createPiecesGenerator(context); - } - }, PostPlacementProcessor.NONE); - } - - @Override - public GenerationStep.@NotNull Decoration step() { - return GenerationStep.Decoration.SURFACE_STRUCTURES; - } - - // Test if the current chunk (from context) has a valid location for the structure - private static boolean isFeatureChunk(PieceGeneratorSupplier.Context context) { - BlockPos blockPos = context.chunkPos().getWorldPosition(); - - // Get height of land (stops at first non-air block) - int landHeight = context.chunkGenerator().getFirstOccupiedHeight(blockPos.getX(), blockPos.getZ(), Heightmap.Types.WORLD_SURFACE_WG, context.heightAccessor()); - - // Grabs the column of blocks at given position. - NoiseColumn columnOfBlocks = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), context.heightAccessor()); - - // Combine the column of blocks with land height, and get the top block itself which can be tested. - BlockState topBlock = columnOfBlocks.getBlock(landHeight); - - // Now test to make sure the structure is not spawning on water or other fluids. - return topBlock.getFluidState().isEmpty(); - } - - private static Optional> createPiecesGenerator(PieceGeneratorSupplier.Context context) { - // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) - BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); - - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "abandoned_factory/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks - ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos, false, true); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/BearTrapStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/BearTrapStructure.java deleted file mode 100644 index d20fc79e5..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/BearTrapStructure.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; - -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; -import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; -import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -public class BearTrapStructure extends StructureFeature { - - public BearTrapStructure() { - super(JigsawConfiguration.CODEC, context -> { - if (!isFeatureChunk(context)) { - return Optional.empty(); - } else { - return createPiecesGenerator(context); - } - }, PostPlacementProcessor.NONE); - } - - @Override - public GenerationStep.@NotNull Decoration step() { - return GenerationStep.Decoration.SURFACE_STRUCTURES; - } - - // Test if the current chunk (from context) has a valid location for the structure - private static boolean isFeatureChunk(PieceGeneratorSupplier.Context context) { - BlockPos blockPos = context.chunkPos().getWorldPosition(); - - // Get height of land (stops at first non-air block) - int landHeight = context.chunkGenerator().getFirstOccupiedHeight(blockPos.getX(), blockPos.getZ(), Heightmap.Types.WORLD_SURFACE_WG, context.heightAccessor()); - - // Grabs the column of blocks at given position. - NoiseColumn columnOfBlocks = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), context.heightAccessor()); - - // Combine the column of blocks with land height, and get the top block itself which can be tested. - BlockState topBlock = columnOfBlocks.getBlock(landHeight); - - // Now test to make sure the structure is not spawning on water or other fluids. - return topBlock.getFluidState().isEmpty(); - } - - private static Optional> createPiecesGenerator(PieceGeneratorSupplier.Context context) { - // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) - BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); - - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "bear_trap/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks - ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos, false, true); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/CloudIslandStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/CloudIslandStructure.java index d8984bf29..df002ebd5 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/CloudIslandStructure.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/CloudIslandStructure.java @@ -1,28 +1,25 @@ package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.NoiseColumn; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; +import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; import org.jetbrains.annotations.NotNull; import java.util.Optional; public class CloudIslandStructure extends StructureFeature { + static int landHeight; + public CloudIslandStructure() { super(JigsawConfiguration.CODEC, context -> { if (!isFeatureChunk(context)) { @@ -43,10 +40,12 @@ private static boolean isFeatureChunk(PieceGeneratorSupplier.Context> createPiecesGenerator(PieceGeneratorSupplier.Context context) { + private static Optional> createPiecesGenerator( + PieceGeneratorSupplier.Context context) { + // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) - BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); + BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(landHeight); - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "cloud_island/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks + /* Generate pieces of the structure. + Second-to-last boolean is only for structure intersections. + Last boolean means the structure will automatically be placed at ground level. + */ + return JigsawPlacement.addPieces( + context, + PoolElementStructurePiece::new, + blockPos.above(48), + false, + false ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos.atY(63), false, true); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/CampsiteStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/DestroyedHouse.java similarity index 54% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/CampsiteStructure.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/DestroyedHouse.java index ad98a5790..2b54b8259 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/CampsiteStructure.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/DestroyedHouse.java @@ -1,29 +1,26 @@ package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.NoiseColumn; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; +import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; import org.jetbrains.annotations.NotNull; import java.util.Optional; -public class CampsiteStructure extends StructureFeature { +public class DestroyedHouse extends StructureFeature { - public CampsiteStructure() { + static int landHeight; + + public DestroyedHouse() { super(JigsawConfiguration.CODEC, context -> { if (!isFeatureChunk(context)) { return Optional.empty(); @@ -43,34 +40,37 @@ private static boolean isFeatureChunk(PieceGeneratorSupplier.Context> createPiecesGenerator(PieceGeneratorSupplier.Context context) { + private static Optional> createPiecesGenerator( + PieceGeneratorSupplier.Context context) { + // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "campsite/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks + /* Generate pieces of the structure. + Second-to-last boolean is only for structure intersections. + Last boolean means the structure will automatically be placed at ground level. + */ + return JigsawPlacement.addPieces( + context, + PoolElementStructurePiece::new, + blockPos.atY(landHeight), + false, + false ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos, false, true); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/HansHut.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/HansHut.java new file mode 100644 index 000000000..319e5183a --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/HansHut.java @@ -0,0 +1,94 @@ +package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.levelgen.*; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; +import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; +import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class HansHut extends StructureFeature { + + public HansHut() { + super(JigsawConfiguration.CODEC, HansHut::createPiecesGenerator, PostPlacementProcessor.NONE); + } + + @Override + public GenerationStep.@NotNull Decoration step() { + return Decoration.UNDERGROUND_STRUCTURES; + } + + private static @NotNull Optional> createPiecesGenerator(PieceGeneratorSupplier.Context context) { + // Check if the height is suitable + if (context.heightAccessor().getMinBuildHeight() + 3 > -10) { + return Optional.empty(); + } + + // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) + BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); + + // Get a block position underground + blockPos = findSuitableSpot(context, blockPos); + + // Don't generate if the position is in a fluid + NoiseColumn columnOfBlocks = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), context.heightAccessor()); + if (!columnOfBlocks.getBlock(blockPos.getY()).getFluidState().isEmpty()) { + return Optional.empty(); + } + + /* Generate pieces of the structure. + Second-to-last boolean is only for structure intersections. + Last boolean means the structure will automatically be placed at ground level. + */ + return JigsawPlacement.addPieces( + context, + PoolElementStructurePiece::new, + blockPos, + false, + false + ); + } + + @NotNull + private static BlockPos findSuitableSpot(PieceGeneratorSupplier.Context context, BlockPos blockPos) { + LevelHeightAccessor heightAccessor = context.heightAccessor(); + + // Create a random generator that depends on the current chunk location. That way if the world is recreated + // with the same seed the feature will end up at the same spot + WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(context.seed())); + worldgenRandom.setLargeFeatureSeed(context.seed(), context.chunkPos().x, context.chunkPos().z); + + // Pick a random y location between a low and a high point + int height = worldgenRandom.nextIntBetweenInclusive(heightAccessor.getMinBuildHeight() + 3, + -10); + + // Go down until I find a spot that has air. Then go down until I find a spot that is solid again + NoiseColumn baseColumn = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), heightAccessor); + int tempHeight = height; // Remember the original Y height because I'll just use this if I can't find an air bubble + int lowerLimit = heightAccessor.getMinBuildHeight() + 3; // Lower limit, don't go below this + while (tempHeight > lowerLimit && !baseColumn.getBlock(tempHeight).isAir()) { + tempHeight--; + } + // If I found air, I'll go down until I find a non-air block + if (tempHeight > lowerLimit) { + while (tempHeight > lowerLimit && baseColumn.getBlock(tempHeight).isAir()) { + tempHeight--; + } + if (tempHeight > lowerLimit) { + // Found a possible spawn spot + height = tempHeight + 1; + } + } + + return blockPos.atY(height); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/LandmineTrapStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/LandmineTrapStructure.java deleted file mode 100644 index 34626139f..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/LandmineTrapStructure.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; - -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; -import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; -import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -public class LandmineTrapStructure extends StructureFeature { - - public LandmineTrapStructure() { - super(JigsawConfiguration.CODEC, context -> { - if (!isFeatureChunk(context)) { - return Optional.empty(); - } else { - return createPiecesGenerator(context); - } - }, PostPlacementProcessor.NONE); - } - - @Override - public GenerationStep.@NotNull Decoration step() { - return GenerationStep.Decoration.SURFACE_STRUCTURES; - } - - // Test if the current chunk (from context) has a valid location for the structure - private static boolean isFeatureChunk(PieceGeneratorSupplier.Context context) { - BlockPos blockPos = context.chunkPos().getWorldPosition(); - - // Get height of land (stops at first non-air block) - int landHeight = context.chunkGenerator().getFirstOccupiedHeight(blockPos.getX(), blockPos.getZ(), Heightmap.Types.WORLD_SURFACE_WG, context.heightAccessor()); - - // Grabs the column of blocks at given position. - NoiseColumn columnOfBlocks = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), context.heightAccessor()); - - // Combine the column of blocks with land height, and get the top block itself which can be tested. - BlockState topBlock = columnOfBlocks.getBlock(landHeight); - - // Now test to make sure the structure is not spawning on water or other fluids. - return topBlock.getFluidState().isEmpty(); - } - - private static Optional> createPiecesGenerator(PieceGeneratorSupplier.Context context) { - // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) - BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); - - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "landmine_trap/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks - ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos, false, true); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/OuthouseStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/OuthouseStructure.java deleted file mode 100644 index 3c4841914..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/OuthouseStructure.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; - -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; -import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; -import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -public class OuthouseStructure extends StructureFeature { - - public OuthouseStructure() { - super(JigsawConfiguration.CODEC, context -> { - if (!isFeatureChunk(context)) { - return Optional.empty(); - } else { - return createPiecesGenerator(context); - } - }, PostPlacementProcessor.NONE); - } - - @Override - public GenerationStep.@NotNull Decoration step() { - return GenerationStep.Decoration.SURFACE_STRUCTURES; - } - - // Test if the current chunk (from context) has a valid location for the structure - private static boolean isFeatureChunk(PieceGeneratorSupplier.Context context) { - BlockPos blockPos = context.chunkPos().getWorldPosition(); - - // Get height of land (stops at first non-air block) - int landHeight = context.chunkGenerator().getFirstOccupiedHeight(blockPos.getX(), blockPos.getZ(), Heightmap.Types.WORLD_SURFACE_WG, context.heightAccessor()); - - // Grabs the column of blocks at given position. - NoiseColumn columnOfBlocks = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), context.heightAccessor()); - - // Combine the column of blocks with land height, and get the top block itself which can be tested. - BlockState topBlock = columnOfBlocks.getBlock(landHeight); - - // Now test to make sure the structure is not spawning on water or other fluids. - return topBlock.getFluidState().isEmpty(); - } - - private static Optional> createPiecesGenerator(PieceGeneratorSupplier.Context context) { - // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) - BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); - - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "outhouse/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks - ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos.below(2), false, true); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/PitfallTrapStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/PitfallTrapStructure.java index d7c7cb222..de075dd10 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/PitfallTrapStructure.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/PitfallTrapStructure.java @@ -1,28 +1,25 @@ package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.NoiseColumn; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; +import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; import org.jetbrains.annotations.NotNull; import java.util.Optional; public class PitfallTrapStructure extends StructureFeature { + static int landHeight; + public PitfallTrapStructure() { super(JigsawConfiguration.CODEC, context -> { if (!isFeatureChunk(context)) { @@ -43,34 +40,37 @@ private static boolean isFeatureChunk(PieceGeneratorSupplier.Context> createPiecesGenerator(PieceGeneratorSupplier.Context context) { + private static Optional> createPiecesGenerator( + PieceGeneratorSupplier.Context context) { + // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "pitfall_trap/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks + /* Generate pieces of the structure. + Second-to-last boolean is only for structure intersections. + Last boolean means the structure will automatically be placed at ground level. + */ + return JigsawPlacement.addPieces( + context, + PoolElementStructurePiece::new, + blockPos.atY(landHeight - 1), + false, + false ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos.below(3), false, true); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/UndergroundBunkerStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/UndergroundBunkerStructure.java index b62070dd6..9a58341ed 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/UndergroundBunkerStructure.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/UndergroundBunkerStructure.java @@ -1,28 +1,26 @@ package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.NoiseColumn; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; +import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; import org.jetbrains.annotations.NotNull; import java.util.Optional; public class UndergroundBunkerStructure extends StructureFeature { + static int landHeight; + public UndergroundBunkerStructure() { super(JigsawConfiguration.CODEC, context -> { if (!isFeatureChunk(context)) { @@ -35,42 +33,49 @@ public UndergroundBunkerStructure() { @Override public GenerationStep.@NotNull Decoration step() { - return GenerationStep.Decoration.SURFACE_STRUCTURES; + return Decoration.SURFACE_STRUCTURES; } // Test if the current chunk (from context) has a valid location for the structure private static boolean isFeatureChunk(PieceGeneratorSupplier.Context context) { - BlockPos blockPos = context.chunkPos().getWorldPosition(); + BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); + BlockPos diagonalPos = blockPos.offset(8, 0, 8); // Get height of land (stops at first non-air block) - int landHeight = context.chunkGenerator().getFirstOccupiedHeight(blockPos.getX(), blockPos.getZ(), Heightmap.Types.WORLD_SURFACE_WG, context.heightAccessor()); + landHeight = context.chunkGenerator().getFirstOccupiedHeight(blockPos.getX(), blockPos.getZ(), + Heightmap.Types.WORLD_SURFACE_WG, context.heightAccessor()); // Grabs the column of blocks at given position. - NoiseColumn columnOfBlocks = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), context.heightAccessor()); - + NoiseColumn columnOfBlocks = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), + context.heightAccessor()); + NoiseColumn columnOfBlocks2 = context.chunkGenerator().getBaseColumn(diagonalPos.getX(), diagonalPos.getZ(), + context.heightAccessor()); // Combine the column of blocks with land height, and get the top block itself which can be tested. - BlockState topBlock = columnOfBlocks.getBlock(landHeight); + BlockState topBlock = columnOfBlocks.getBlock(landHeight + 1); + BlockState baseBlock = columnOfBlocks.getBlock(landHeight - 6); + BlockState diagonalBlock = columnOfBlocks2.getBlock(landHeight); - // Now test to make sure the structure is not spawning on water or other fluids. - return topBlock.getFluidState().isEmpty(); + // Now test to make sure the structure is not spawning on water or other fluids, and has + // sufficient clearance. + return baseBlock.getFluidState().isEmpty() && !baseBlock.isAir() && topBlock.isAir() && !diagonalBlock.isAir(); } - private static Optional> createPiecesGenerator(PieceGeneratorSupplier.Context context) { + private static Optional> createPiecesGenerator( + PieceGeneratorSupplier.Context context) { + // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) - BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); + BlockPos blockPos = context.chunkPos().getWorldPosition().atY(landHeight - 4); - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "underground_bunker/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks + /* Generate pieces of the structure. + Second-to-last boolean is only for structure intersections. + Last boolean means the structure will automatically be placed at ground level. + */ + return JigsawPlacement.addPieces( + context, + PoolElementStructurePiece::new, + blockPos, + false, + false ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos.below(5), false, true); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/WaterTowerStructure.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/WaterTowerStructure.java deleted file mode 100644 index b54898cd3..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/structures/WaterTowerStructure.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures; - -import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.JigsawConfiguration; -import net.minecraft.world.level.levelgen.feature.structures.JigsawPlacement; -import net.minecraft.world.level.levelgen.structure.PoolElementStructurePiece; -import net.minecraft.world.level.levelgen.structure.PostPlacementProcessor; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; -import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier.Context; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -public class WaterTowerStructure extends StructureFeature { - - public WaterTowerStructure() { - super(JigsawConfiguration.CODEC, context -> { - if (!isFeatureChunk(context)) { - return Optional.empty(); - } else { - return createPiecesGenerator(context); - } - }, PostPlacementProcessor.NONE); - } - - @Override - public GenerationStep.@NotNull Decoration step() { - return GenerationStep.Decoration.SURFACE_STRUCTURES; - } - - // Test if the current chunk (from context) has a valid location for the structure - private static boolean isFeatureChunk(PieceGeneratorSupplier.Context context) { - BlockPos blockPos = context.chunkPos().getWorldPosition(); - - // Get height of land (stops at first non-air block) - int landHeight = context.chunkGenerator().getFirstOccupiedHeight(blockPos.getX(), blockPos.getZ(), Heightmap.Types.WORLD_SURFACE_WG, context.heightAccessor()); - - // Grabs the column of blocks at given position. - NoiseColumn columnOfBlocks = context.chunkGenerator().getBaseColumn(blockPos.getX(), blockPos.getZ(), context.heightAccessor()); - - // Combine the column of blocks with land height, and get the top block itself which can be tested. - BlockState topBlock = columnOfBlocks.getBlock(landHeight); - - // Now test to make sure the structure is not spawning on water or other fluids. - return topBlock.getFluidState().isEmpty(); - } - - private static Optional> createPiecesGenerator(PieceGeneratorSupplier.Context context) { - // Convert the chunk coordinates into actual coordinates can use. (center of that chunk) - BlockPos blockPos = context.chunkPos().getMiddleBlockPosition(0); - - JigsawConfiguration configuration = new JigsawConfiguration( - () -> context.registryAccess().ownedRegistryOrThrow(Registry.TEMPLATE_POOL_REGISTRY) - .get(new ResourceLocation(ImmersiveWeapons.MOD_ID, "water_tower/start_pool")), - 5 //The structure is only one chunk wide but by using five here it can be replaced with something larger in datapacks - ); - - // Create a new context with the new config that has our JSON pool. We will pass this into JigsawPlacement#addPieces - Context contextWithConfig = Structures.createContextWithConfig(context, configuration); - - // Return the piece generator that is now set up, so that the game runs it when it needs to create the layout of structure pieces. - // Last 'true' parameter means the structure will automatically be placed at ground level - return JigsawPlacement.addPieces(contextWithConfig, - PoolElementStructurePiece::new, blockPos.above(), false, true); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/surface/SurfaceRuleBuilder.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/surface/SurfaceRuleBuilder.java new file mode 100644 index 000000000..6dda62124 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/surface/SurfaceRuleBuilder.java @@ -0,0 +1,155 @@ +package com.anonymoushacker1279.immersiveweapons.world.level.levelgen.surface; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; +import net.minecraft.world.level.levelgen.placement.CaveSurface; + +import java.util.*; +import java.util.function.Supplier; + +public class SurfaceRuleBuilder { + + public static final RuleSource[] RULE_SOURCES = new RuleSource[0]; + private static final Map RULES_CACHE = Maps.newHashMap(); + private static final SurfaceRuleBuilder INSTANCE = new SurfaceRuleBuilder(); + private final List rules = Lists.newArrayList(); + private SurfaceRuleEntry entryInstance; + private ResourceKey biomeKey; + + private SurfaceRuleBuilder() { + } + + public static SurfaceRuleBuilder start() { + INSTANCE.biomeKey = null; + INSTANCE.rules.clear(); + return INSTANCE; + } + + /** + * Restricts surface to only one biome. + * + * @param biomeKey {@link ResourceKey} for the {@link Biome}. + * @return same {@link SurfaceRuleBuilder} instance. + */ + public SurfaceRuleBuilder biome(ResourceKey biomeKey) { + this.biomeKey = biomeKey; + return this; + } + + /** + * Set biome surface with specified {@link BlockState}. Example - block of grass in the Overworld biomes + * + * @param state {@link BlockState} for the ground cover. + * @return same {@link SurfaceRuleBuilder} instance. + */ + public SurfaceRuleBuilder surface(BlockState state) { + entryInstance = getFromCache("surface_" + state.toString(), () -> { + RuleSource rule = SurfaceRules.state(state); + rule = SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, rule); + rule = SurfaceRules.ifTrue(SurfaceRules.waterBlockCheck(1, 0), rule); + rule = SurfaceRules.ifTrue(SurfaceRules.abovePreliminarySurface(), rule); + return new SurfaceRuleEntry(2, rule); + }); + rules.add(entryInstance); + return this; + } + + /** + * Set biome subsurface with specified {@link BlockState}. Example - dirt in the Overworld biomes. + * + * @param state {@link BlockState} for the subterranean layer. + * @param depth block layer depth. + * @return same {@link SurfaceRuleBuilder} instance. + */ + public SurfaceRuleBuilder subsurface(BlockState state, int depth) { + entryInstance = getFromCache("subsurface_" + depth + "_" + state.toString(), () -> { + RuleSource rule = SurfaceRules.state(state); + rule = SurfaceRules.ifTrue(SurfaceRules.stoneDepthCheck(depth, false, 0, CaveSurface.FLOOR), rule); + rule = SurfaceRules.ifTrue(SurfaceRules.waterBlockCheck(1, 0), rule); + rule = SurfaceRules.ifTrue(SurfaceRules.abovePreliminarySurface(), rule); + return new SurfaceRuleEntry(3, rule); + }); + rules.add(entryInstance); + return this; + } + + /** + * Set biome filler with specified {@link BlockState}. Example - stone in the Overworld biomes. The rule is added with priority 10. + * + * @param state {@link BlockState} for filling. + * @return same {@link SurfaceRuleBuilder} instance. + */ + public SurfaceRuleBuilder filler(BlockState state) { + entryInstance = getFromCache("fill_" + state.toString(), () -> new SurfaceRuleEntry(10, SurfaceRules.state(state))); + rules.add(entryInstance); + return this; + } + + /** + * Finalize rule building process. + * + * @return {@link SurfaceRules.RuleSource}. + */ + public SurfaceRules.RuleSource build() { + Collections.sort(rules); + List ruleList = rules.stream().map(SurfaceRuleEntry::getRule).toList(); + SurfaceRules.RuleSource[] ruleArray = ruleList.toArray(RULE_SOURCES); + SurfaceRules.RuleSource rule = SurfaceRules.sequence(ruleArray); + if (biomeKey != null) { + rule = SurfaceRules.ifTrue(SurfaceRules.isBiome(biomeKey), rule); + } + return rule; + } + + /** + * Internal function, will take entry from cache or create it if necessary. + * + * @param name {@link String} entry internal name. + * @param supplier {@link Supplier} for {@link SurfaceRuleEntry}. + * @return new or existing {@link SurfaceRuleEntry}. + */ + private static SurfaceRuleEntry getFromCache(String name, Supplier supplier) { + SurfaceRuleEntry entry = RULES_CACHE.get(name); + if (entry == null) { + entry = supplier.get(); + RULES_CACHE.put(name, entry); + } + return entry; + } + + /** + * Allows adding a custom rule. + * + * @param priority rule priority, lower values = higher priority (rule will be applied before others). + * @param rule custom {@link SurfaceRules.RuleSource}. + * @return same {@link SurfaceRuleBuilder} instance. + */ + public SurfaceRuleBuilder rule(int priority, SurfaceRules.RuleSource rule) { + rules.add(new SurfaceRuleEntry(priority, rule)); + return this; + } + + public static class SurfaceRuleEntry implements Comparable { + private final SurfaceRules.RuleSource rule; + private final byte priority; + + public SurfaceRuleEntry(int priority, SurfaceRules.RuleSource rule) { + this.priority = (byte) priority; + this.rule = rule; + } + + protected SurfaceRules.RuleSource getRule() { + return rule; + } + + @Override + public int compareTo(SurfaceRuleEntry entry) { + return Integer.compare(priority, entry.priority); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/loot/LogShardsLootModifierHandler.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/loot/LogShardsLootModifierHandler.java index aaf8bd4af..0c605cf10 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/loot/LogShardsLootModifierHandler.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/loot/LogShardsLootModifierHandler.java @@ -52,7 +52,7 @@ public class LogShardsLootModifierHandler extends LootModifier { // int numShards = 0; for (ItemStack stack : generatedLoot) { - if (stack.is(ItemTags.bind(blockTag))) { + if (stack.is(ItemTags.create(new ResourceLocation(blockTag)))) { numShards += stack.getCount() + GeneralUtilities.getRandomNumber(2, 5); } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 36b11767c..28c8d7473 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,7 +1,3 @@ -public-f net.minecraft.world.level.levelgen.feature.StructureFeature f_67031_ #NOISE_AFFECTING_FEATURES -public-f net.minecraft.world.level.levelgen.StructureSettings f_64580_ #DEFAULTS -public-f net.minecraft.world.level.levelgen.StructureSettings f_64582_ #structureConfig -public-f net.minecraft.world.level.levelgen.StructureSettings f_189361_ #configuredStructures public net.minecraft.world.entity.projectile.AbstractArrow f_36698_ #AbstractArrowEntity-damage public net.minecraft.world.entity.projectile.AbstractArrow m_36798_()Z #AbstractArrowEntity-shouldFall public net.minecraft.world.entity.projectile.AbstractArrow m_36799_()V #AbstractArrowEntity-startFalling @@ -12,4 +8,5 @@ public-f net.minecraft.world.item.AxeItem f_150683_ #STRIPPABLES public net.minecraft.world.entity.vehicle.Boat f_38285_ #DATA_ID_TYPE public net.minecraft.world.entity.Entity f_19819_ #PortalEntrancePos public net.minecraft.client.renderer.DimensionSpecialEffects f_108857_ #EFFECTS -public net.minecraft.data.models.model.ModelTemplate f_125585_ #model \ No newline at end of file +public net.minecraft.data.models.model.ModelTemplate f_125585_ #model +public net.minecraft.tags.BiomeTags m_207630_(Ljava/lang/String;)Lnet/minecraft/tags/TagKey; #create \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 79e0e4524..e2da9b72e 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" #mandatory -loaderVersion = "[39,)" #mandatory +loaderVersion = "[40,)" #mandatory license = "MIT" issueTrackerURL = "https://github.com/AnonymousHacker1279/ImmersiveWeapons/issues" #optional @@ -8,7 +8,7 @@ modId = "immersiveweapons" #mandatory version = "${file.jarVersion}" #mandatory displayName = "Immersive Weapons" #mandatory displayURL = "https://www.curseforge.com/minecraft/mc-mods/immersive-weapons" #optional -updateJSONURL = "https://raw.githubusercontent.com/AnonymousHacker1279/ImmersiveWeapons/1.14.0-update-indev/update.json" +updateJSONURL = "https://raw.githubusercontent.com/AnonymousHacker1279/ImmersiveWeapons/1.18.x-dev/update.json" logoFile = "logo.png" #optional credits = "Written by AnonymousHacker1279 and visually designed with the help of Jonny-fox and gamingwarrior68 with pain and suffering" #optional authors = "AnonymousHacker1279" #optional @@ -19,20 +19,27 @@ Immersive Weapons is more than just a weapons mod aiming to spice up your combat [[dependencies.immersiveweapons]] #optional modId = "forge" #mandatory mandatory = true #mandatory -versionRange = "[39.0.55,)" #mandatory +versionRange = "[40.0.0,)" #mandatory ordering = "NONE" side = "BOTH" [[dependencies.immersiveweapons]] modId = "minecraft" mandatory = true -versionRange = "[1.18.1,1.19)" +versionRange = "[1.18.2,1.19)" ordering = "NONE" side = "BOTH" [[dependencies.immersiveweapons]] modId = "patchouli" mandatory = false -versionRange = "[1.18.1-64,)" +versionRange = "[1.18.2-66,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.immersiveweapons]] +modId = "terrablender" +mandatory = true +versionRange = "[1.18.2-1.1.0.99,)" ordering = "NONE" side = "BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/lang/en_us.json b/src/main/resources/assets/immersiveweapons/lang/en_us.json index f49fca573..91e17fa08 100644 --- a/src/main/resources/assets/immersiveweapons/lang/en_us.json +++ b/src/main/resources/assets/immersiveweapons/lang/en_us.json @@ -158,6 +158,7 @@ "item.immersiveweapons.celestial_tower_spawn_egg": "Celestial Tower Spawn Egg", "item.immersiveweapons.celestial_fragment": "Celestial Fragment", "item.immersiveweapons.encyclopedia": "Encyclopedia", + "item.immersiveweapons.lorebook": "Oppslukende Legender", "block.immersiveweapons.molten_ore": "Molten Ore", "block.immersiveweapons.molten_block": "Molten Block", "block.immersiveweapons.electric_ore": "Electric Ore", @@ -601,49 +602,13 @@ "loot.immersiveweapons.chest.village.battlefield.medic_station.iron_axe": "The Amputator", "immersiveweapons.boss.celestial_tower.waves": "Wave %s of %s", "immersiveweapons.encyclopedia.landing": "Immersive Weapons is $(m)a weapons mod$() more than just a weapons mod aiming to spice up your combat skills.$(br2)The Encyclopedia is your go-to solution for finding information.", + "immersiveweapons.lorebook.landing": "The secrets of the universe, as described by me, Hans.", "config.immersiveweapons.tesla_armor_effect_sound": "Enable the Tesla Armor effect sound - Default true", "config.immersiveweapons.panic_alarm_range": "Set the range of the Panic Alarm's sound - Default 48", "config.immersiveweapons.max_smoke_bomb_particles": "Set the maximum number of particles produced by the smoke bomb - Default 96\nSetting this higher can make clients laggy, setting to 0 effectively disables it", "config.immersiveweapons.bullets_break_glass": "Enable bullets breaking glass - Default true", "config.immersiveweapons.tiltros_enabled": "Enable the Tiltros dimension portal - Default true", - "config.immersiveweapons.dying_soldier_spawn": "Enable the natural spawning of Dying Soldiers - Default true", - "config.immersiveweapons.wandering_warrior_spawn": "Enable the natural spawning of Wandering Warriors - Default true", - "config.immersiveweapons.hans_spawn": "Enable the natural spawning of Hans the Almighty - Default true", - "config.immersiveweapons.lava_revenant_spawn": "Enable the natural spawning of Lava Revenants - Default true", - "config.immersiveweapons.rock_spider_spawn": "Enable the natural spawning of Rock Spiders - Default true", - "config.immersiveweapons.celestial_tower_spawn": "Enable the natural spawning of Celestial Towers - Default true", - "config.immersiveweapons.celestial_tower_xz_spawn_check_radius": "Set the X and Z spawn checking radius for the Celestial Tower.\nSetting this higher will negatively impact server ticks in Tiltros, but make Celestial Lanterns more effective - Default 56", - "config.immersiveweapons.celestial_tower_y_spawn_check_radius": "Set the Y spawn checking radius for the Celestial Tower.\nSetting this higher will negatively impact server ticks in Tiltros, but make Celestial Lanterns more effective - Default 20", + "config.immersiveweapons.celestial_tower_spawn_check_radius": "Set the spawn checking radius for the Celestial Tower.\nSetting this higher may slightly negatively impact server ticks in Tiltros, but make Celestial Lanterns more effective - Default 128", "config.immersiveweapons.celestial_tower_minions_wave_size_modifier": "Multiplier to change the wave size from Celestial Tower summons.\nSet less than 1 to reduce, greater than 1 to increase.\nIncreasing the wave size will negatively affect the server ticks in Tiltros. - Default 1.0", - "config.immersiveweapons.max_abandoned_factory_distance": "Maximum distance in chunks between Abandoned Factories - Default 120", - "config.immersiveweapons.min_abandoned_factory_distance": "Minimum distance in chunks between Abandoned Factories - Default 90", - "config.immersiveweapons.max_pitfall_trap_distance": "Maximum distance in chunks between Pitfall Traps - Default 8", - "config.immersiveweapons.min_pitfall_trap_distance": "Minimum distance in chunks between Pitfall Traps - Default 2", - "config.immersiveweapons.max_bear_trap_distance": "Maximum distance in chunks between Bear Traps - Default 10", - "config.immersiveweapons.min_bear_trap_distance": "Minimum distance in chunks between Bear Traps - Default 4", - "config.immersiveweapons.max_landmine_trap_distance": "Maximum distance in chunks between Landmine Traps - Default 12", - "config.immersiveweapons.min_landmine_trap_distance": "Minimum distance in chunks between Landmine Traps - Default 6", - "config.immersiveweapons.max_underground_bunker_distance": "Maximum distance in chunks between Underground Bunkers - Default 110", - "config.immersiveweapons.min_underground_bunker_distance": "Minimum distance in chunks between Underground Bunkers - Default 80", - "config.immersiveweapons.max_battlefield_camp_distance": "Maximum distance in chunks between Battlefield Camps - Default 16", - "config.immersiveweapons.min_battlefield_camp_distance": "Minimum distance in chunks between Battlefield Camps - Default 4", - "config.immersiveweapons.max_cloud_island_distance": "Maximum distance in chunks between Cloud Islands - Default 90", - "config.immersiveweapons.min_cloud_island_distance": "Minimum distance in chunks between Cloud Islands - Default 70", - "config.immersiveweapons.max_campsite_distance": "Maximum distance in chunks between Campsites - Default 50", - "config.immersiveweapons.min_campsite_distance": "Minimum distance in chunks between Campsites - Default 30", - "config.immersiveweapons.max_battlefield_house_distance": "Maximum distance in chunks between Battlefield Houses - Default 12", - "config.immersiveweapons.min_battlefield_house_distance": "Minimum distance in chunks between Battlefield Houses - Default 4", - "config.immersiveweapons.max_outhouse_distance": "Maximum distance in chunks between Outhouses - Default 40", - "config.immersiveweapons.min_outhouse_distance": "Minimum distance in chunks between Outhouses - Default 20", - "config.immersiveweapons.max_water_tower_distance": "Maximum distance in chunks between Water Towers - Default 30", - "config.immersiveweapons.min_water_tower_distance": "Minimum distance in chunks between Water Towers - Default 12", - "config.immersiveweapons.max_graveyard_distance": "Maximum distance in chunks between Graveyards - Default 50", - "config.immersiveweapons.min_graveyard_distance": "Minimum distance in chunks between Graveyards - Default 30", - "config.immersiveweapons.molten_ore_config": "Configuration for Molten Ore. Specified as a list. [ore_per_vein, veins_per_chunk, max_y]. Default: [4, 8, 64]", - "config.immersiveweapons.nether_sulfur_ore_config": "Configuration for Nether Sulfur Ore. Specified as a list. [ore_per_vein, veins_per_chunk]. Default: [12, 16]", - "config.immersiveweapons.sulfur_ore_config": "Configuration for Sulfur Ore. Specified as a list. [ore_per_vein, veins_per_chunk]. Default: [8, 14]", - "config.immersiveweapons.cobalt_ore_config": "Configuration for Cobalt Ore. Specified as a list. [ore_per_vein, veins_per_chunk, blocks_below_top]. Default: [6, 12, 24]", - "config.immersiveweapons.deepslate_sulfur_ore_config": "Configuration for Deepslate Sulfur Ore. Specified as a list. [ore_per_vein, veins_per_chunk]. Default: [8, 14]", - "config.immersiveweapons.deepslate_cobalt_ore_config": "Configuration for Deepslate Cobalt Ore. Specified as a list. [ore_per_vein, veins_per_chunk]. Default: [8, 16]", "itemGroup.immersiveweapons": "Immersive Weapons" } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/item/encyclopedia.json b/src/main/resources/assets/immersiveweapons/models/item/encyclopedia.json index 07d4bb4be..f4e924d0b 100644 --- a/src/main/resources/assets/immersiveweapons/models/item/encyclopedia.json +++ b/src/main/resources/assets/immersiveweapons/models/item/encyclopedia.json @@ -1,6 +1,6 @@ { "credit": "Made with Blockbench", - "texture_size": [196, 196], + "texture_size": [256, 256], "textures": { "0": "immersiveweapons:item/encyclopedia", "particle": "immersiveweapons:item/encyclopedia" @@ -11,12 +11,12 @@ "from": [6, 0, 3], "to": [10, 10, 4], "faces": { - "north": {"uv": [0, 0, 3.02959, 7.57396], "texture": "#0"}, - "east": {"uv": [2.93491, 0, 3.69231, 7.47929], "texture": "#0"}, - "south": {"uv": [0, 0, 3.02959, 7.47929], "texture": "#0"}, - "west": {"uv": [2.93491, 0, 3.69231, 7.57396], "texture": "#0"}, - "up": {"uv": [0, 7.47929, 3.02959, 8.23669], "texture": "#0"}, - "down": {"uv": [0, 7.47929, 3.02959, 8.23669], "texture": "#0"} + "north": {"uv": [0, 0, 2, 4.9375], "texture": "#0"}, + "east": {"uv": [0.79974, 0, 0.79974, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 2, 4.9375], "texture": "#0"}, + "west": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 4.9375, 2, 5.4375], "texture": "#0", "cullface": "up"}, + "down": {"uv": [0, 4.9375, 2, 5.4375], "texture": "#0"} } }, { @@ -24,12 +24,12 @@ "from": [6, 0, 4], "to": [7, 10, 14], "faces": { - "north": {"uv": [0, 0, 1, 10], "texture": "#0"}, - "east": {"uv": [3.59763, 0, 11.1716, 7.57396], "texture": "#0"}, - "south": {"uv": [2.93491, 0, 3.69231, 7.57396], "texture": "#0"}, - "west": {"uv": [3.59763, 0, 11.1716, 7.57396], "texture": "#0"}, - "up": {"uv": [2.93491, 0, 3.65657, 6.53061], "texture": "#0"}, - "down": {"uv": [2.93491, 0, 3.69231, 7.57396], "texture": "#0"} + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [2.375, 0, 7.375, 5], "texture": "#0"}, + "south": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0", "cullface": "south"}, + "west": {"uv": [2.375, 0, 7.375, 5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0"}, + "down": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0"} } }, { @@ -37,12 +37,12 @@ "from": [9, 0, 4], "to": [10, 10, 14], "faces": { - "north": {"uv": [0, 0, 1, 10], "texture": "#0"}, - "east": {"uv": [3.69231, 7.57396, 11.26627, 15.14793], "texture": "#0"}, - "south": {"uv": [2.93492, 0, 3.69231, 7.57396], "texture": "#0"}, - "west": {"uv": [3.78698, 7.57396, 11.26627, 15.14793], "texture": "#0"}, - "up": {"uv": [2.93492, 0, 3.69231, 7.57396], "texture": "#0"}, - "down": {"uv": [2.93491, 0, 3.69231, 7.57396], "texture": "#0"} + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [2.4375, 5, 7.4375, 10], "texture": "#0", "cullface": "east"}, + "south": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0", "cullface": "south"}, + "west": {"uv": [2.4375, 5, 7.4375, 10], "texture": "#0", "cullface": "west"}, + "up": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0"}, + "down": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0"} } }, { @@ -50,12 +50,12 @@ "from": [7, 0.25, 4], "to": [9, 9.75, 13.75], "faces": { - "north": {"uv": [0, 0, 2, 9.5], "texture": "#0"}, - "east": {"uv": [0, 0, 9.75, 9.5], "texture": "#0"}, - "south": {"uv": [0, 8.23669, 3.69231, 9.75148], "rotation": 270, "texture": "#0"}, - "west": {"uv": [0, 0, 9.75, 9.5], "texture": "#0"}, - "up": {"uv": [0, 8.23669, 3.69231, 9.75148], "rotation": 270, "texture": "#0"}, - "down": {"uv": [0, 8.23669, 3.69231, 9.75148], "rotation": 270, "texture": "#0"} + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [0, 5.4375, 2.4375, 6.4375], "rotation": 270, "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 5.4375, 2.4375, 6.4375], "rotation": 270, "texture": "#0", "cullface": "up"}, + "down": {"uv": [0, 5.4375, 2.4375, 6.4375], "rotation": 270, "texture": "#0"} } } ], diff --git a/src/main/resources/assets/immersiveweapons/models/item/lorebook.json b/src/main/resources/assets/immersiveweapons/models/item/lorebook.json new file mode 100644 index 000000000..60d4f971c --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/item/lorebook.json @@ -0,0 +1,100 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [256, 256], + "textures": { + "0": "immersiveweapons:item/lorebook", + "particle": "immersiveweapons:item/lorebook" + }, + "elements": [ + { + "name": "spine", + "from": [6, 0, 3], + "to": [10, 10, 4], + "faces": { + "north": {"uv": [0, 0, 2, 4.9375], "texture": "#0"}, + "east": {"uv": [2, 0.0625, 2.375, 5], "texture": "#0"}, + "south": {"uv": [0, 0, 2, 4.9375], "texture": "#0"}, + "west": {"uv": [2, 0, 2.375, 5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 4.9375, 2, 5.4375], "texture": "#0", "cullface": "up"}, + "down": {"uv": [0, 5, 2, 5.4375], "texture": "#0"} + } + }, + { + "name": "cover", + "from": [6, 0, 4], + "to": [7, 10, 14], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [2.375, 0, 7.375, 5], "texture": "#0"}, + "south": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0", "cullface": "south"}, + "west": {"uv": [2.375, 0, 7.375, 5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0"}, + "down": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0"} + } + }, + { + "name": "cover", + "from": [9, 0, 4], + "to": [10, 10, 14], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [2.4375, 5, 7.4375, 10], "texture": "#0", "cullface": "east"}, + "south": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0", "cullface": "south"}, + "west": {"uv": [2.4375, 5, 7.4375, 10], "texture": "#0", "cullface": "west"}, + "up": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0"}, + "down": {"uv": [1.9375, 0, 2.4375, 5], "texture": "#0"} + } + }, + { + "name": "pages", + "from": [7, 0.25, 4], + "to": [9, 9.75, 13.75], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [0, 5.4375, 2.4375, 6.4375], "rotation": 270, "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 5.4375, 2.4375, 6.4375], "rotation": 270, "texture": "#0", "cullface": "up"}, + "down": {"uv": [0, 5.4375, 2.4375, 6.4375], "rotation": 270, "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [0, 16.25, 0], + "translation": [0, 3.75, 1.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, 16.25, 0], + "translation": [0, 3.75, 1.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 0.75, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [12.75, 120, 0], + "translation": [-0.25, 2.75, 0] + }, + "fixed": { + "rotation": [0, -90, 0], + "translation": [0.5, 3, -0.5] + } + }, + "groups": [ + { + "name": "book", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/textures/item/encyclopedia.png b/src/main/resources/assets/immersiveweapons/textures/item/encyclopedia.png index 3f4e1b91599ab65076f29454c435785ed08f8346..c9274bcb11df9535b99bab99bd31698a1523218e 100644 GIT binary patch literal 6184 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 bynkW*0zN;vL}-zxU4B4U%kW02CNBJc?YBFV literal 5577 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 X#Z7hEiT`qx00000NkvXXu0mjfilW{a diff --git a/src/main/resources/assets/immersiveweapons/textures/item/lorebook.png b/src/main/resources/assets/immersiveweapons/textures/item/lorebook.png new file mode 100644 index 0000000000000000000000000000000000000000..6e137a25fabef4a5b87a7c34a2d24fd59f71d209 GIT binary patch literal 20116 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

wei_7)c#{6xJp6{D>uN78Jz9Ljl2 zn>-5B5hW$rHtMd$9YSC&5_iGUjD4C%g-d8*u`M1Yl<67K^9N!`>5?TW4Sy@JjCkrb zhH8o3R$O(A=td0Hl=7y@TsRwG)|{UX)v2 z=$tL+cSDkJ(v=DJy!^dGJIa4Pff9^F#Y2ME_>bCPYtjoRqk)5hTm3i9ae3#sp$#?` z{fMENrsVEu<37RqS~q_vuDd#v3Xjzgb&@*dB~@B3;-otm&s_B3AKzc-06_@LmMc*D zUQXsd>p!#VQp1ZHyYc^=s%rjNUdQoxu49jx+)_q%u4G^>ABjjFIIr{s_?y0NwxwWP>G}8T>Lh8kQ9J zK6DmE7OUWu>)531fuNvX-4LuW#6Xd^U_!J@V`QVk}?f?Yqq$&7QhS8b^Q9}zob@{2!Zb8j~dNNYj1{S zVY3HKa|C_(wiU*Vh4U6EBKx&qKl9S}C@1)otw(wCC~vVnFp9!v7ig3a`;*EN328`n z@?%51U5si`jAIj$`9KmvkZYjER#(5mhQ!+Q>8Z15!kBYRT0E4as~vx*tEc<` z0yQlB9R4IHAp7v2T}cZh`WV&0_07T13>5{XoX7&@dCR$5Dms=D0*`Mpcs?zokTdNd zL;8GJ135{$knb-?7>~?OIy=GeOJP^M^zj48ii*YXBwlMq;|M-aC@ythcQC5U8Un zFf-97x?SPE;GhzDflIqSNrb4+i>twwv_}*oCfDLCuplylJg;8CyID26>4(mVRn%b$ zbo-45-?1Iok&?&bcZAZA^)qGWC9Q?(HPrM!^a52tE2p9N=<|6ov>Xf4bVvPMtO6;6 z)Ls!LYQ8-M9y=r{0ms#dsEM!3=g3Y=t%T2c#gTF+nFrt#f}pebyZeRJ?OIU`74Iz& zx!YOQc4uPL>Ul)^)AR3M&p9;G@KL!AAjHvsuIo3_JPwi!>dEK_a4uY?> zOC&fFxb%>W@V-E`t`qv$!Oo5hkmq&gf+Wnik zt07N5G+QrMsYxTY-qoSqaW_tX!?`0aUO7gp2%67U7jGDw_eB)Jcj?(_X&Wy4Rn;!! zNp~Hj&;{;+!%vA2hAX$s;nkeOtQeB&dSGaOny?_UjAmRAg80Er#CQ&K5+uXpdP2K| zM*GaN94Nwe`f~ABq+~inhMaTjspfl=c)}U{7`osk^6_|U45Z-371+@Dqo(Y2!MkXo zb7kPs=hwaK)V)x%*In$1?`C60_rq$lgY|sC^kps8b)nBuT~>ww`}IGHrsOJaL+1~1 zP65lyBGqRHUh86W4xJ>aTwkO1n+}RG9&&~7K$WZQNFyX;-51|H%zo=z4b_y0Mr}oHZ`{7U0#|DX?dO$tYwu(t)Aw9GwUlGEJFld7%*6jcEOUtO z1Xt-lo$hCezYCfnUVFOvA#=Ta)kTBExd?HazNBh)?xtL7cR)=U&oXYgNgdCMiCOe` zzkAO|r;2VQ=%FKrZ}iHE*m0o|Q+a0s!}pe=@d!hS_Okpgd5+6eP{b2w&S52R3v(y> zu7lrxIYgN_Wqlai(Ea@l{r*d%uA3D#>URHWF+G<{QIWezXXu?6WmvCu1jZ~Lm;HFB z-{J9)VyrqeHJ_q2P8C1w^BznHG`oCjc>J$x(xzi*^8#F^uZmn__K#apQ!^|ml5|#U zW>^D1I!SJe0x78(CJG7|YYj;JM)=Ic%4t8;e;*Avh}4wR-87l+s~WYN@ykL499FH2 zA47#?Nw@|1&}wo&;=r7(lQ z#*Hdn33j41@Y!k1hKN6QhjhPY#TbaX3*+o3W!Cu=ACI^BdRe&Ah%nZjSha0X7V-A# zphqr2c~#R=$`(}&ipqfv(C!77aYP!e)uFLr@Sw{`?43zQ!w~!rs9l4U$^o_M zwrSM|!~c3Mc)bC0d%X1L$uEx6e#{S>11$LSTIQeDm(u5(JM2r0Tg`MD{*8N~3CJt< ze2@!{Ec(fCf7A@_>Bk)ALHHn@20{SRWXNVD(>X1D^Zj?^=F8ZMsmB}7#{zQ}S8CX? zs7mHDljm*Bo%I`k-U>hutZxSAh|Z<)rnQxHHFCrDzL2&YrU3O)%u5)OX}dY}IEg3J z7zrI!is2zkBq*$dMzReiFp~njD~hDMq+F#Np8m06_#_TxA*ii(&ryA?{{c0@_8Fxs zadBhfd9FwA{2vPc;4-%Ri^1q?ZBlYgX;I7)rL2YeurMHbzXTd-Eu@fzoAIFgPzR++TeIW*=V4xcN-H`X0A1kI>l zmR?YTFleV+-^=-_A_xQ6=nbpXvIv>c{LZ8Y3^Yoj5w zR>iKq#q&KF#cj`|Y=h?m%qSN5gD*d92^|mL=&g`@cNwe=y0)d5?=s}CEZlWDQhFS8 zV&>wA#==K%_^W3;&2{LmE)U-f2k&XwhDYKs#lCN5+aMs!lVytr5trfxF*8z1QNucZ zH@NmOEDRi^qwww^Tgvj#$9pbVbBJeh7R!VF6rl|ce9`|H^BLPXOd}xx0J~ZrjtDVhY6(Sa)b>?8+${=R4t7 z-7kCWDjG)25JM93iz6bG-XYipfyNl&Z3sllcK_7!E1Shc8d-~mS>}9N9ULxfviTW6 zBOb>AqzVYt>>QAL9_A+81tw59l%thPB}9gLousGAr;17crchn=QuySQRu-$Exkq&K zbj*?6Q8XT4CHfxj!=F?9h;8!OA`DHdDEvBxxh6P#t^s@!!aopmc6lJ6mDO93`zHgh zvh8lg0PF3PulZG0_#!t`3krmhk{_QWR%E5y&_h)1!(+$xS}o6@!1jf`$&YLUK3WYE zqDCXzg-#9>-v4-`rrQOLQO=<+d>Nm#c_J%?`=v6JQd^q zDTaiswg0AJX}S6avFA|Ay|sv(yB$$~FO7w-9BGjH?-qgk0mSOik)Vb8-8r8X$XdFz zyN$Fl+P8V*G}e3Zt*oNe<;B|ARSMzfi7dM)YsckN$$5{J1Kel5;XmDh265O%U4GEz zSLEma?as%f9^zr=wuHHzA}2)Ar2Q>skEz%0sJ{2P6t^-A;5HT|!Ru~)d$m!^bS|BC z+7Yl4#4b_K^X!2%MT)tJd>*O-@X&I(M1j&sc~S-@o-nfd#9?XxxBe^Cp4sFsmqjk4 zS65g|ZpRPJHb-Q$J|4NQ&!pk<_UcgmH^XNHl^HoL5CyHkt ztW&#sCym2sz?uDuoMT-<4Vbyj{4&xt*c&_hWO4kJ&E9_tQ()Ogg6sRIP@+el<3Z$4 zK#>MVO1DtO28H(G6E8 zqs?q|o!RbaDRyLHm&)K{k0+1T9hHVKtvS1|q5%NlQ2h5^fLyP}xqmY^N?kT3?-FWL zIvNQi8$jgH!!G|391an?Mk@m5#RL)`oKr8y#T&`_H?OzWD=IUn6#g6RX0!3#8A1WH zN6Tu*X|ZOv(Ov+C}+QY5isp&s#f(G34LhqnLpA{PjKB*lb6YBdQah1eZpoT-nkCin>_5f7>?? zd7k7xP01Y7(a=xm=8apYLL`njbe zA%QiyB5teHXGStV*;hJw*meVE)TRG;v}pNfuvxrP1FuFABbl!@FezbD3gyHmZVQ7$ z3m>A+E2%!it0c%=&dfZYHMynz(IcT)((_(%aMxgpMuMjjiS#w=w*BM$Z&rA}TR zxUx_?T>sMT!_yiU)T2MENJ$&J9PC3s8mHsP^={nhr5%ZNp}aBTTv#*ZA}MXJDc!48 zVi+E=C?w9Tk)6+CEo1e2bkuAwoK|Im{OMejNRl<39$qaszcd#|p=cH1dA`Y10K_TV z3CLSl@SB!UAyV_xz7~DwDQ*0&+agvHpDZ~0%xk(V2a>MOz6ct2Lw9Kg>bi>v*Zg=< zwE1AWc0jrA_qGKAELd9FT^uDRC0(fXcaOf?Zc1r1 zusmLqRiNNePa(l{9jhlFnFTCGk&B-RiE-<7w*eamxAn1J1|-6(4i0@rbS_b3luOPe zZf8{A{rGARr0Mkm0jbqXe9e{b?mM&&Wtmso`EVzL0)J`Da{j~9I$O15vGDeA25LpG z0n+E{C6Lzhg0!A9$EIdM)VlhfZ8-bTgtsA!i2709J5BOrI)3b>*&MnF%tiZeA0DXA zR98tHiqR)6B%Z#t$!j>x>?i zSQ1P1*IRlk+k4G8vfqb=sbra6_HW2KOGy`Wx7R8)Izyi>%ut@f?EGe<_v^ef_K7LY=4u{lyr+Pf(6`tD57r1eu8q~$qD?Mat~r+e#= zi2c4>kz(c57*yQ~a23q0^Qc2w%E8qBUuEC_%e97pB?fcHU(;b@nmsAH^PP z-Lo%d3|rx+PzDIs2_7EXVbPEbILw4ml9BY2TH}?KqF@=ar0iDm92RfJ&z+1;eFlX$miBKmN37kE_HWd~IYj`aXRd)39G4m}r;+ov?SSSMt1$Rut7tm~J){1YU z_jbaBOy8uIClAV+fTMXE3biKuhm4C#pDj_}_J@nN+Bzt+V#?DAVzys*bMi5;cIw+; zyaJe#L!Gd%t6l>NhX)y(qB;BRy-rG)Dep`MOgj+@hh3F18)`~`v7fqmK1v~Bz|}OX zWv~hQGi5YP?}`r5vtqa?7GXs{YPmzXD|GYk#*9<)nD#;x2%K*KsF?b;j7!PjVL_g- zVmeem)cn*dT5aC7?M>kBm6V6tA^tJO9mVPmz67#hl5_JaV-WGjj6kV`X*t(Z^hueJ zE{TezBtnvk|_LgVA5yUX3bo4G5WG84R~nHg#9|WIqZ9++i_RR{zQV*AHSY; zlf%QpP7N}!tTe&xJ(8%f94fhwS^s*{OQ)L35^vk7Aq5eFQ)DZUD~~W3#rqXXV|EG}m{gzTcAZ z&%0Ky$C-;~0f3xCl4K0BjZ7P*yFW03dgsx5@E4U2gFXflM{?s5IdLj2NUS^4Sgs)q z5z6tbDx@uWZNJiDkpy3q+x#VZjt^?Hml5^J_l|MJp*NSEgl|z|NbUVxB=j^Y8FNq- zo?oF$K?|n<^8E^IUiC~=L1pMmE-S(HMtq$b3qIk1-u1(hpt0Ziy?K#7pwrh}L!as+ zLsxf)uZGbQv+rzd*~S|Bq>s!7Uge~8M+nKWo9iYStXUECc zm)mnD;19-ko_LGIClaw=56D+Z%e)Zs_U_Y3%F)_f?Gidk%U(aNCcICQyqywSCSwPG zaaxM?Lq&%HbfZ@%5;L+o@;ujd;B2!X_V_#ypwe!>7jCf~o)f!&&0fvh2nn-v3g?kd zbXLoj4^PVi*reS}H!%m{go54_8Ufwju4^Pk++h^)hmKtUF|?6+~6 zPVM0`)4Ug(GLUHZ62hLzr|8rjm5((}T)vjQ)r!x#G+3tE^#q2+R$VD@bQK3Dds#cF z;K3rh?}ISf;>%$l*{ZX84tI@2}p#Td@; zu*GiZUls36bl^P06z4KfHPboqgMT!%G_$xRl*HBJ+Rt*mUrXI&f&caUL-JIFj9B4!StC?g z279yC{kb6TVe#TO2~glKY~mbX)XcE%x1Fu4YQl$(kZzUB7}eo(@;bAR`NxOSYVhdl zjl!h5`ZkHFQC|((%;gJVv zE`w7sR{-gZ%UqGIh#*8tAjITd4@c~s?RDH^X`D6$;|1C)j=d4?FvK-ZpOq%`6IfGt zM&qXoe-;17I`Zp}zoFAVy~_Lm6!bv-HIKt<@-jVr!X1^Vy rr~)!P)pZqIv-SVye-?pZwj+FF?i*OLabzmEQ4Y}6zM)m7X-D`Mi((*w literal 0 HcmV?d00001 diff --git a/src/main/resources/data/immersiveweapons/dimension/tiltros.json b/src/main/resources/data/immersiveweapons/dimension/tiltros.json new file mode 100644 index 000000000..100deeceb --- /dev/null +++ b/src/main/resources/data/immersiveweapons/dimension/tiltros.json @@ -0,0 +1,13 @@ +{ + "type": "immersiveweapons:tiltros", + "generator": { + "type": "minecraft:noise", + "seed": 2031154856, + "settings": "immersiveweapons:tiltros", + "biome_source": { + "type": "minecraft:fixed", + "biome": "immersiveweapons:tiltros" + } + }, + "forge:use_server_seed": true +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/dimension_type/tiltros.json b/src/main/resources/data/immersiveweapons/dimension_type/tiltros.json new file mode 100644 index 000000000..dc13d3217 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/dimension_type/tiltros.json @@ -0,0 +1,17 @@ +{ + "ultrawarm": false, + "natural": true, + "piglin_safe": false, + "respawn_anchor_works": false, + "bed_works": true, + "has_raids": false, + "has_skylight": false, + "has_ceiling": false, + "coordinate_scale": 16, + "ambient_light": 0.2, + "logical_height": 192, + "effects": "immersiveweapons:tiltros", + "infiniburn": "#minecraft:infiniburn_overworld", + "min_y": -64, + "height": 256 +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/patchouli_books/lorebook/book.json b/src/main/resources/data/immersiveweapons/patchouli_books/lorebook/book.json new file mode 100644 index 000000000..d64b1a513 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/patchouli_books/lorebook/book.json @@ -0,0 +1,12 @@ +{ + "name": "item.immersiveweapons.lorebook", + "landing_text": "immersiveweapons.lorebook.landing", + "subtitle": "Version: ${build_version}", + "model": "immersiveweapons:lorebook", + "nameplate_color:": "33452f", + "progress_bar_color": "B9F3AB", + "progress_bar_background": "88745a", + "creative_tab": "immersiveweapons", + "advancements_tab": "immersiveweapons", + "book_texture": "patchouli:textures/gui/book_green.png" +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/patchouli_books/lorebook/categories/neutral_creatures.json b/src/main/resources/data/immersiveweapons/patchouli_books/lorebook/categories/neutral_creatures.json new file mode 100644 index 000000000..fa95386f7 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/patchouli_books/lorebook/categories/neutral_creatures.json @@ -0,0 +1,5 @@ +{ + "name": "Neutral Creatures", + "description": "Not every creature wants you dead on sight, but they'll still put up a fight if you attack them first.", + "icon": "immersiveweapons:copper_arrow" +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/structures/battlefield_house/house_1.nbt b/src/main/resources/data/immersiveweapons/structures/battlefield_house/house_1.nbt deleted file mode 100644 index 8f816039ba33c6c45cba4b72df82a5750fab0eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3600 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/immersiveweapons/structures/destroyed_house/house_1.nbt b/src/main/resources/data/immersiveweapons/structures/destroyed_house/house_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7655443639e3929e47aad7099973655451b7461a GIT binary patch literal 2897 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�=b!zPfV5U&#;I2pCLNv2U&94 zg^+~(yB%EAbHxX0mhBR$_!S1DDG$szih4hA;RY^bCM>$4`0t$7cSu;p7o$qQ414gx zws>QKEnL*kS^$2zvKK%>3EOU`{A$!!P7K9m0wBR{7{sv^=RH)586Noys)JS;q&b*i zHzx?$t~+2}>cNy@mR^|!NW?gjv!y;$ce{0EV@X|g76#L*T`m}ky>v#alMTg_NPj zf9o+1IAY|zk%<7q=)&E&5qgj04OY|--bG@EU4`d+6EB%q53oXs{kY>#qir7^<@~O= z^sv=4lccdnJT?^FWW^7n41z2XNlxR}8p-Nt?(r;=TG=$pQLyQku70wteN=0~7iI0q9kXc&2TxslPK9ANdn`es6(%^+Hj~H_GxH!6IfR=(ffUD+ zao12KZapO~oW5_{O{j5OM%yO;SiNUcI2K~$q}?PQ(hov%Ukgi{?scm8s|35C+VmNj zSqi+YJ)RZ6M$B95Q)#<#=VOWk`%7%#U&?>Bj^hf_N2)*0YIN`kufpvVUafT3ACkF;q?*RE9v)iq$!os)1jQ$8=WYjOArLosC{cPba-JhjpjT zCob3Fau+;AJuv@Rz}^{a#&zN$u}5Bd**gD7K;CzBJ>@@@M=!(NCIu=qb$0S8#j27J`~}SVs?835dwUZ0fe=L`d*QbhgKhI4$^PM^SZRIwhh9!$p?S zp&krkd_C+7=Qc`Mm5QQ7QGb%F+3$ZsR%WHfOI)f~@EB0x63i^Z$V4?4>wJ zi2a^Hbi?A_f+E?V?j*MQ)ARA(YzH=x>!U+7@*ca9qxhU}!jd|0Z@1}{^h&xU7=Aj5 zA*@E}i=$yMrT&3CVsY&fJ%d0={Ge-AUBk$SiT(6&o#mxyCtZ7$Hh%-8MLpnm()uPE zDyMx1Y7J1n#q?;7o3QRjLFFyRF^&TfJJ`fv=7xd6Dl^U`_NHz&aC!Y+2x;aH2{G98 zSI~7S+d-z76(MPdCZK^5pr6Wa@q^0q32;$q_yJD?@!vj6cTUXh>jL;Cn@t1|G(Dup zTKG!b>qHFB6)asO;7)`_K5X`r8X}|}m+MQ&W!?ezMX+TQ5bK43S%frR_fKfqB??rY zOD&L(h6&Ujc3z{dHemQkJL~}tbO}giTG)i=!2d+64DeEd@qxMcE>dh~H*z+C)yTtO zDY|28-DFEYs;w@Ls;7ExA0Z*qTr9fO1q;#_%Np<}SRS>t3ctViH-{>R>n{t27Qhz+ ztcwI0C2`nNoQe{s3QLtmw*zCiE9=T0_qN*y$(n5<)t=>-2BR=egpzp}x|d!C^FK#K z>4OGWxAjlOzRHbkNztH{XSIdTtL5$u%dGnaLh1SWT|2Q2A08K$|Ei+V`Y46Nj>j|$ zf(EOWrq@5c`Sek<+_x!ZA$7v-jrK3{Lu3tcVw~*qoSgWUQp0q6mAa@&THN1)sv!>z z*<_|ATb-NW-*HyU=`Fa%#hDpt&GSE(Ud`m0=2i`{I}~`lR(pCdHiFMLrBJ#V``{Hn zvb5d*TC;zi{P6i{EIdw4j;GdikJ6bhX;Y+H&EL~WHIvu?1;smTo8g5s=&wmpP1DDM zgi;;BrA&P84y=5zm@-ey_J0Ni0e5~15=&tQ#tu)U*Tts z`Sw&4#lrCJ)HE64W-46_txZU9A3o>S*ZTYH(cK+*`6g{Re&~KciMoTFuaG9t%udiu z3)s$MY)K@3!qR`s(G&#}W%_c%skL=eb1C6#6$!2>%G%EXhdw(g%txvkY4qX?*}ieK z4d{J;m~|a~d+n{`3(cd7URJzS?Dfm^;rk^U>P7`8!%pRPNL9&vLFUi{H+Q_(RvcON zZuio=i^^xoEuLvjINXs=-=EbL8m+DOLdbBwx~~mSPrK%>h+p%twK<}1+3r2MVeHQ? hCzn%6vsJOv+J+l0m5-*!n6GI63H+hpaQLcK{{`MC_}%~j literal 0 HcmV?d00001 diff --git a/src/main/resources/data/immersiveweapons/structures/graveyard.nbt b/src/main/resources/data/immersiveweapons/structures/graveyard.nbt index 81284ea55122b4f8e8d3d848e088e08576551fea..8524743689b1627add175af0a75a022fe793ce49 100644 GIT binary patch literal 7123 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 S47Ig#?QkH%MdmNK%8I)b1kvWtMAgai_jRJp>8 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 VD`)g7v?18% diff --git a/src/main/resources/data/immersiveweapons/structures/house_2.nbt b/src/main/resources/data/immersiveweapons/structures/house_2.nbt deleted file mode 100644 index 70a15b3247aca2695bb1e7f643d5f96ac788b831..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2414 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 YFXRfIWA}kIo^!X`@iyy`&$n&+FB~o(mjD0& diff --git a/src/main/resources/data/immersiveweapons/structures/pitfall_trap.nbt b/src/main/resources/data/immersiveweapons/structures/pitfall_trap.nbt index 7784698fbe25dd41c709472ef3bbc4ea70b35d3c..137f45886fbe2578141fa1065c91ec5c24e5ac24 100644 GIT binary patch literal 335 zcmb2|=3sz;-YEzD4jTx#9QWh$)!LyL>T%~s*E~yQzZmVydCJa7?%NhNtv~K)v6gA= z^`I2XO6$!tU80#qz1Htv!7yQ6(GBf0Cs|}oDtT5PI_jNmp1-fJ{Wq6ueyx^7c;ifd ztqb`_>w6LmKJh3^#5FBcmbB`$yuLZ5LhTy z(9Hek3adk<%XxF>+-kiVw!1;<>*US0I}_KOTimemxBr>4RbN{|N{ThI=6tIAYh1p3 zYj^FJvbDKVxBNukm0X|r`B(F|B~{sfR@IxYuX@|u$6Rw{9iN-m?vLL-5J1J#!LS4tpDvs5q+|72A5Zi6{Bupcry8u5RdH13!Oe%^QVX>^??La zPz4{IOYqx!ghe@BqVQOD*UZZkf$CpG8dV?jaQFN3dAX0-$GgF2c09K+m_B#a$!e)% zj~6-oTOxI+baC{ph^?PjuiYjmx+*=}YSZBe-6n_ZU-~*_tIAp;N{V%EML)gstNdMG z_Vn5h+qT|(pJ^So{JWH3Au70<;_Hy>~Qi%ubZ(e0A*8YzzzlR*ax@ diff --git a/src/main/resources/data/immersiveweapons/structures/underground_bunker.nbt b/src/main/resources/data/immersiveweapons/structures/underground_bunker.nbt index 7f5ad1e9196fe1f92f194b83ff8e294e0f9822f1..3d5dc7ddcf506f482167cd18df40150431b23d29 100644 GIT binary patch literal 6854 zcmcIpd0bP+_Rqp1hyo%aiv-+Kr9zRgNg&!PT2W#jB8x&)EFg>E!VXE$_XHY{`p|+v z5|v8Cpix0qA+aJz!*TNYzT2!Z@=KucSfzJGpvPEKaNbMDOCbG~=ZxdBF4 z0-FERoFMw8uV;HUP{(Jg?aD4>Ii%VDTLm6{+yZQFxE43@>w~m4PM6jQbx+>DR&?!T zINGbdzl5n~zUzmb>sN02B6IuNmFAb#x9?F||8wfj#8iVHx2I-O)(dhTzXS`Q+HRh$ z`Q6pdQRDLTEf(6v2vYwfu0LUH4kzi`M(K4b8d`seo{KFMnly~kEu%2sDV$Fa2G)}9 zQJObTV%*k5)KO}3pGLPCeOSX7oZ*R*~udxW5dP-){8`Y22KZiR?cCZ<_EOy87xUk9Y9x+458U zvYo?HE4sX?!<}#ML>G72TjIiIZ@tARCS+$v2l5-SHxedkvY8&@qXc%`A+O^TsaNJA*Zf0Wl@dia~QlCRijd!c0cZf;d zl@x%DD<_hRP2whr@k1}$2NrLOd<{o1wW<0jbAxP*vC2p0^>{h%cVXiWHj=|X} z%>~9^MDR>3$H)66XN9PwSdm*@wpGjNKL3bI)zp|ngu?Eavc`OeliHmgC3(b>r~A}e zZo#9yCeN^}>PA=i{P_5S6Z_kHc4FD>@>>|**yyS7dzQV=t`_*ydjzwWdG0f`w6l_> zMBRSx{gNI+vlaOqlIKLxsy!Q@*hi18sbsw%MAycjqi043bv*0p4w7zFFb)sY%DS#b z;Dltlq))=fwepwodn2&3_qbMc>8PZU4236F6$OnKz_I1@l(*f(NBh-#RlmA_8g4N4 znx>Ep5Oq5+;-)G`j?OERtK!~L7Obf%;|2dBaaYXK$*@5cFPSIt+!fmRDcpa&#)qoD z`Fc;y+q#DZNuiU8K2FnH?PYWA)pXI%3hhi(Oc}WlH<75Iq26|jGB^>L*e20Yd*f4s zD~UL(eUf`Mk7LWi+5M9Zvz%>@B7^k|f{ZJ_vJ(zzbL83NxfZfR<}5c%5B2)WK*bw| zadjGOrq4oKG314r?s>j(uDr%7X)Fj+`DP*rH)tU?u)_V$RM69K4t7G??4W^v9G68w z%^Khok6IPe3G~@C`xAPoX)(1L6_!^qeQQ9$gIRK-YSS|PZ)1mkz1v#D%j?Q+@9L|I z!41rC;BzC@BY9ntxgq@R}fM)kM0P1AT2d^@4+?Qn{%-u2VT^)?7S zLcMw}s7W8PUj<>^wtjmSWWO4s^2X^cxsc$!UwPSXb=UrVnEl)#3yeh)>R&b#T2DVX zxeps=lm*KROeZ&jP-UlqZmu1i;^lG~vA0XPz;8C)+Ff>5U12B@i3TR z2#N(j6eBZ&l`dT9ytAOtmMm;S1y2SE^gvh$0}YaDfKXsA93=lcnDi<-V zWcfQ;CJ1Ox7wUnrH^G3D9=wOa*tI|6)-upq(ljv2nhRHx*Wt;l1$t2I@lSvd>9>sO zt03%(NbCl#d@s<(i!8wM^?0&MK1RcV{tgGBlx+rj0E$}J%t}GldHFkmVE@HHYf8Tb zqc%N%FI>3lG+b4F0#6QONEkN_MF=P z8fLTueJHvW-8Q~!Cr-qoH@!$kMo6~ z-MA+;kXw=|8w8~)q@Nh=D`FQwRpebpNxUj&oTmIDbyx_B{lVDH0)LzmQeyv7Rcr~^M6uGHsf55U6{+&+LGBF(YZ#c_hm{l6!7I9PiA_ zUWD&tQO9!q+iUKCt=0k#Vtbm+%k}8n+g*wQS0f9C;UFBg#(M zE$ATeRxLdD%46Vfr-HJ}3PER(8}SBq&0R+BYJ=UKfbU|=NWa`PBmj<#RXTDgITopt zsXZv%fpkf2P#3D0kwA5N_*jSz+Cc|>f|dU2X`~rje^th{@h~GBb~nP;xuV9!uG#yN z=8j96>SwNO8GayNXLQ%}g)|M%w_Xib8&W$sXtGr&+w-KF5ts(%d~ zK=}Fq6|#f)0u=QZ!sJU1Odhk05c7Tg0{Xp(%+9Rq_5AWrN88=k7lEff|O?1L%Io!+Q6l#$gkkZD+C@N1%ae=0Oxsq?#}jE z&tw@DBF+vjZS4&c*}T1$6%N!%lOj9ccOzb^V>Hbd7=3QTWpeqk;LU%pr~X99Pn@gD z2jY%yvx>k5EZ+x0=`mXWsri{&>o24R=>K7f^-)p-;D`ME1k*oLWc`KI0R5LJ8N5(m z;mJCJbxOzezI(=};*2u@Ob>!pvR`Sa%Y_386R)hbfLe-yR#7GaU4b*Cb~i(^L~05i zSoe7vzvngyG@!>#fFz>vd<}s!xR&5L^Ee|~$y=R_`DGU~3XqaF0p*hX=XugD6jLNG z55ePHC4t|Qd9ld)C*CeH{2zGxCo=yNZxB?~dypnittRnCpakN$edVRWqpF;3Y~6?8 z&sq}d(??DL3OI0v9-LgOlUa!l&(&)Bo@bR;xSCY~4GnHjzk6e8XPav17e+QgoB-C& zqb6sG;qxg!z`ugA)FAfv{*Z<&Wh!#>3dNUpUNgu4s$c!}B>!hV}!FOXbQO83iqW7s+)Q5>hx@bJ?m#W#YRM&j}Uzl_+4 zf4U@cHF)_t#<9;GmWwPy>)pSo;r;Z4*)Z&ZJips|xrfeKO^1Eplug{PRL8T6jyk*zi zugMrkfrUEu6@z9Xy$YqD;d(8XZ&s7XQ+EZ(zHd*Tq#b8i^*RK6P?c|R$omy+#R+8P z_;(=+fwIk;PgSX*ttdXG(Rp7bw8F>u`(?Wd#M*vssB=3Mks<{Llu_9t@j(P234!TB ztl*?Q25-&%UO)4mJDrTV$%?<4`$=snU_!CPOjU$$tA_|^rn!z2LO!mE^Z0_M&A0zi zt3t6g{Xo{E=3>ACH*8^9r&9;d58=x{=R}I}#@dww{o|`L0Nten=%^k1gNK2_rpCkI zt^1>VGo!mPcdR!m^(&QWpD|zlL6P#}gCZc31lMt5$fq>v2jysJj#i!Ao!NSV9Z&IX z0{lQR0&1IhN{=j6ISkZy@AR{i{wEkq0l$6M{GldHc*fok@3LKpACTS+I^>_yzOpU{=1%k|GLVct&n;`=zFv((ob@ccqrAhm#mbmLIS!rIP8p4+xJ=B|Okmr13!U{0;ZT`HbiG+Ayf)H$Db|!6W3%4Y2P;nj6n_}CR(FNl1v+R(Sk z--j;|Uv`)I(GT)lj7DbLhlT5?uNEYu7s|8@Cq&C zhcibFP5XQ=?%!m0T8?h%5qF=hGjYJ);M&_^rPo{z#bk7{8?Xh+?me3vE(nEDkFx*%lJ0{!=D7H&pav zt(~OLpZ_$vjBZ1OMaNVpIR%wtjD|}^_0jBz$}M?p`1t6=iANf7(KF}0k`hK4lS$Xx zcM{?|i`n}XGW7u9x8VNCfD6BLR4sjR*?_lI5H{ZJUj2AB_d&CEwm7k>cJ{ZVa*S_j z$w`BOIrsiae8-x#dF%7Rh1>2umoL0*Hd%78T4BfK^EM8pX!)N zc}MxO;@+tqmovw@ql3hpN5qzwyg`@hrfnAtm}Smgj`MMZ$#Oic(J1fNs2-o$vNA3guj*lQa1?1G+y(B z*&B1_*s>m3Pv>6av1aNdl)>}LyhUufXaN%ertN%82!*SB}~Kg!Vil9IC9&vYtt z?36;aWXhG?S+Gk{!+b`emfLz!c=gwu=HlbFRzA@cK3hcIsaY zVvezSOnx-GxfK&Xvu5dip0vW+4;JMZ+8qrwYjBsDNYp%TwoK=KVTkE-N-_31EGjOd z**ih2qazDNJ6$5OUDx6wxv@T$=;hVARUXx?HH3IhQ}psc9Rp^v@HsUnh>}osq~@o* z_;nk{hkXZ*Alxg)=34gLHZb+X%-)>Eq)Zv~U+#U<_hQDtZf_rNlK5re$l2w?mzy=Z zQ7~=o#I{#C?3kkwc7CCO{>53|v6MWq?SJ3_mGGtAQ-=$VR2^7hj`nZp;vsW)!;-?+ oy=C3kMZ&9nY2#?|`Dl)_3%z+71N_TMp@4!ON46agdjkUfAM#1d{Qv*} literal 6950 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 Q6eoRIVBvAkbKAE60cP%xD*ylh diff --git a/src/main/resources/data/immersiveweapons/structures/village/battlefield/houses/soldier_post.nbt b/src/main/resources/data/immersiveweapons/structures/village/battlefield/houses/soldier_post.nbt deleted file mode 100644 index 8d0f39f9c9940894ad0c3d89a1a893e2195fe16f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4085 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 diff --git a/src/main/resources/data/immersiveweapons/worldgen/biome/battlefield.json b/src/main/resources/data/immersiveweapons/worldgen/biome/battlefield.json new file mode 100644 index 000000000..4479a6ad6 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/biome/battlefield.json @@ -0,0 +1,198 @@ +{ + "temperature": 0.8, + "downfall": 0.3, + "precipitation": "rain", + "temperature_modifier": "none", + "category": "plains", + "effects": { + "sky_color": 7628662, + "fog_color": 9464960, + "water_color": 5580620, + "water_fog_color": 5258098, + "grass_color": 5576464, + "foliage_color": 4468277, + "grass_color_modifier": "none", + "ambient_sound": "immersiveweapons:battlefield_ambient", + "mood_sound": { + "sound": "immersiveweapons:flintlock_pistol_fire", + "tick_delay": 1200, + "block_search_extent": 8, + "offset": 15 + } + }, + "spawners": { + "monster": [ + { + "type": "immersiveweapons:dying_soldier", + "weight": 95, + "minCount": 2, + "maxCount": 6 + }, + { + "type": "immersiveweapons:wandering_warrior", + "weight": 75, + "minCount": 1, + "maxCount": 1 + }, + { + "type": "minecraft:spider", + "weight": 100, + "minCount": 4, + "maxCount": 4 + }, + { + "type": "minecraft:zombie", + "weight": 95, + "minCount": 4, + "maxCount": 4 + }, + { + "type": "minecraft:zombie_villager", + "weight": 5, + "minCount": 1, + "maxCount": 1 + }, + { + "type": "minecraft:skeleton", + "weight": 100, + "minCount": 4, + "maxCount": 4 + }, + { + "type": "minecraft:creeper", + "weight": 100, + "minCount": 4, + "maxCount": 4 + }, + { + "type": "minecraft:slime", + "weight": 100, + "minCount": 4, + "maxCount": 4 + }, + { + "type": "minecraft:enderman", + "weight": 10, + "minCount": 1, + "maxCount": 4 + }, + { + "type": "minecraft:witch", + "weight": 5, + "minCount": 1, + "maxCount": 1 + } + ], + "creature": [ + { + "type": "minecraft:pig", + "weight": 10, + "minCount": 2, + "maxCount": 2 + }, + { + "type": "minecraft:chicken", + "weight": 10, + "minCount": 2, + "maxCount": 3 + }, + { + "type": "minecraft:cow", + "weight": 8, + "minCount": 1, + "maxCount": 3 + }, + { + "type": "minecraft:horse", + "weight": 5, + "minCount": 2, + "maxCount": 3 + }, + { + "type": "minecraft:donkey", + "weight": 1, + "minCount": 1, + "maxCount": 2 + } + ], + "ambient": [ + { + "type": "minecraft:bat", + "weight": 10, + "minCount": 8, + "maxCount": 8 + } + ] + }, + "spawn_costs": {}, + "carvers": { + "air": [ + "immersiveweapons:trench" + ] + }, + "features": [ + [], + [ + "minecraft:lake_lava_underground", + "minecraft:lake_lava_surface" + ], + [ + "minecraft:amethyst_geode" + ], + [ + "minecraft:monster_room", + "minecraft:monster_room_deep" + ], + [], + [], + [ + "minecraft:ore_dirt", + "minecraft:ore_gravel", + "minecraft:ore_granite_upper", + "minecraft:ore_granite_lower", + "minecraft:ore_diorite_upper", + "minecraft:ore_diorite_lower", + "minecraft:ore_andesite_upper", + "minecraft:ore_andesite_lower", + "minecraft:ore_tuff", + "minecraft:ore_coal_upper", + "minecraft:ore_coal_lower", + "minecraft:ore_iron_upper", + "minecraft:ore_iron_middle", + "minecraft:ore_iron_small", + "minecraft:ore_gold", + "minecraft:ore_gold_lower", + "minecraft:ore_redstone", + "minecraft:ore_redstone_lower", + "minecraft:ore_diamond", + "minecraft:ore_diamond_large", + "minecraft:ore_diamond_buried", + "minecraft:ore_lapis", + "minecraft:ore_lapis_buried", + "minecraft:ore_copper", + "minecraft:underwater_magma", + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel" + ], + [], + [ + "minecraft:spring_water", + "minecraft:spring_lava" + ], + [ + "minecraft:glow_lichen", + "minecraft:patch_tall_grass_2", + "immersiveweapons:burned_oak_tree", + "minecraft:patch_grass_plain", + "immersiveweapons:patch_wooden_spikes", + "minecraft:brown_mushroom_normal", + "minecraft:red_mushroom_normal", + "minecraft:patch_sugar_cane", + "minecraft:patch_pumpkin" + ], + [ + "minecraft:freeze_top_layer" + ] + ] +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/biome/tiltros.json b/src/main/resources/data/immersiveweapons/worldgen/biome/tiltros.json new file mode 100644 index 000000000..eadb058a0 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/biome/tiltros.json @@ -0,0 +1,100 @@ +{ + "temperature": 0.6, + "downfall": 0, + "precipitation": "none", + "temperature_modifier": "none", + "category": "extreme_hills", + "effects": { + "sky_color": 461620, + "fog_color": 2830199, + "water_color": 7031172, + "water_fog_color": 4732021, + "grass_color": 16113331, + "foliage_color": 14665365, + "grass_color_modifier": "none", + "music": { + "sound": "immersiveweapons:tiltros_ambient", + "min_delay": 240, + "max_delay": 1200, + "replace_current_music": true + } + }, + "spawners": { + "monster": [ + { + "type": "immersiveweapons:rock_spider", + "weight": 65, + "minCount": 2, + "maxCount": 4 + }, + { + "type": "immersiveweapons:lava_revenant", + "weight": 35, + "minCount": 1, + "maxCount": 1 + }, + { + "type": "immersiveweapons:celestial_tower", + "weight": 15, + "minCount": 1, + "maxCount": 1 + } + ] + }, + "spawn_costs": {}, + "carvers": { + "air": [ + "immersiveweapons:tiltros" + ] + }, + "features": [ + [], + [ + "minecraft:lake_lava_underground", + "minecraft:lake_lava_surface" + ], + [ + "minecraft:amethyst_geode" + ], + [], + [], + [ + "minecraft:ore_dirt", + "minecraft:ore_gravel", + "minecraft:ore_granite_upper", + "minecraft:ore_granite_lower", + "minecraft:ore_diorite_upper", + "minecraft:ore_diorite_lower", + "minecraft:ore_andesite_upper", + "minecraft:ore_andesite_lower", + "minecraft:ore_tuff", + "minecraft:ore_coal_upper", + "minecraft:ore_coal_lower", + "minecraft:ore_iron_upper", + "minecraft:ore_iron_middle", + "minecraft:ore_iron_small", + "minecraft:ore_gold", + "minecraft:ore_gold_lower", + "minecraft:ore_redstone", + "minecraft:ore_redstone_lower", + "minecraft:ore_diamond", + "minecraft:ore_diamond_large", + "minecraft:ore_diamond_buried", + "minecraft:ore_lapis", + "minecraft:ore_lapis_buried", + "minecraft:ore_copper", + "minecraft:underwater_magma", + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel" + ], + [], + [ + "minecraft:spring_water", + "minecraft:spring_lava" + ], + [ + "minecraft:glow_lichen" + ] + ] +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_carver/tiltros.json b/src/main/resources/data/immersiveweapons/worldgen/configured_carver/tiltros.json new file mode 100644 index 000000000..e77d3686e --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_carver/tiltros.json @@ -0,0 +1,47 @@ +{ + "type": "minecraft:canyon", + "config": { + "probability": 0.65, + "y": { + "type": "minecraft:trapezoid", + "min_inclusive": { + "absolute": 0 + }, + "max_inclusive": { + "absolute": 256 + }, + "plateau": 64 + }, + "yScale": 3, + "lava_level": { + "absolute": -48 + }, + "debug_settings": { + "debug_mode": false, + "air_state": { + "Name": "minecraft:stone_bricks" + } + }, + "vertical_rotation": { + "type": "minecraft:uniform", + "value": { + "min_inclusive": 3, + "max_exclusive": 7 + } + }, + "shape": { + "distance_factor": { + "type": "minecraft:constant", + "value": 35 + }, + "thickness": { + "type": "minecraft:constant", + "value": 4 + }, + "width_smoothness": 3, + "horizontal_radius_factor": 3, + "vertical_radius_default_factor": 3, + "vertical_radius_center_factor": 3 + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_carver/trench.json b/src/main/resources/data/immersiveweapons/worldgen/configured_carver/trench.json new file mode 100644 index 000000000..e44cbd0b3 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_carver/trench.json @@ -0,0 +1,44 @@ +{ + "type": "minecraft:canyon", + "config": { + "probability": 0.35, + "y": { + "type": "minecraft:biased_to_bottom", + "min_inclusive": { + "absolute": 0 + }, + "max_inclusive": { + "absolute": 172 + }, + "inner": 68 + }, + "yScale": 0.75, + "lava_level": { + "absolute": 0 + }, + "debug_settings": { + "debug_mode": false, + "air_state": { + "Name": "minecraft:stone_bricks" + } + }, + "vertical_rotation": { + "type": "minecraft:uniform", + "value": { + "min_inclusive": 0, + "max_exclusive": 16 + } + }, + "shape": { + "distance_factor": { + "type": "minecraft:constant", + "value": 15 + }, + "thickness": 1, + "width_smoothness": 2, + "horizontal_radius_factor": 2, + "vertical_radius_default_factor": 1, + "vertical_radius_center_factor": 1 + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_feature/burned_oak_tree.json b/src/main/resources/data/immersiveweapons/worldgen/configured_feature/burned_oak_tree.json new file mode 100644 index 000000000..97b95df1f --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_feature/burned_oak_tree.json @@ -0,0 +1,56 @@ +{ + "type": "minecraft:tree", + "config": { + "ignore_vines": true, + "force_dirt": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 0, + "upper_size": 1 + }, + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "immersiveweapons:burned_oak_log", + "Properties": { + "axis": "y" + } + } + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:air", + "Properties": { + "persistent": "false", + "distance": "0" + } + } + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 7, + "height_rand_a": 3, + "height_rand_b": 3 + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "radius": 0, + "offset": 0, + "height": 0 + }, + "decorators": [ + { + "type": "immersiveweapons:burned_branch", + "probability": 0.95 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_feature/patch_wooden_spikes.json b/src/main/resources/data/immersiveweapons/worldgen/configured_feature/patch_wooden_spikes.json new file mode 100644 index 000000000..e8d4560f4 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_feature/patch_wooden_spikes.json @@ -0,0 +1,11 @@ +{ + "config": { + "state_provider": { + "state": { + "Name": "immersiveweapons:wooden_spikes" + }, + "type": "minecraft:simple_state_provider" + } + }, + "type": "minecraft:block_pile" +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/abandoned_factory.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/abandoned_factory.json new file mode 100644 index 000000000..94d6399d7 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/abandoned_factory.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:village", + + "config": { + "start_pool": "immersiveweapons:abandoned_factory/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/abandoned_factory", + + "adapt_noise": true, + + "spawn_overrides": { + "monster": { + "bounding_box": "full", + "spawns": [ + { + "type": "minecraft:zombie", + "weight": 1, + "minCount": 1, + "maxCount": 2 + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/battlefield_camp.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/battlefield_camp.json new file mode 100644 index 000000000..f818dd3c3 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/battlefield_camp.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:village", + + "config": { + "start_pool": "immersiveweapons:battlefield_camp/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/battlefield_camp", + + "adapt_noise": true, + + "spawn_overrides": { + "monster": { + "bounding_box": "full", + "spawns": [ + { + "type": "immersiveweapons:dying_soldier", + "weight": 1, + "minCount": 2, + "maxCount": 2 + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/battlefield_town.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/battlefield_town.json new file mode 100644 index 000000000..55452db0a --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/battlefield_town.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:village", + + "config": { + "start_pool": "immersiveweapons:battlefield_town/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/battlefield_town", + + "adapt_noise": true, + + "spawn_overrides": { + "creature": { + "bounding_box": "full", + "spawns": [ + { + "type": "minecraft:cat", + "weight": 1, + "minCount": 1, + "maxCount": 2 + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/bear_trap.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/bear_trap.json new file mode 100644 index 000000000..4f499c2d9 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/bear_trap.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:village", + + "config": { + "start_pool": "immersiveweapons:bear_trap/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/bear_trap", + + "adapt_noise": true, + + "spawn_overrides": {} +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/campsite.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/campsite.json new file mode 100644 index 000000000..e2ec3e4f2 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/campsite.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:village", + + "config": { + "start_pool": "immersiveweapons:campsite/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/campsite", + + "adapt_noise": true, + + "spawn_overrides": { + "monster": { + "bounding_box": "full", + "spawns": [ + { + "type": "immersiveweapons:minuteman", + "weight": 1, + "minCount": 1, + "maxCount": 2 + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/cloud_island.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/cloud_island.json new file mode 100644 index 000000000..2c414f49d --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/cloud_island.json @@ -0,0 +1,14 @@ +{ + "type": "immersiveweapons:cloud_island", + + "config": { + "start_pool": "immersiveweapons:cloud_island/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/cloud_island", + + "adapt_noise": false, + + "spawn_overrides": {} +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/destroyed_house.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/destroyed_house.json new file mode 100644 index 000000000..bb0fe5b06 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/destroyed_house.json @@ -0,0 +1,26 @@ +{ + "type": "immersiveweapons:destroyed_house", + + "config": { + "start_pool": "immersiveweapons:destroyed_house/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/destroyed_house", + + "adapt_noise": true, + + "spawn_overrides": { + "monster": { + "bounding_box": "full", + "spawns": [ + { + "type": "minecraft:zombie", + "weight": 1, + "minCount": 1, + "maxCount": 1 + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/graveyard.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/graveyard.json new file mode 100644 index 000000000..32da07a64 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/graveyard.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:village", + + "config": { + "start_pool": "immersiveweapons:graveyard/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/graveyard", + + "adapt_noise": true, + + "spawn_overrides": { + "monster": { + "bounding_box": "full", + "spawns": [ + { + "type": "minecraft:skeleton", + "weight": 1, + "minCount": 1, + "maxCount": 1 + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/hans_hut.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/hans_hut.json new file mode 100644 index 000000000..e8810dbb4 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/hans_hut.json @@ -0,0 +1,14 @@ +{ + "type": "immersiveweapons:hans_hut", + + "config": { + "start_pool": "immersiveweapons:hans_hut/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/hans_hut", + + "adapt_noise": true, + + "spawn_overrides": {} +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/landmine_trap.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/landmine_trap.json new file mode 100644 index 000000000..6077136b8 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/landmine_trap.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:village", + + "config": { + "start_pool": "immersiveweapons:landmine_trap/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/landmine_trap", + + "adapt_noise": true, + + "spawn_overrides": {} +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/pitfall_trap.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/pitfall_trap.json new file mode 100644 index 000000000..6fcd72197 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/pitfall_trap.json @@ -0,0 +1,14 @@ +{ + "type": "immersiveweapons:pitfall_trap", + + "config": { + "start_pool": "immersiveweapons:pitfall_trap/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/pitfall_trap", + + "adapt_noise": false, + + "spawn_overrides": {} +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/underground_bunker.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/underground_bunker.json new file mode 100644 index 000000000..a17f5ea46 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/underground_bunker.json @@ -0,0 +1,26 @@ +{ + "type": "immersiveweapons:underground_bunker", + + "config": { + "start_pool": "immersiveweapons:underground_bunker/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/underground_bunker", + + "adapt_noise": false, + + "spawn_overrides": { + "monster": { + "bounding_box": "full", + "spawns": [ + { + "type": "immersiveweapons:dying_soldier", + "weight": 1, + "minCount": 2, + "maxCount": 3 + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/water_tower.json b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/water_tower.json new file mode 100644 index 000000000..3e5df1298 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/configured_structure_feature/water_tower.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:village", + + "config": { + "start_pool": "immersiveweapons:water_tower/start_pool", + "size": 1 + }, + + "biomes": "#immersiveweapons:has_structure/water_tower", + + "adapt_noise": true, + + "spawn_overrides": {} +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/noise_settings/tiltros.json b/src/main/resources/data/immersiveweapons/worldgen/noise_settings/tiltros.json new file mode 100644 index 000000000..4b9232156 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/noise_settings/tiltros.json @@ -0,0 +1,2947 @@ +{ + "aquifers_enabled": true, + "ore_veins_enabled": true, + "legacy_random_source": false, + "sea_level": -64, + "disable_mob_generation": false, + "default_fluid": { + "Properties": { + "level": "0" + }, + "Name": "minecraft:water" + }, + "noise_router": { + "final_density": { + "argument1": { + "argument": { + "argument1": 0.64, + "argument2": { + "argument": { + "argument": { + "argument": { + "max_exclusive": 1.5625, + "when_in_range": { + "argument1": "minecraft:overworld/sloped_cheese", + "argument2": { + "argument1": 5.0, + "argument2": "minecraft:overworld/caves/entrances", + "type": "minecraft:mul" + }, + "type": "minecraft:min" + }, + "when_out_of_range": { + "argument1": { + "argument1": { + "argument1": { + "argument1": { + "argument1": 4.0, + "argument2": { + "argument": { + "noise": "minecraft:cave_layer", + "xz_scale": 1.0, + "y_scale": 8.0, + "type": "minecraft:noise" + }, + "type": "minecraft:square" + }, + "type": "minecraft:mul" + }, + "argument2": { + "argument1": { + "input": { + "argument1": 0.27, + "argument2": { + "noise": "minecraft:cave_cheese", + "xz_scale": 1.0, + "y_scale": 0.6666666666666666, + "type": "minecraft:noise" + }, + "type": "minecraft:add" + }, + "min": -1.0, + "max": 1.0, + "type": "minecraft:clamp" + }, + "argument2": { + "input": { + "argument1": 1.5, + "argument2": { + "argument1": -0.64, + "argument2": "minecraft:overworld/sloped_cheese", + "type": "minecraft:mul" + }, + "type": "minecraft:add" + }, + "min": 0.0, + "max": 0.5, + "type": "minecraft:clamp" + }, + "type": "minecraft:add" + }, + "type": "minecraft:add" + }, + "argument2": "minecraft:overworld/caves/entrances", + "type": "minecraft:min" + }, + "argument2": { + "argument1": "minecraft:overworld/caves/spaghetti_2d", + "argument2": "minecraft:overworld/caves/spaghetti_roughness_function", + "type": "minecraft:add" + }, + "type": "minecraft:min" + }, + "argument2": { + "max_exclusive": 0.03, + "when_in_range": -1000000.0, + "when_out_of_range": "minecraft:overworld/caves/pillars", + "input": "minecraft:overworld/caves/pillars", + "min_inclusive": -1000000.0, + "type": "minecraft:range_choice" + }, + "type": "minecraft:max" + }, + "input": "minecraft:overworld/sloped_cheese", + "min_inclusive": -1000000.0, + "type": "minecraft:range_choice" + }, + "type": "minecraft:slide" + }, + "type": "minecraft:blend_density" + }, + "type": "minecraft:interpolated" + }, + "type": "minecraft:mul" + }, + "type": "minecraft:squeeze" + }, + "argument2": "minecraft:overworld/caves/noodle", + "type": "minecraft:min" + }, + "vein_toggle": { + "argument": { + "max_exclusive": 51.0, + "when_in_range": { + "noise": "minecraft:ore_veininess", + "xz_scale": 1.5, + "y_scale": 1.5, + "type": "minecraft:noise" + }, + "when_out_of_range": 0.0, + "input": "minecraft:y", + "min_inclusive": -60.0, + "type": "minecraft:range_choice" + }, + "type": "minecraft:interpolated" + }, + "vein_ridged": { + "argument1": -0.07999999821186066, + "argument2": { + "argument1": { + "argument": { + "argument": { + "max_exclusive": 51.0, + "when_in_range": { + "noise": "minecraft:ore_vein_a", + "xz_scale": 4.0, + "y_scale": 4.0, + "type": "minecraft:noise" + }, + "when_out_of_range": 0.0, + "input": "minecraft:y", + "min_inclusive": -60.0, + "type": "minecraft:range_choice" + }, + "type": "minecraft:interpolated" + }, + "type": "minecraft:abs" + }, + "argument2": { + "argument": { + "argument": { + "max_exclusive": 51.0, + "when_in_range": { + "noise": "minecraft:ore_vein_b", + "xz_scale": 4.0, + "y_scale": 4.0, + "type": "minecraft:noise" + }, + "when_out_of_range": 0.0, + "input": "minecraft:y", + "min_inclusive": -60.0, + "type": "minecraft:range_choice" + }, + "type": "minecraft:interpolated" + }, + "type": "minecraft:abs" + }, + "type": "minecraft:max" + }, + "type": "minecraft:add" + }, + "vein_gap": { + "noise": "minecraft:ore_gap", + "xz_scale": 1.0, + "y_scale": 1.0, + "type": "minecraft:noise" + }, + "erosion": "minecraft:overworld/erosion", + "depth": "minecraft:overworld/depth", + "ridges": "minecraft:overworld/ridges", + "initial_density_without_jaggedness": { + "argument1": 4.0, + "argument2": { + "argument": { + "argument1": "minecraft:overworld/depth", + "argument2": { + "argument": "minecraft:overworld/factor", + "type": "minecraft:cache_2d" + }, + "type": "minecraft:mul" + }, + "type": "minecraft:quarter_negative" + }, + "type": "minecraft:mul" + }, + "lava": { + "noise": "minecraft:aquifer_lava", + "xz_scale": 1.0, + "y_scale": 1.0, + "type": "minecraft:noise" + }, + "temperature": { + "xz_scale": 0.25, + "y_scale": 0.0, + "noise": "minecraft:temperature", + "shift_x": "minecraft:shift_x", + "shift_y": 0.0, + "shift_z": "minecraft:shift_z", + "type": "minecraft:shifted_noise" + }, + "vegetation": { + "xz_scale": 0.25, + "y_scale": 0.0, + "noise": "minecraft:vegetation", + "shift_x": "minecraft:shift_x", + "shift_y": 0.0, + "shift_z": "minecraft:shift_z", + "type": "minecraft:shifted_noise" + }, + "continents": "minecraft:overworld/continents", + "barrier": { + "noise": "minecraft:aquifer_barrier", + "xz_scale": 1.0, + "y_scale": 0.5, + "type": "minecraft:noise" + }, + "fluid_level_floodedness": { + "noise": "minecraft:aquifer_fluid_level_floodedness", + "xz_scale": 1.0, + "y_scale": 0.67, + "type": "minecraft:noise" + }, + "fluid_level_spread": { + "noise": "minecraft:aquifer_fluid_level_spread", + "xz_scale": 1.0, + "y_scale": 0.7142857142857143, + "type": "minecraft:noise" + } + }, + "surface_rule": { + "sequence": [ + { + "if_true": { + "random_name": "minecraft:bedrock_floor", + "true_at_and_below": { + "above_bottom": 0 + }, + "false_at_and_above": { + "above_bottom": 5 + }, + "type": "minecraft:vertical_gradient" + }, + "then_run": { + "result_state": { + "Name": "minecraft:bedrock" + }, + "type": "minecraft:block" + }, + "type": "minecraft:condition" + }, + { + "if_true": { + "random_name": "minecraft:deepslate", + "true_at_and_below": { + "absolute": 0 + }, + "false_at_and_above": { + "absolute": 8 + }, + "type": "minecraft:vertical_gradient" + }, + "then_run": { + "result_state": { + "Properties": { + "axis": "y" + }, + "Name": "minecraft:deepslate" + }, + "type": "minecraft:block" + }, + "type": "minecraft:condition" + } + ], + "type": "minecraft:sequence" + }, + "noise": { + "bottom_slide": { + "target": 0.1171875, + "size": 3, + "offset": 0 + }, + "size_horizontal": 1, + "size_vertical": 2, + "terrain_shaper": { + "offset": { + "coordinate": "continents", + "points": [ + { + "location": -1.1, + "value": 0.044, + "derivative": 0.0 + }, + { + "location": -1.02, + "value": -0.2222, + "derivative": 0.0 + }, + { + "location": -0.51, + "value": -0.2222, + "derivative": 0.0 + }, + { + "location": -0.44, + "value": -0.12, + "derivative": 0.0 + }, + { + "location": -0.18, + "value": -0.12, + "derivative": 0.0 + }, + { + "location": -0.16, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.85, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.08880186, + "derivative": 0.38940096 + }, + { + "location": 1.0, + "value": 0.69000006, + "derivative": 0.38940096 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.115760356, + "derivative": 0.37788022 + }, + { + "location": 1.0, + "value": 0.6400001, + "derivative": 0.37788022 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.2222, + "derivative": 0.0 + }, + { + "location": -0.75, + "value": -0.2222, + "derivative": 0.0 + }, + { + "location": -0.65, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.5954547, + "value": 2.9802322E-8, + "derivative": 0.0 + }, + { + "location": 0.6054547, + "value": 2.9802322E-8, + "derivative": 0.2534563 + }, + { + "location": 1.0, + "value": 0.100000024, + "derivative": 0.2534563 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.3, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": 0.060000002, + "derivative": 0.007000001 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.15, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.05, + "derivative": 0.1 + }, + { + "location": 1.0, + "value": 0.060000002, + "derivative": 0.007000001 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.15, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": 0.0, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.02, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": -0.03, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": -0.03, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.0, + "derivative": 0.06 + }, + { + "location": 1.0, + "value": 0.0, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.15, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.85, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.08880186, + "derivative": 0.38940096 + }, + { + "location": 1.0, + "value": 0.69000006, + "derivative": 0.38940096 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.115760356, + "derivative": 0.37788022 + }, + { + "location": 1.0, + "value": 0.6400001, + "derivative": 0.37788022 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.2222, + "derivative": 0.0 + }, + { + "location": -0.75, + "value": -0.2222, + "derivative": 0.0 + }, + { + "location": -0.65, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.5954547, + "value": 2.9802322E-8, + "derivative": 0.0 + }, + { + "location": 0.6054547, + "value": 2.9802322E-8, + "derivative": 0.2534563 + }, + { + "location": 1.0, + "value": 0.100000024, + "derivative": 0.2534563 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.3, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": 0.060000002, + "derivative": 0.007000001 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.15, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.05, + "derivative": 0.1 + }, + { + "location": 1.0, + "value": 0.060000002, + "derivative": 0.007000001 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.15, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": 0.0, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.02, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": -0.03, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": -0.03, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.0, + "derivative": 0.06 + }, + { + "location": 1.0, + "value": 0.0, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.85, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.08880186, + "derivative": 0.38940096 + }, + { + "location": 1.0, + "value": 0.69000006, + "derivative": 0.38940096 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.115760356, + "derivative": 0.37788022 + }, + { + "location": 1.0, + "value": 0.6400001, + "derivative": 0.37788022 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.2222, + "derivative": 0.0 + }, + { + "location": -0.75, + "value": -0.2222, + "derivative": 0.0 + }, + { + "location": -0.65, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.5954547, + "value": 2.9802322E-8, + "derivative": 0.0 + }, + { + "location": 0.6054547, + "value": 2.9802322E-8, + "derivative": 0.2534563 + }, + { + "location": 1.0, + "value": 0.100000024, + "derivative": 0.2534563 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.25, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.05, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": 0.060000002, + "derivative": 0.007000001 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.001, + "derivative": 0.01 + }, + { + "location": 0.0, + "value": 0.003, + "derivative": 0.01 + }, + { + "location": 0.4, + "value": 0.05, + "derivative": 0.094000004 + }, + { + "location": 1.0, + "value": 0.060000002, + "derivative": 0.007000001 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.02, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": -0.03, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": -0.03, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.12 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.25, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.85, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": 0.20235021, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.7161751, + "derivative": 0.5138249 + }, + { + "location": 1.0, + "value": 1.23, + "derivative": 0.5138249 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": 0.2, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.44682026, + "derivative": 0.43317974 + }, + { + "location": 1.0, + "value": 0.88, + "derivative": 0.43317974 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": 0.2, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.30829495, + "derivative": 0.3917051 + }, + { + "location": 1.0, + "value": 0.70000005, + "derivative": 0.3917051 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.25, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.35, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.35, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.35, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": 0.42000002, + "derivative": 0.049000014 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.0069999998, + "derivative": 0.07 + }, + { + "location": 0.0, + "value": 0.021, + "derivative": 0.07 + }, + { + "location": 0.4, + "value": 0.35, + "derivative": 0.658 + }, + { + "location": 1.0, + "value": 0.42000002, + "derivative": 0.049000014 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.45, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.17, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.55, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.17, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.58, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.1, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.02, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": -0.03, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": -0.03, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.12 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.85, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": 0.34792626, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.9239631, + "derivative": 0.5760369 + }, + { + "location": 1.0, + "value": 1.5, + "derivative": 0.5760369 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": 0.2, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.5391705, + "derivative": 0.4608295 + }, + { + "location": 1.0, + "value": 1.0, + "derivative": 0.4608295 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": 0.2, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.5391705, + "derivative": 0.4608295 + }, + { + "location": 1.0, + "value": 1.0, + "derivative": 0.4608295 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.2, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.5, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.5, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.5, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": 0.6, + "derivative": 0.070000015 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.05, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.099999994 + }, + { + "location": 0.0, + "value": 0.03, + "derivative": 0.099999994 + }, + { + "location": 0.4, + "value": 0.5, + "derivative": 0.94 + }, + { + "location": 1.0, + "value": 0.6, + "derivative": 0.070000015 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.05, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.05, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.45, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.05, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.05, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.17, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.55, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.05, + "derivative": 0.0 + }, + { + "location": -0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.05, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.17, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.58, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.05, + "derivative": 0.5 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.7, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -1.0, + "value": -0.02, + "derivative": 0.015 + }, + { + "location": -0.4, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.0, + "value": 0.01, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": 0.03, + "derivative": 0.04 + }, + { + "location": 1.0, + "value": 0.1, + "derivative": 0.049 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "factor": { + "coordinate": "continents", + "points": [ + { + "location": -0.19, + "value": 3.95, + "derivative": 0.0 + }, + { + "location": -0.15, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.6, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 6.25, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.5, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.05, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": 2.67, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 6.25, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.25, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 6.25, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.05, + "value": 2.67, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": 6.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.03, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 6.25, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.35, + "value": 6.25, + "derivative": 0.0 + }, + { + "location": 0.45, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -0.9, + "value": 6.25, + "derivative": 0.0 + }, + { + "location": -0.69, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": 0.0, + "value": 6.25, + "derivative": 0.0 + }, + { + "location": 0.1, + "value": 0.625, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.55, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -0.9, + "value": 6.25, + "derivative": 0.0 + }, + { + "location": -0.69, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": 0.0, + "value": 6.25, + "derivative": 0.0 + }, + { + "location": 0.1, + "value": 0.625, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.62, + "value": 6.25, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.6, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 5.47, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.5, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.05, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": 2.67, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 5.47, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.25, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 5.47, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.05, + "value": 2.67, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": 6.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.03, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 5.47, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.35, + "value": 5.47, + "derivative": 0.0 + }, + { + "location": 0.45, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -0.9, + "value": 5.47, + "derivative": 0.0 + }, + { + "location": -0.69, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": 0.0, + "value": 5.47, + "derivative": 0.0 + }, + { + "location": 0.1, + "value": 0.625, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.55, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -0.9, + "value": 5.47, + "derivative": 0.0 + }, + { + "location": -0.69, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": 0.0, + "value": 5.47, + "derivative": 0.0 + }, + { + "location": 0.1, + "value": 0.625, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.62, + "value": 5.47, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.03, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.6, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 5.08, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.5, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.05, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": 2.67, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 5.08, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.25, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 5.08, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.05, + "value": 2.67, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": 6.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.03, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 5.08, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.35, + "value": 5.08, + "derivative": 0.0 + }, + { + "location": 0.45, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -0.9, + "value": 5.08, + "derivative": 0.0 + }, + { + "location": -0.69, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": 0.0, + "value": 5.08, + "derivative": 0.0 + }, + { + "location": 0.1, + "value": 0.625, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.55, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -0.9, + "value": 5.08, + "derivative": 0.0 + }, + { + "location": -0.69, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": 0.0, + "value": 5.08, + "derivative": 0.0 + }, + { + "location": 0.1, + "value": 0.625, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.62, + "value": 5.08, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.06, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -0.6, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.5, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.05, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": 2.67, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.35, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.25, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.1, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.05, + "value": 2.67, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": 6.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.03, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.05, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": 0.45, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.7, + "value": 1.56, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.4, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": 0.45, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.7, + "value": 1.56, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.45, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -0.7, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.15, + "value": 1.37, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.55, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": -0.7, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.2, + "value": 6.3, + "derivative": 0.0 + }, + { + "location": 0.2, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.15, + "value": 1.37, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.58, + "value": 4.69, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "jaggedness": { + "coordinate": "continents", + "points": [ + { + "location": -0.11, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.03, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -1.0, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": 0.19999999, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.44999996, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.01, + "value": 0.63, + "derivative": 0.0 + }, + { + "location": 0.01, + "value": 0.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.78, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": 0.19999999, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.44999996, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.01, + "value": 0.315, + "derivative": 0.0 + }, + { + "location": 0.01, + "value": 0.15, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.5775, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": 0.19999999, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.44999996, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.01, + "value": 0.315, + "derivative": 0.0 + }, + { + "location": 0.01, + "value": 0.15, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.375, + "value": 0.0, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 0.65, + "value": { + "coordinate": "erosion", + "points": [ + { + "location": -1.0, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": 0.19999999, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.44999996, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.01, + "value": 0.63, + "derivative": 0.0 + }, + { + "location": 0.01, + "value": 0.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.01, + "value": 0.63, + "derivative": 0.0 + }, + { + "location": 0.01, + "value": 0.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.78, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": 0.19999999, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.44999996, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.01, + "value": 0.63, + "derivative": 0.0 + }, + { + "location": 0.01, + "value": 0.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.5775, + "value": { + "coordinate": "ridges", + "points": [ + { + "location": 0.19999999, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 0.44999996, + "value": 0.0, + "derivative": 0.0 + }, + { + "location": 1.0, + "value": { + "coordinate": "weirdness", + "points": [ + { + "location": -0.01, + "value": 0.63, + "derivative": 0.0 + }, + { + "location": 0.01, + "value": 0.3, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + }, + { + "location": -0.375, + "value": 0.0, + "derivative": 0.0 + } + ] + }, + "derivative": 0.0 + } + ] + } + }, + "min_y": -64, + "height": 384, + "sampling": { + "xz_scale": 1.0, + "y_scale": 1.0, + "xz_factor": 80.0, + "y_factor": 160.0 + }, + "top_slide": { + "target": -0.078125, + "size": 2, + "offset": 8 + } + }, + "default_block": { + "Name": "minecraft:stone" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/placed_feature/burned_oak_tree.json b/src/main/resources/data/immersiveweapons/worldgen/placed_feature/burned_oak_tree.json new file mode 100644 index 000000000..1f9e567e9 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/placed_feature/burned_oak_tree.json @@ -0,0 +1,47 @@ +{ + "feature": "immersiveweapons:burned_oak_tree", + "placement": [ + { + "count": { + "distribution": [ + { + "data": 0, + "weight": 7 + }, + { + "data": 1, + "weight": 1 + } + ], + "type": "minecraft:weighted_list" + }, + "type": "minecraft:count" + }, + { + "type": "minecraft:in_square" + }, + { + "max_water_depth": 0, + "type": "minecraft:surface_water_depth_filter" + }, + { + "heightmap": "OCEAN_FLOOR", + "type": "minecraft:heightmap" + }, + { + "predicate": { + "state": { + "Properties": { + "stage": "0" + }, + "Name": "minecraft:oak_sapling" + }, + "type": "minecraft:would_survive" + }, + "type": "minecraft:block_predicate_filter" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/placed_feature/patch_wooden_spikes.json b/src/main/resources/data/immersiveweapons/worldgen/placed_feature/patch_wooden_spikes.json new file mode 100644 index 000000000..e3979ec2b --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/placed_feature/patch_wooden_spikes.json @@ -0,0 +1,19 @@ +{ + "feature": "immersiveweapons:patch_wooden_spikes", + "placement": [ + { + "chance": 16, + "type": "minecraft:rarity_filter" + }, + { + "type": "minecraft:in_square" + }, + { + "heightmap": "MOTION_BLOCKING", + "type": "minecraft:heightmap" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/abandoned_factory.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/abandoned_factory.json new file mode 100644 index 000000000..75b63a142 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/abandoned_factory.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:abandoned_factory", + "weight": 1 + } + ], + "placement": { + "salt": 959874384, + "spacing": 60, + "separation": 40, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/battlefield_camp.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/battlefield_camp.json new file mode 100644 index 000000000..94cec6d55 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/battlefield_camp.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:battlefield_camp", + "weight": 1 + } + ], + "placement": { + "salt": 458962175, + "spacing": 12, + "separation": 5, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/battlefield_town.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/battlefield_town.json new file mode 100644 index 000000000..49b9dd720 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/battlefield_town.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:battlefield_town", + "weight": 1 + } + ], + "placement": { + "salt": 176482913, + "spacing": 34, + "separation": 8, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/bear_trap.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/bear_trap.json new file mode 100644 index 000000000..d9d695fdf --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/bear_trap.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:bear_trap", + "weight": 1 + } + ], + "placement": { + "salt": 794532168, + "spacing": 7, + "separation": 2, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/campsite.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/campsite.json new file mode 100644 index 000000000..2983b8f6c --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/campsite.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:campsite", + "weight": 1 + } + ], + "placement": { + "salt": 671249835, + "spacing": 12, + "separation": 5, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/cloud_island.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/cloud_island.json new file mode 100644 index 000000000..0a652cda5 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/cloud_island.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:cloud_island", + "weight": 1 + } + ], + "placement": { + "salt": 349821657, + "spacing": 45, + "separation": 35, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/destroyed_house.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/destroyed_house.json new file mode 100644 index 000000000..c3f13e0e9 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/destroyed_house.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:destroyed_house", + "weight": 1 + } + ], + "placement": { + "salt": 615794356, + "spacing": 10, + "separation": 5, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/graveyard.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/graveyard.json new file mode 100644 index 000000000..3f3c28674 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/graveyard.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:graveyard", + "weight": 1 + } + ], + "placement": { + "salt": 346751289, + "spacing": 20, + "separation": 15, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/hans_hut.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/hans_hut.json new file mode 100644 index 000000000..19ef44c30 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/hans_hut.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:hans_hut", + "weight": 1 + } + ], + "placement": { + "salt": 5973468510, + "spacing": 20, + "separation": 10, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/landmine_trap.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/landmine_trap.json new file mode 100644 index 000000000..8bf826f40 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/landmine_trap.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:landmine_trap", + "weight": 1 + } + ], + "placement": { + "salt": 959874384, + "spacing": 7, + "separation": 4, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/pitfall_trap.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/pitfall_trap.json new file mode 100644 index 000000000..4aee31b5c --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/pitfall_trap.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:pitfall_trap", + "weight": 1 + } + ], + "placement": { + "salt": 875412395, + "spacing": 6, + "separation": 2, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/underground_bunker.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/underground_bunker.json new file mode 100644 index 000000000..7478c8f89 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/underground_bunker.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:underground_bunker", + "weight": 1 + } + ], + "placement": { + "salt": 548796135, + "spacing": 25, + "separation": 15, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/structure_set/water_tower.json b/src/main/resources/data/immersiveweapons/worldgen/structure_set/water_tower.json new file mode 100644 index 000000000..f1ef22c38 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/structure_set/water_tower.json @@ -0,0 +1,14 @@ +{ + "structures": [ + { + "structure": "immersiveweapons:water_tower", + "weight": 1 + } + ], + "placement": { + "salt": 246975135, + "spacing": 22, + "separation": 12, + "type": "minecraft:random_spread" + } +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/template_pool/battlefield_camp/start_pool.json b/src/main/resources/data/immersiveweapons/worldgen/template_pool/battlefield_camp/start_pool.json new file mode 100644 index 000000000..4a5fba9e1 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/template_pool/battlefield_camp/start_pool.json @@ -0,0 +1,16 @@ +{ + "name": "immersiveweapons:battlefield_camp/start_pool", + "fallback": "minecraft:empty", + + "elements": [ + { + "weight": 1, + "element": { + "location": "immersiveweapons:battlefield_camp", + "processors": "minecraft:empty", + "projection": "rigid", + "element_type": "minecraft:single_pool_element" + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/template_pool/battlefield_town/start_pool.json b/src/main/resources/data/immersiveweapons/worldgen/template_pool/battlefield_town/start_pool.json new file mode 100644 index 000000000..9fb253b91 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/template_pool/battlefield_town/start_pool.json @@ -0,0 +1,16 @@ +{ + "name": "immersiveweapons:battlefield_town/start_pool", + "fallback": "minecraft:empty", + + "elements": [ + { + "weight": 1, + "element": { + "location": "immersiveweapons:battlefield_town", + "processors": "minecraft:empty", + "projection": "rigid", + "element_type": "minecraft:single_pool_element" + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/template_pool/destroyed_house/start_pool.json b/src/main/resources/data/immersiveweapons/worldgen/template_pool/destroyed_house/start_pool.json new file mode 100644 index 000000000..f1f67167d --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/template_pool/destroyed_house/start_pool.json @@ -0,0 +1,25 @@ +{ + "name": "immersiveweapons:destroyed_house/start_pool", + "fallback": "minecraft:empty", + + "elements": [ + { + "weight": 1, + "element": { + "location": "immersiveweapons:destroyed_house/house_1", + "processors": "minecraft:empty", + "projection": "rigid", + "element_type": "minecraft:single_pool_element" + } + }, + { + "weight": 1, + "element": { + "location": "immersiveweapons:destroyed_house/house_2", + "processors": "minecraft:empty", + "projection": "rigid", + "element_type": "minecraft:single_pool_element" + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/template_pool/graveyard/start_pool.json b/src/main/resources/data/immersiveweapons/worldgen/template_pool/graveyard/start_pool.json new file mode 100644 index 000000000..ce49e8d02 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/template_pool/graveyard/start_pool.json @@ -0,0 +1,16 @@ +{ + "name": "immersiveweapons:graveyard/start_pool", + "fallback": "minecraft:empty", + + "elements": [ + { + "weight": 1, + "element": { + "location": "immersiveweapons:graveyard", + "processors": "minecraft:empty", + "projection": "rigid", + "element_type": "minecraft:single_pool_element" + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/immersiveweapons/worldgen/template_pool/hans_hut/start_pool.json b/src/main/resources/data/immersiveweapons/worldgen/template_pool/hans_hut/start_pool.json new file mode 100644 index 000000000..d076eff58 --- /dev/null +++ b/src/main/resources/data/immersiveweapons/worldgen/template_pool/hans_hut/start_pool.json @@ -0,0 +1,16 @@ +{ + "name": "immersiveweapons:hans_hut/start_pool", + "fallback": "minecraft:empty", + + "elements": [ + { + "weight": 1, + "element": { + "location": "immersiveweapons:hans_hut", + "processors": "minecraft:empty", + "projection": "rigid", + "element_type": "minecraft:single_pool_element" + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index ef249998b..80f864bb2 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "Immersive Weapons resources", - "pack_format": 8 + "pack_format": 9 } } \ No newline at end of file diff --git a/update.json b/update.json index 4e287ec90..66652400e 100644 --- a/update.json +++ b/update.json @@ -1,6 +1,8 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/immersive-weapons", "promos": { + "1.18.2-latest": "1.18.2-1.15.0-alpha1", + "1.18.2-recommended": "1.18.2-1.15.0-alpha1", "1.18.1-latest": "1.18.1-1.14.0-alpha1", "1.18.1-recommended": "1.18.1-1.13.0-beta10", "1.18-latest": "1.18.1-1.13.0-beta9", @@ -12,6 +14,9 @@ "1.16.4-latest": "1.16.5-1.1.1", "1.16.4-recommended": "1.16.5-1.1.1" }, + "1.18.2": { + "1.18.2-1.15.0-alpha1": "Initial 1.18.2 Release - https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.15.0-alpha1" + }, "1.18.1": { "1.18.1-1.14.0-alpha1": "Major Rewrites, Improvements, and Additions - https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.14.0-alpha1", "1.18.1-1.13.0-beta10": "Support Latest Forge Versions - https://github.com/AnonymousHacker1279/ImmersiveWeapons/releases/tag/v1.13.0-beta10",