From 0e18d3c7af52bb75bfee8af3d3402d43e8feca25 Mon Sep 17 00:00:00 2001 From: Anonymous Hacker Date: Thu, 17 Feb 2022 20:51:48 -0500 Subject: [PATCH 1/3] The Entirety of v1.14.0-alpha1 at Once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Yep, this is basically all of v1.14.0-alpha1 in one commit. There's still more planned, but this commit takes out about two thirds of it. So what's new? - Encyclopedia: A book provided via Patchouli that provides information on every block and item in the game, along with useful information for getting started. (It does not currently have resources like the warrior statue pieces or azul stained orchids, as those are currently unavailable naturally as biomes are still missing) - The encyclopedia is given to every player when they join the world. It can be crafted though. - Entries unlock as players explore and complete advancements. - Along with the Encyclopedia, most items have been rewritten to provide better functionality or to reduce jankiness. Here's a list of those items (hopefully I don't miss any...): - Tables: Yep, its plural now. The wooden table has been replaced with an oak table, and there are variants for all woods now. - Sulfur: Now there's a raw sulfur block for decoration purposes. - Molten & Tesla Plates: No longer exist. Recipes using them were removed a while ago, and they don't serve any purpose now. - Copper and Cobalt Hoes: Attack speed has been nerfed because I left them at `5f` and didn't realize how broken that was. - Recipe Changes: Various recipes have changed. - Mortar: Now has a custom sound when firing, and right-click behavior is a bit nicer. - Panic Alarm: Has been reduced to only one alarm sound. The extra sounds weren't really useful and just made it harder to maintain. And now, it's a lot more consistent. - Sandbag: Now release sand cloud particles when being shot at with projectiles. - Spotlight: Now casts light in a beam in front of itself. - Burned Oak Branch: Now can be placed on any burned oak log that's properly tagged. - Landmine: Right-click behavior is less finicky now. - Punji Sticks: Damage calculation has been completely rewritten and is a lot more dangerous now. And damage is properly calculated based on fall distance. - Blood Particles: Completely rewritten. Now entities leave a blood trail for a short period of time when bleeding. - Smoke Bomb Particles: Completely rewritten. Smoke generates much more smoothly, and is more realistic. Colors have also been tweaked. Smoke also persists for longer. - Molotov Cocktails: Fire effect completely rewritten. Less janky, and now spreads properly if its thrown on an uneven surface. It doesn't throw as absurdly far now either. - Gauntlets: Attack speed increased. - Molten Ingots: Now act as a furnace fuel. - Musket Balls: Hitboxes are now smaller and fit better. Instead of using the same sized hitboxes as arrows, musket balls have half of the size. - Tesla Armor: Custom equip sound. Coming Soon™ to other armors. - Bandages / First Aid Kits: Now instantly clear any bleeding effects. When being used on other entities, the "half-time" property no longer exists. The player using it still gets the effects. - Morphine: When being used on other entities, the "half-time" property no longer exists. The player using it still gets the effects. - Flintlock Pistol/Blunderbuss: Every bullet is no longer critical. Now, each bullet has a 10% chance to be critical. - Smoke Bombs: They don't travel as far when thrown. Same as molotovs. - Armor Materials: Tweaks to armor values. - Flares: Now actually light up areas around them with minimal performance impact. The original particles are still emitted, and have been optimized to reduce framerate stuttering. - Outside of items or blocks, some other functions have changed. Those are: - The IW creative tab is no longer sorted. This may be re-implemented in the future, but for now it was disabled to allow Patchouli to add the Encyclopedia to the tab. - Configuration files have been modified, again. The server one is now a common config, and registered properly. - Lots of advancement changes. - Changes to some tags. - The logo on the mods list has been updated and fits properly now. - The update checker now points to this branch (v1.14.0-update-indev). It will be changed when its ready to merge into the 1.18.x dev branch, and into master. Hopefully I didn't miss anything. Quite a lot has changed, for the better. It should be generally nicer to play after this. --- build.gradle | 56 +- gradle.properties | 12 +- src/generated/resources/.cache/cache | 142 +- .../blockstates/acacia_table.json | 7 + .../blockstates/birch_table.json | 7 + .../blockstates/burned_oak_table.json | 7 + .../blockstates/crimson_table.json | 7 + .../blockstates/dark_oak_table.json | 7 + .../blockstates/jungle_table.json | 7 + .../blockstates/oak_table.json | 7 + .../blockstates/raw_sulfur_block.json | 7 + .../blockstates/spruce_table.json | 7 + .../blockstates/warped_table.json | 7 + .../models/block/raw_sulfur_block.json | 6 + .../models/item/acacia_table.json | 3 + .../models/item/birch_table.json | 3 + .../models/item/burned_oak_table.json | 3 + .../models/item/crimson_table.json | 3 + .../models/item/dark_oak_table.json | 3 + .../models/item/jungle_table.json | 3 + .../models/item/molten_plate.json | 6 - .../models/item/oak_table.json | 3 + .../models/item/raw_sulfur_block.json | 3 + .../models/item/spruce_table.json | 3 + .../models/item/tesla_plate.json | 6 - .../models/item/warped_table.json | 3 + .../models/item/wooden_table.json | 3 - .../{azul_keystone.json => bamboo.json} | 12 +- .../advancements/battlefield.json | 36 - .../advancements/biohazard_box.json | 37 + .../immersiveweapons/advancements/cloud.json | 52 + .../advancements/cloud_marble.json | 37 + .../advancements/cobalt_axe.json | 38 + .../advancements/cobalt_hoe.json | 38 + .../{molten_plate.json => cobalt_ingot.json} | 10 +- .../advancements/cobalt_pickaxe.json | 38 + .../advancements/cobalt_shovel.json | 38 + .../advancements/cobalt_sword.json | 38 + .../advancements/cobalt_tools.json | 50 + .../advancements/copper_axe.json | 38 + .../advancements/copper_hoe.json | 38 + .../advancements/copper_ingot.json | 37 + .../advancements/copper_pickaxe.json | 38 + .../advancements/copper_shovel.json | 38 + .../advancements/copper_sword.json | 38 + .../advancements/copper_tools.json | 50 + .../advancements/diamond_shard.json | 37 + .../advancements/energized.json | 51 +- .../advancements/gold_ingot.json | 37 + .../immersiveweapons/advancements/ingots.json | 35 + .../advancements/molten_axe.json | 41 + .../advancements/molten_hoe.json | 41 + .../advancements/molten_pickaxe.json | 41 + .../advancements/molten_shovel.json | 41 + .../immersiveweapons/advancements/mud.json | 37 + .../advancements/musket_ball.json | 35 + .../advancements/netherite_ingot.json | 37 + .../advancements/nuggets.json | 35 + .../advancements/obsidian_shard.json | 37 + .../immersiveweapons/advancements/planks.json | 35 + .../advancements/play_with_fire.json | 51 +- .../advancements/pretty_windy.json | 51 +- .../{tesla_plate.json => acacia_table.json} | 10 +- .../{molten_plate.json => birch_table.json} | 10 +- .../immersiveweapons/burned_oak_table.json | 32 + .../immersiveweapons/crimson_table.json | 32 + .../immersiveweapons/dark_oak_table.json | 32 + .../immersiveweapons/jungle_table.json | 32 + .../recipes/immersiveweapons/landmine.json | 4 +- .../recipes/immersiveweapons/oak_table.json | 32 + ...ooden_table.json => raw_sulfur_block.json} | 10 +- .../immersiveweapons/spruce_table.json | 32 + .../recipes/immersiveweapons/sulfur.json | 34 + .../immersiveweapons/warped_table.json | 32 + .../immersiveweapons/advancements/root.json | 5 + .../immersiveweapons/advancements/shards.json | 4 +- .../advancements/stone_shard.json | 37 + .../advancements/tesla_axe.json | 41 + .../{rich_no_more.json => tesla_hoe.json} | 4 +- .../advancements/tesla_pickaxe.json | 41 + .../advancements/tesla_shovel.json | 41 + .../advancements/tiltros.json | 33 - .../advancements/ventus_axe.json | 41 + .../advancements/ventus_hoe.json | 41 + .../advancements/ventus_pickaxe.json | 41 + .../advancements/ventus_shovel.json | 41 + .../advancements/warm_and_toasty.json | 2 +- .../advancements/warrior_statue.json | 47 - .../advancements/wood_shard.json | 37 + .../{wooden_table.json => oak_table.json} | 2 +- .../loot_tables/entities/dying_soldier.json | 123 +- .../loot_tables/entities/minuteman.json | 20 + .../recipes/acacia_table.json | 19 + .../immersiveweapons/recipes/birch_table.json | 19 + .../recipes/burned_oak_table.json | 19 + .../immersiveweapons/recipes/cloth_scrap.json | 3 +- .../recipes/crimson_table.json | 19 + .../recipes/dark_oak_table.json | 19 + .../recipes/explosive_chocolate_bar.json | 8 +- .../recipes/jungle_table.json | 19 + .../immersiveweapons/recipes/landmine.json | 2 +- .../recipes/molten_plate.json | 15 - .../recipes/molten_sword.json | 2 +- .../{wooden_table.json => oak_table.json} | 6 +- .../recipes/punji_sticks.json | 5 +- .../recipes/raw_sulfur_block.json | 17 + .../immersiveweapons/recipes/sandbag.json | 4 +- .../recipes/spruce_table.json | 19 + .../data/immersiveweapons/recipes/sulfur.json | 13 + .../immersiveweapons/recipes/tesla_plate.json | 15 - .../immersiveweapons/recipes/tesla_sword.json | 2 +- .../recipes/ventus_sword.json | 2 +- .../recipes/warped_table.json | 19 + .../recipes/wood_gauntlet.json | 2 +- .../tags/blocks/mineable/pickaxe.json | 1 + .../tags/blocks/needs_stone_tool.json | 1 + .../tags/blocks/non_flammable_wood.json | 7 + .../immersiveweapons/ImmersiveWeapons.java | 14 +- .../block/base/MortarBlock.java | 49 +- .../block/base/PanicAlarmBlock.java | 122 +- .../block/base/SandbagBlock.java | 24 +- .../block/base/SpotlightBlock.java | 130 +- .../block/base/mud/DriedMudBlock.java | 1 + .../base/mud/HardenedMudWindowBlock.java | 14 +- .../block/base/mud/MudBlock.java | 1 + .../decoration/AzulStainedOrchidBlock.java | 5 +- .../block/decoration/BiohazardBoxBlock.java | 16 +- .../block/decoration/BranchBlock.java | 35 +- .../block/decoration/FlagBlock.java | 31 +- .../block/decoration/FlagPoleBlock.java | 23 +- .../block/decoration/WoodenTableBlock.java | 20 +- .../statue/warrior/WarriorStatueBase.java | 8 +- .../statue/warrior/WarriorStatueHead.java | 9 +- .../statue/warrior/WarriorStatueTorso.java | 6 +- .../properties/WoodTypes.java} | 4 +- .../block/trap/LandmineBlock.java | 22 +- .../block/trap/PitfallBlock.java | 56 +- .../block/trap/PunjiSticksBlock.java | 19 +- .../block/trap/SpikeTrapBlock.java | 11 +- .../block/trap/WoodenSpikesBlock.java | 37 +- .../AbstractTeslaSynthesizerBlockEntity.java | 115 +- .../blockentity/MedicStatueBlockEntity.java | 2 +- .../MinutemanStatueBlockEntity.java | 2 +- .../blockentity/PanicAlarmBlockEntity.java | 150 +- .../category/SmallPartsRecipeCategory.java | 1 + .../TeslaSynthesizerRecipeCategory.java | 1 + .../client/particle/AbstractParticleData.java | 91 -- .../client/particle/BloodParticle.java | 69 + .../client/particle/GenericParticle.java | 106 -- .../client/particle/SandCloudParticle.java | 70 + .../particle/blood/BloodParticleData.java | 111 -- .../particle/blood/BloodParticleFactory.java | 44 - .../particle/blood/BloodParticleType.java | 25 - .../smoke_bomb/SmokeBombParticle.java | 74 + .../smoke_bomb/SmokeBombParticleOptions.java | 127 ++ .../smokebomb/SmokeBombParticleData.java | 111 -- .../smokebomb/SmokeBombParticleFactory.java | 44 - .../smokebomb/SmokeBombParticleType.java | 25 - .../entity/mob/FieldMedicRenderer.java | 2 +- .../entity/mob/MinutemanRenderer.java | 2 +- .../immersiveweapons/config/ClientConfig.java | 52 +- .../{ServerConfig.java => CommonConfig.java} | 298 ++-- .../AbstractTeslaSynthesizerContainer.java | 82 +- .../container/SmallPartsContainer.java | 50 +- .../ImmersiveWeaponsAdvancements.java | 917 ++++++++++- .../data/loot/BlockLootTables.java | 2 +- .../data/loot/EntityLootTables.java | 45 +- .../data/models/BlockModelGenerator.java | 769 ++++++++- .../data/models/ItemModelGenerator.java | 12 +- .../data/models/ModelProvider.java | 28 +- .../data/models/lists/ItemModelLists.java | 2 +- .../data/recipes/RecipeGenerator.java | 91 +- .../data/tags/BlockTagsGenerator.java | 19 +- .../minecraft/MinecraftBlockTagGroups.java | 1 + .../data/tags/lists/BlockTagLists.java | 20 +- .../data/tags/lists/ItemTagLists.java | 4 +- .../ai/goal/CelestialTowerSummonGoal.java | 4 +- .../monster/AbstractDyingSoldierEntity.java | 63 +- .../AbstractWanderingWarriorEntity.java | 32 +- .../entity/monster/CelestialTowerEntity.java | 35 +- .../entity/monster/DyingSoldierEntity.java | 21 - .../entity/monster/HansEntity.java | 4 +- .../entity/monster/LavaRevenantEntity.java | 153 +- .../entity/monster/RockSpiderEntity.java | 36 +- .../AbstractFieldMedicEntity.java | 121 +- .../AbstractMinutemanEntity.java | 145 +- .../FieldMedicEntity.java | 2 +- .../{passive => neutral}/MinutemanEntity.java | 23 +- .../projectile/AbstractBulletEntity.java | 234 ++- .../entity/projectile/BulletEntity.java | 144 +- .../entity/projectile/CustomArrowEntity.java | 204 +-- .../entity/projectile/MolotovEntity.java | 128 +- .../entity/projectile/MortarShellEntity.java | 11 +- .../entity/projectile/SmokeBombEntity.java | 108 +- .../ClientForgeEventSubscriber.java | 2 +- .../ClientModEventSubscriber.java | 25 +- .../ForgeEventSubscriber.java | 14 +- .../{events => event}/ModEventSubscriber.java | 6 +- .../init/DeferredRegistryHandler.java | 116 +- .../init/DispenserBehaviorRegistry.java | 7 +- .../{util => init}/PacketHandler.java | 39 +- .../init/PostSetupHandler.java | 4 + .../item/armor/CobaltArmorItem.java | 4 +- .../item/armor/TeslaArmorItem.java | 4 +- .../item/armor/VentusArmorItem.java | 4 +- .../item/bottle/AbstractBottleItem.java | 32 +- .../item/bottle/WineBottleItem.java | 2 +- .../item/fortitude/BandageItem.java | 57 +- .../item/fortitude/ChocolateBarItem.java | 44 + .../item/fortitude/FirstAidKitItem.java | 69 +- .../item/fortitude/MorphineItem.java | 44 +- .../item/fortitude/PainkillerItem.java | 4 +- .../item/gauntlet/GauntletItem.java | 12 +- .../item/materials/CustomArmorMaterials.java | 152 ++ .../materials}/CustomItemMaterials.java | 2 +- .../item/misc/ExplosiveChocolateBar.java | 37 - .../item/misc/UsedSyringeItem.java | 38 +- .../item/projectile/gun/AbstractGunItem.java | 4 +- .../item/projectile/gun/SimplePistolItem.java | 162 +- .../projectile/gun/SimpleShotgunItem.java | 121 +- .../projectile/throwable/MolotovItem.java | 17 +- .../projectile/throwable/SmokeBombItem.java | 18 +- .../item/utility/FuelItem.java | 22 + .../potion/BleedingEffect.java | 129 +- .../immersiveweapons/util/CreativeTab.java | 29 + .../util/CreativeTabSorter.java | 50 - .../util/CustomArmorMaterials.java | 139 -- .../util/GeneralUtilities.java | 17 + .../level/levelgen/OreGeneratorHandler.java | 14 +- .../world/level/levelgen/Structures.java | 108 +- src/main/resources/META-INF/mods.toml | 9 +- .../blockstates/wooden_table.json | 7 - .../assets/immersiveweapons/lang/en_us.json | 195 ++- .../assets/immersiveweapons/lang/es_es.json | 187 ++- .../assets/immersiveweapons/lang/ru_ru.json | 183 ++- .../models/armor/copper_boots.json | 6 - .../models/armor/copper_chestplate.json | 6 - .../models/armor/copper_helmet.json | 6 - .../models/armor/copper_leggings.json | 6 - .../models/armor/molten_boots.json | 6 - .../models/armor/molten_chestplate.json | 6 - .../models/armor/molten_helmet.json | 6 - .../models/armor/molten_leggings.json | 6 - .../models/armor/tesla_boots.json | 6 - .../models/armor/tesla_chestplate.json | 6 - .../models/armor/tesla_helmet.json | 6 - .../models/armor/tesla_leggings.json | 6 - .../models/block/acacia_table.json | 206 +++ .../models/block/birch_table.json | 206 +++ .../models/block/burned_oak_table.json | 206 +++ .../models/block/corrugated_iron_panel.json | 1135 +------------ .../block/corrugated_iron_panel_bars.json | 1384 +--------------- .../block/corrugated_iron_panel_flat.json | 1183 +------------- .../corrugated_iron_panel_flat_bars.json | 1438 +---------------- .../models/block/crimson_table.json | 206 +++ .../models/block/dark_oak_table.json | 206 +++ .../models/block/jungle_table.json | 206 +++ .../models/block/oak_table.json | 206 +++ .../models/block/spruce_table.json | 206 +++ .../models/block/warped_table.json | 206 +++ .../models/block/wooden_table.json | 553 ------- .../models/item/encyclopedia.json | 100 ++ .../immersiveweapons/particles/blood.json | 8 +- .../particles/sand_cloud.json | 8 + .../assets/immersiveweapons/sounds.json | 277 ++-- .../immersiveweapons/sounds/alarm/alarm_1.ogg | Bin 18814 -> 0 bytes .../immersiveweapons/sounds/alarm/alarm_2.ogg | Bin 43632 -> 0 bytes .../immersiveweapons/sounds/alarm/alarm_3.ogg | Bin 29135 -> 0 bytes .../effect/tesla}/tesla_armor_effect.ogg | Bin .../effect/tesla}/tesla_armor_power_down.ogg | Bin .../effect/tesla}/tesla_armor_power_up.ogg | Bin .../sounds/armor/equip/tesla/equip_0.ogg | Bin 0 -> 8361 bytes .../sounds/armor/equip/tesla/equip_1.ogg | Bin 0 -> 8334 bytes .../sounds/armor/equip/tesla/equip_2.ogg | Bin 0 -> 8335 bytes .../sounds/block/mortar/fire/fire_0.ogg | Bin 0 -> 12401 bytes .../block/panic_alarm/alarm/panic_alarm.ogg | Bin 0 -> 18626 bytes .../sounds/generic_whoosh.ogg | Bin 10917 -> 5232 bytes .../sounds/smoke_bomb_hiss.ogg | Bin 57616 -> 30123 bytes .../textures/block/corrugated_iron.png | Bin 0 -> 299 bytes .../textures/block/raw_sulfur_block.png | Bin 0 -> 1302 bytes .../textures/block/table_overlay.png | Bin 0 -> 5504 bytes .../textures/block/wooden_table.png | Bin 743 -> 0 bytes .../textures/item/encyclopedia.png | Bin 0 -> 5577 bytes .../textures/item/molten_plate.png | Bin 299 -> 0 bytes .../textures/item/tesla_plate.png | Bin 364 -> 0 bytes .../textures/particle/{ => blood}/blood_0.png | Bin .../textures/particle/{ => blood}/blood_1.png | Bin .../textures/particle/{ => blood}/blood_2.png | Bin .../textures/particle/{ => blood}/blood_3.png | Bin .../particle/sand_cloud/sand_cloud_0.png | Bin 0 -> 163 bytes .../particle/sand_cloud/sand_cloud_1.png | Bin 0 -> 166 bytes .../particle/sand_cloud/sand_cloud_2.png | Bin 0 -> 194 bytes .../particle/sand_cloud/sand_cloud_3.png | Bin 0 -> 201 bytes .../sand_camouflaged_landmine.png | Bin 0 -> 31451 bytes .../patchouli/encyclopedia/sandbag_fort.png | Bin 0 -> 44989 bytes .../patchouli/encyclopedia/showcase_base.png | Bin 0 -> 58008 bytes .../patchouli/encyclopedia/spotlight_fort.png | Bin 0 -> 42151 bytes .../vine_camouflaged_landmine.png | Bin 0 -> 28746 bytes ...grant_encyclopedia_book_on_first_join.json | 20 + .../patchouli_books/encyclopedia/book.json | 12 + .../en_us/categories/ammunition.json | 5 + .../encyclopedia/en_us/categories/armor.json | 5 + .../en_us/categories/crafting.json | 5 + .../en_us/categories/decoration.json | 5 + .../en_us/categories/defense.json | 5 + .../en_us/categories/firearms.json | 5 + .../en_us/categories/fortitude.json | 5 + .../en_us/categories/gauntlets.json | 5 + .../en_us/categories/getting_started.json | 6 + .../encyclopedia/en_us/categories/pikes.json | 5 + .../en_us/categories/resources.json | 5 + .../en_us/categories/throwables.json | 5 + .../encyclopedia/en_us/categories/tools.json | 5 + .../ammunition/bullet_velocities_info.json | 29 + .../entries/ammunition/cobalt_arrow.json | 17 + .../ammunition/cobalt_musket_ball.json | 17 + .../entries/ammunition/copper_arrow.json | 17 + .../ammunition/copper_musket_ball.json | 17 + .../entries/ammunition/diamond_arrow.json | 17 + .../ammunition/diamond_musket_ball.json | 17 + .../en_us/entries/ammunition/flare.json | 17 + .../en_us/entries/ammunition/gold_arrow.json | 17 + .../entries/ammunition/gold_musket_ball.json | 17 + .../en_us/entries/ammunition/iron_arrow.json | 17 + .../entries/ammunition/iron_musket_ball.json | 17 + .../entries/ammunition/netherite_arrow.json | 17 + .../ammunition/netherite_musket_ball.json | 17 + .../en_us/entries/ammunition/smoke_arrow.json | 30 + .../en_us/entries/ammunition/stone_arrow.json | 17 + .../entries/ammunition/stone_musket_ball.json | 17 + .../en_us/entries/ammunition/wood_arrow.json | 17 + .../entries/ammunition/wood_musket_ball.json | 17 + .../en_us/entries/armor/cobalt.json | 22 + .../en_us/entries/armor/copper.json | 22 + .../en_us/entries/armor/molten.json | 22 + .../en_us/entries/armor/tesla.json | 22 + .../en_us/entries/armor/ventus.json | 22 + .../en_us/entries/crafting/barrel_tap.json | 21 + .../entries/crafting/small_parts_table.json | 60 + .../entries/crafting/tesla_synthesizer.json | 26 + .../entries/decoration/biohazard_box.json | 18 + .../en_us/entries/decoration/burned_oak.json | 68 + .../en_us/entries/decoration/camp_chair.json | 16 + .../en_us/entries/decoration/cloud.json | 18 + .../entries/decoration/cloud_marble.json | 29 + .../entries/decoration/cobalt_blocks.json | 30 + .../en_us/entries/decoration/flags.json | 32 + .../entries/decoration/molten_blocks.json | 22 + .../en_us/entries/decoration/mud.json | 33 + .../entries/decoration/sulfur_blocks.json | 34 + .../entries/decoration/tesla_blocks.json | 22 + .../entries/decoration/ventus_blocks.json | 18 + .../en_us/entries/decoration/wall_shelf.json | 16 + .../entries/decoration/wooden_table.json | 36 + .../en_us/entries/defense/barbed_wire.json | 16 + .../entries/defense/barbed_wire_fence.json | 16 + .../en_us/entries/defense/bear_trap.json | 16 + .../entries/defense/bulletproof_glass.json | 65 + .../defense/corrugated_iron_panels.json | 28 + .../en_us/entries/defense/landmine.json | 24 + .../en_us/entries/defense/mortar.json | 17 + .../en_us/entries/defense/panic_alarm.json | 16 + .../en_us/entries/defense/pitfall.json | 17 + .../en_us/entries/defense/punji_sticks.json | 37 + .../en_us/entries/defense/sandbag.json | 24 + .../en_us/entries/defense/spike_trap.json | 16 + .../en_us/entries/defense/spotlight.json | 23 + .../en_us/entries/defense/wooden_spikes.json | 17 + .../en_us/entries/firearms/blunderbuss.json | 17 + .../en_us/entries/firearms/flare_gun.json | 17 + .../en_us/entries/firearms/flintlock.json | 17 + .../en_us/entries/fortitude/bandage.json | 16 + .../entries/fortitude/bottle_of_alcohol.json | 18 + .../entries/fortitude/bottle_of_wine.json | 18 + .../entries/fortitude/chocolate_bar.json | 17 + .../entries/fortitude/first_aid_kit.json | 16 + .../en_us/entries/fortitude/morphine.json | 23 + .../en_us/entries/fortitude/mre.json | 17 + .../en_us/entries/fortitude/painkillers.json | 16 + .../en_us/entries/gauntlets/cobalt.json | 17 + .../en_us/entries/gauntlets/copper.json | 17 + .../en_us/entries/gauntlets/diamond.json | 17 + .../en_us/entries/gauntlets/gold.json | 17 + .../en_us/entries/gauntlets/iron.json | 17 + .../en_us/entries/gauntlets/netherite.json | 19 + .../en_us/entries/gauntlets/stone.json | 17 + .../en_us/entries/gauntlets/wood.json | 17 + .../getting_started/lost_encyclopedia.json | 14 + .../getting_started/moving_forward.json | 22 + .../getting_started/preparing_your_base.json | 29 + .../using_the_encyclopedia.json | 22 + .../getting_started/where_to_begin.json | 22 + .../en_us/entries/pikes/cobalt.json | 17 + .../en_us/entries/pikes/copper.json | 17 + .../en_us/entries/pikes/diamond.json | 17 + .../en_us/entries/pikes/gold.json | 17 + .../en_us/entries/pikes/iron.json | 17 + .../en_us/entries/pikes/netherite.json | 19 + .../en_us/entries/pikes/stone.json | 17 + .../en_us/entries/pikes/wood.json | 17 + .../en_us/entries/resources/cobalt.json | 20 + .../en_us/entries/resources/copper.json | 15 + .../en_us/entries/resources/molten.json | 19 + .../en_us/entries/resources/rods.json | 17 + .../en_us/entries/resources/shards.json | 48 + .../en_us/entries/resources/smoke_powder.json | 16 + .../en_us/entries/resources/sulfur.json | 15 + .../en_us/entries/resources/tesla.json | 22 + .../en_us/entries/throwables/molotov.json | 17 + .../en_us/entries/throwables/mud_ball.json | 17 + .../en_us/entries/throwables/smoke_bomb.json | 26 + .../en_us/entries/tools/cobalt.json | 26 + .../en_us/entries/tools/copper.json | 26 + .../en_us/entries/tools/molten.json | 26 + .../entries/tools/mortar_and_pestle.json | 16 + .../en_us/entries/tools/pliers.json | 16 + .../en_us/entries/tools/tesla.json | 26 + .../en_us/entries/tools/ventus.json | 31 + .../recipes/encyclopedia.json | 17 + src/main/resources/logo.png | Bin 75588 -> 41760 bytes update.json | 3 +- 421 files changed, 11746 insertions(+), 9291 deletions(-) create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/acacia_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/birch_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/burned_oak_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/crimson_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/dark_oak_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/jungle_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/oak_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/raw_sulfur_block.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/spruce_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/blockstates/warped_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/block/raw_sulfur_block.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/acacia_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/birch_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/burned_oak_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/crimson_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/dark_oak_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/jungle_table.json delete mode 100644 src/generated/resources/assets/immersiveweapons/models/item/molten_plate.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/oak_table.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/raw_sulfur_block.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/spruce_table.json delete mode 100644 src/generated/resources/assets/immersiveweapons/models/item/tesla_plate.json create mode 100644 src/generated/resources/assets/immersiveweapons/models/item/warped_table.json delete mode 100644 src/generated/resources/assets/immersiveweapons/models/item/wooden_table.json rename src/generated/resources/data/immersiveweapons/advancements/{azul_keystone.json => bamboo.json} (56%) delete mode 100644 src/generated/resources/data/immersiveweapons/advancements/battlefield.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/biohazard_box.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/cloud.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/cloud_marble.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/cobalt_axe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/cobalt_hoe.json rename src/generated/resources/data/immersiveweapons/advancements/{molten_plate.json => cobalt_ingot.json} (63%) create mode 100644 src/generated/resources/data/immersiveweapons/advancements/cobalt_pickaxe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/cobalt_shovel.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/cobalt_sword.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/cobalt_tools.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/copper_axe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/copper_hoe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/copper_ingot.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/copper_pickaxe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/copper_shovel.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/copper_sword.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/copper_tools.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/diamond_shard.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/gold_ingot.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/ingots.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/molten_axe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/molten_hoe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/molten_pickaxe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/molten_shovel.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/mud.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/musket_ball.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/netherite_ingot.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/nuggets.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/obsidian_shard.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/planks.json rename src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/{tesla_plate.json => acacia_table.json} (69%) rename src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/{molten_plate.json => birch_table.json} (68%) create mode 100644 src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_table.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/crimson_table.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/dark_oak_table.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/jungle_table.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/oak_table.json rename src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/{wooden_table.json => raw_sulfur_block.json} (72%) create mode 100644 src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/spruce_table.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/sulfur.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/warped_table.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/stone_shard.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/tesla_axe.json rename src/generated/resources/data/immersiveweapons/advancements/{rich_no_more.json => tesla_hoe.json} (81%) create mode 100644 src/generated/resources/data/immersiveweapons/advancements/tesla_pickaxe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/tesla_shovel.json delete mode 100644 src/generated/resources/data/immersiveweapons/advancements/tiltros.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/ventus_axe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/ventus_hoe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/ventus_pickaxe.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/ventus_shovel.json delete mode 100644 src/generated/resources/data/immersiveweapons/advancements/warrior_statue.json create mode 100644 src/generated/resources/data/immersiveweapons/advancements/wood_shard.json rename src/generated/resources/data/immersiveweapons/loot_tables/blocks/{wooden_table.json => oak_table.json} (85%) create mode 100644 src/generated/resources/data/immersiveweapons/recipes/acacia_table.json create mode 100644 src/generated/resources/data/immersiveweapons/recipes/birch_table.json create mode 100644 src/generated/resources/data/immersiveweapons/recipes/burned_oak_table.json create mode 100644 src/generated/resources/data/immersiveweapons/recipes/crimson_table.json create mode 100644 src/generated/resources/data/immersiveweapons/recipes/dark_oak_table.json create mode 100644 src/generated/resources/data/immersiveweapons/recipes/jungle_table.json delete mode 100644 src/generated/resources/data/immersiveweapons/recipes/molten_plate.json rename src/generated/resources/data/immersiveweapons/recipes/{wooden_table.json => oak_table.json} (77%) create mode 100644 src/generated/resources/data/immersiveweapons/recipes/raw_sulfur_block.json create mode 100644 src/generated/resources/data/immersiveweapons/recipes/spruce_table.json create mode 100644 src/generated/resources/data/immersiveweapons/recipes/sulfur.json delete mode 100644 src/generated/resources/data/immersiveweapons/recipes/tesla_plate.json create mode 100644 src/generated/resources/data/immersiveweapons/recipes/warped_table.json create mode 100644 src/generated/resources/data/minecraft/tags/blocks/non_flammable_wood.json rename src/main/java/com/anonymoushacker1279/immersiveweapons/{util/CustomWoodTypes.java => block/properties/WoodTypes.java} (77%) delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/AbstractParticleData.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/BloodParticle.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/GenericParticle.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/SandCloudParticle.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleData.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleFactory.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleType.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smoke_bomb/SmokeBombParticle.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smoke_bomb/SmokeBombParticleOptions.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleData.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleFactory.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleType.java rename src/main/java/com/anonymoushacker1279/immersiveweapons/config/{ServerConfig.java => CommonConfig.java} (56%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/entity/{passive => neutral}/AbstractFieldMedicEntity.java (73%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/entity/{passive => neutral}/AbstractMinutemanEntity.java (75%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/entity/{passive => neutral}/FieldMedicEntity.java (96%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/entity/{passive => neutral}/MinutemanEntity.java (68%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/{events => event}/ClientForgeEventSubscriber.java (98%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/{events => event}/ClientModEventSubscriber.java (89%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/{events => event}/ForgeEventSubscriber.java (90%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/{events => event}/ModEventSubscriber.java (96%) rename src/main/java/com/anonymoushacker1279/immersiveweapons/{util => init}/PacketHandler.java (83%) create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/ChocolateBarItem.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/item/materials/CustomArmorMaterials.java rename src/main/java/com/anonymoushacker1279/immersiveweapons/{util => item/materials}/CustomItemMaterials.java (97%) delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/item/misc/ExplosiveChocolateBar.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/item/utility/FuelItem.java create mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/util/CreativeTab.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/util/CreativeTabSorter.java delete mode 100644 src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomArmorMaterials.java delete mode 100644 src/main/resources/assets/immersiveweapons/blockstates/wooden_table.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/copper_boots.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/copper_chestplate.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/copper_helmet.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/copper_leggings.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/molten_boots.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/molten_chestplate.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/molten_helmet.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/molten_leggings.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/tesla_boots.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/tesla_chestplate.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/tesla_helmet.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/armor/tesla_leggings.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/acacia_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/birch_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/burned_oak_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/crimson_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/dark_oak_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/jungle_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/oak_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/spruce_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/block/warped_table.json delete mode 100644 src/main/resources/assets/immersiveweapons/models/block/wooden_table.json create mode 100644 src/main/resources/assets/immersiveweapons/models/item/encyclopedia.json create mode 100644 src/main/resources/assets/immersiveweapons/particles/sand_cloud.json delete mode 100644 src/main/resources/assets/immersiveweapons/sounds/alarm/alarm_1.ogg delete mode 100644 src/main/resources/assets/immersiveweapons/sounds/alarm/alarm_2.ogg delete mode 100644 src/main/resources/assets/immersiveweapons/sounds/alarm/alarm_3.ogg rename src/main/resources/assets/immersiveweapons/sounds/{ => armor/effect/tesla}/tesla_armor_effect.ogg (100%) rename src/main/resources/assets/immersiveweapons/sounds/{ => armor/effect/tesla}/tesla_armor_power_down.ogg (100%) rename src/main/resources/assets/immersiveweapons/sounds/{ => armor/effect/tesla}/tesla_armor_power_up.ogg (100%) create mode 100644 src/main/resources/assets/immersiveweapons/sounds/armor/equip/tesla/equip_0.ogg create mode 100644 src/main/resources/assets/immersiveweapons/sounds/armor/equip/tesla/equip_1.ogg create mode 100644 src/main/resources/assets/immersiveweapons/sounds/armor/equip/tesla/equip_2.ogg create mode 100644 src/main/resources/assets/immersiveweapons/sounds/block/mortar/fire/fire_0.ogg create mode 100644 src/main/resources/assets/immersiveweapons/sounds/block/panic_alarm/alarm/panic_alarm.ogg create mode 100644 src/main/resources/assets/immersiveweapons/textures/block/corrugated_iron.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/block/raw_sulfur_block.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/block/table_overlay.png delete mode 100644 src/main/resources/assets/immersiveweapons/textures/block/wooden_table.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/item/encyclopedia.png delete mode 100644 src/main/resources/assets/immersiveweapons/textures/item/molten_plate.png delete mode 100644 src/main/resources/assets/immersiveweapons/textures/item/tesla_plate.png rename src/main/resources/assets/immersiveweapons/textures/particle/{ => blood}/blood_0.png (100%) rename src/main/resources/assets/immersiveweapons/textures/particle/{ => blood}/blood_1.png (100%) rename src/main/resources/assets/immersiveweapons/textures/particle/{ => blood}/blood_2.png (100%) rename src/main/resources/assets/immersiveweapons/textures/particle/{ => blood}/blood_3.png (100%) create mode 100644 src/main/resources/assets/immersiveweapons/textures/particle/sand_cloud/sand_cloud_0.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/particle/sand_cloud/sand_cloud_1.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/particle/sand_cloud/sand_cloud_2.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/particle/sand_cloud/sand_cloud_3.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/sand_camouflaged_landmine.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/sandbag_fort.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/showcase_base.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/spotlight_fort.png create mode 100644 src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/vine_camouflaged_landmine.png create mode 100644 src/main/resources/data/immersiveweapons/loot_tables/grant_encyclopedia_book_on_first_join.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/book.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/ammunition.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/armor.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/crafting.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/decoration.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/defense.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/firearms.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/fortitude.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/gauntlets.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/getting_started.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/pikes.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/resources.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/throwables.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/categories/tools.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/bullet_velocities_info.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/cobalt_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/cobalt_musket_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/copper_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/copper_musket_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/diamond_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/diamond_musket_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/flare.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/gold_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/gold_musket_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/iron_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/iron_musket_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/netherite_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/netherite_musket_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/smoke_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/stone_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/stone_musket_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/wood_arrow.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/ammunition/wood_musket_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/armor/cobalt.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/armor/copper.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/armor/molten.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/armor/tesla.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/armor/ventus.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/crafting/barrel_tap.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/crafting/small_parts_table.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/crafting/tesla_synthesizer.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/biohazard_box.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/burned_oak.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/camp_chair.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/cloud.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/cloud_marble.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/cobalt_blocks.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/flags.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/molten_blocks.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/mud.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/sulfur_blocks.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/tesla_blocks.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/ventus_blocks.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/wall_shelf.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/decoration/wooden_table.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/barbed_wire.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/barbed_wire_fence.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/bear_trap.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/bulletproof_glass.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/corrugated_iron_panels.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/landmine.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/mortar.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/panic_alarm.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/pitfall.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/punji_sticks.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/sandbag.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/spike_trap.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/spotlight.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/defense/wooden_spikes.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/firearms/blunderbuss.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/firearms/flare_gun.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/firearms/flintlock.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/fortitude/bandage.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/fortitude/bottle_of_alcohol.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/fortitude/bottle_of_wine.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/fortitude/chocolate_bar.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/fortitude/first_aid_kit.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/fortitude/morphine.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/fortitude/mre.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/fortitude/painkillers.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/gauntlets/cobalt.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/gauntlets/copper.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/gauntlets/diamond.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/gauntlets/gold.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/gauntlets/iron.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/gauntlets/netherite.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/gauntlets/stone.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/gauntlets/wood.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/getting_started/lost_encyclopedia.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/getting_started/moving_forward.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/getting_started/preparing_your_base.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/getting_started/using_the_encyclopedia.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/getting_started/where_to_begin.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/pikes/cobalt.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/pikes/copper.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/pikes/diamond.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/pikes/gold.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/pikes/iron.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/pikes/netherite.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/pikes/stone.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/pikes/wood.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/resources/cobalt.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/resources/copper.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/resources/molten.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/resources/rods.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/resources/shards.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/resources/smoke_powder.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/resources/sulfur.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/resources/tesla.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/throwables/molotov.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/throwables/mud_ball.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/throwables/smoke_bomb.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/tools/cobalt.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/tools/copper.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/tools/molten.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/tools/mortar_and_pestle.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/tools/pliers.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/tools/tesla.json create mode 100644 src/main/resources/data/immersiveweapons/patchouli_books/encyclopedia/en_us/entries/tools/ventus.json create mode 100644 src/main/resources/data/immersiveweapons/recipes/encyclopedia.json diff --git a/build.gradle b/build.gradle index 06e2c026a..5ea1b2bbc 100644 --- a/build.gradle +++ b/build.gradle @@ -26,20 +26,20 @@ repositories { name "Bai Maven" url "https://maven.bai.lol" } + maven { + url 'https://maven.blamejared.com' + } } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'org.parchmentmc.librarian.forgegradle' apply plugin: 'maven-publish' -version = '1.18.1-1.13.0-beta10' -group = 'com.anonymoushacker1279.immersiveweapons' - java.toolchain.languageVersion = JavaLanguageVersion.of(17) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) minecraft { - mappings channel: 'parchment', version: '2021.12.19-1.18.1' + mappings channel: mappings_channel, version: mappings_version accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') @@ -51,6 +51,10 @@ minecraft { property 'forge.logging.console.level', 'debug' + // For Patchouli to work in-dev + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + mods { immersiveweapons { source sourceSets.main @@ -65,6 +69,10 @@ minecraft { property 'forge.logging.console.level', 'debug' + // For Patchouli to work in-dev + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + mods { immersiveweapons { source sourceSets.main @@ -79,6 +87,10 @@ minecraft { property 'forge.logging.console.level', 'debug' + // For Patchouli to work in-dev + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + args '--mod', 'immersiveweapons', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') mods { @@ -96,13 +108,43 @@ sourceSets.main.resources { srcDir 'src/generated/resources' } dependencies { implementation 'org.jetbrains:annotations:23.0.0' - minecraft 'net.minecraftforge:forge:1.18.1-39.0.55' + minecraft forge_version // Include JEI - implementation fg.deobf("mezz.jei:jei-1.18.1:9.2.1.69") + implementation fg.deobf(jei_version) // Include WTHIT - implementation fg.deobf("mcp.mobius.waila:wthit:forge-4.4.1") + implementation fg.deobf(wthit_version) + + // Include Patchouli + compileOnly fg.deobf(patchouli_version + ":api") + runtimeOnly fg.deobf(patchouli_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 intoTargets = ["$rootDir/out/production/resources/", "$rootDir/out/production/${project.name}.main/", "$rootDir/bin/main/"] +def replaceProperties = [build_version: version] +processResources { + inputs.properties replaceProperties + replaceProperties.put 'project', project + + filesMatching(resourceTargets) { + expand replaceProperties + } + + intoTargets.each { target -> + if (file(target).exists()) { + copy { + from(sourceSets.main.resources) { + include resourceTargets + expand replaceProperties + } + into target + } + } + } } // Add properties to JAR manifest diff --git a/gradle.properties b/gradle.properties index 3cb8e973e..c49bd94ae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,10 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -# This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx6G -org.gradle.daemon=true \ No newline at end of file +org.gradle.daemon=true +version=1.18.1-1.14.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 diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 0eae9fcfa..77d843a63 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1,3 +1,5 @@ +8b23e706149f4a939036b15bae2a19eefcc6d84e assets/immersiveweapons/blockstates/acacia_table.json +02e343a1962aa720face75a59582d31f579a607e assets/immersiveweapons/blockstates/birch_table.json 5109803be404c8111e61f0d3378fa7d78485ea2d assets/immersiveweapons/blockstates/black_stained_bulletproof_glass.json ee886746b466d2bd003fc55e9469b7582881f23b assets/immersiveweapons/blockstates/blue_stained_bulletproof_glass.json c8b165767ac615a10510b225bcca11ef5f46d56f assets/immersiveweapons/blockstates/brown_stained_bulletproof_glass.json @@ -12,6 +14,7 @@ a1692be9b8bb8c5d66f3cbbcc88f3b8453e2b6ef assets/immersiveweapons/blockstates/bur e7935780b8e920280170c4b08943aac708f5f996 assets/immersiveweapons/blockstates/burned_oak_sign.json 9d4a1910f85d07c50ee63bf837f21b99983dd3dd assets/immersiveweapons/blockstates/burned_oak_slab.json e473727bec689bf04d1c8796bb56c0f6c198b075 assets/immersiveweapons/blockstates/burned_oak_stairs.json +02a7da69086ab59a7866f8185c96e308e6b46c2c assets/immersiveweapons/blockstates/burned_oak_table.json eb6bd0ecfaddb20559f47a88dbedb8f4c01ef69d assets/immersiveweapons/blockstates/burned_oak_trapdoor.json e7935780b8e920280170c4b08943aac708f5f996 assets/immersiveweapons/blockstates/burned_oak_wall_sign.json f6c861ee89ec3d134ba706d725d96a90f787a7f6 assets/immersiveweapons/blockstates/burned_oak_wood.json @@ -23,7 +26,9 @@ a87cd137cb571591a8e091a67e46e5235227c918 assets/immersiveweapons/blockstates/clo e4a8509a1cdd1ed8346b2178860716fcfb9b82ac assets/immersiveweapons/blockstates/cloud_marble_pillar.json a74e3757831e40d45c63487a63cbd49f2c93e2dc assets/immersiveweapons/blockstates/cobalt_block.json 2621ea424d31d66e1c978aa549c6d4a9c1f798e5 assets/immersiveweapons/blockstates/cobalt_ore.json +c528f4dd8ffd8a3726ac756128d2a9931ce6a4b9 assets/immersiveweapons/blockstates/crimson_table.json b2893fba1dfeb1834d22d6808a9a37c6b4bba60a assets/immersiveweapons/blockstates/cyan_stained_bulletproof_glass.json +54adbe0c95b076dcdf39e88fb17f82a30cfe49e4 assets/immersiveweapons/blockstates/dark_oak_table.json f74b973a32b5247e56651b0f0da234d46399ee40 assets/immersiveweapons/blockstates/deepslate_cobalt_ore.json 1843a4ab12e5e22c195e9b6dddf6c1949f1d1e75 assets/immersiveweapons/blockstates/deepslate_sulfur_ore.json 766a2a209fee385e31f5c0cc9ab17f2e56daffd5 assets/immersiveweapons/blockstates/dried_mud.json @@ -33,6 +38,7 @@ f74b973a32b5247e56651b0f0da234d46399ee40 assets/immersiveweapons/blockstates/dee 28e71f42a0754d781c443230196fc8d7bb938ea0 assets/immersiveweapons/blockstates/hardened_mud.json 91de74dda3299dca95934a6f4a36ae1219105e76 assets/immersiveweapons/blockstates/hardened_mud_slab.json 1725f7cbb8d42d2e83952c2f44074a3dc18533ae assets/immersiveweapons/blockstates/hardened_mud_stairs.json +bf3bd1ff710ce482adda6066c2fd47e242656bde assets/immersiveweapons/blockstates/jungle_table.json ccd406502e80d4990b7ae3335056e6cf97cb9e1e assets/immersiveweapons/blockstates/light_blue_stained_bulletproof_glass.json 33692ebbcb06693afcab5f451b994d37970166ee assets/immersiveweapons/blockstates/light_gray_stained_bulletproof_glass.json c866e83f002e98ea5d2b3019ebb28e184fbcb3cd assets/immersiveweapons/blockstates/lime_stained_bulletproof_glass.json @@ -41,17 +47,21 @@ a557e785726e5a9751009fe3370242ae180dcbba assets/immersiveweapons/blockstates/mol c73dfd31998d543bf0d2c123458bbc64a7657b7a assets/immersiveweapons/blockstates/molten_ore.json 85f5ef55550ec710877e62ebdbb7b152e48b6ec5 assets/immersiveweapons/blockstates/mud.json 44951189b38ed5266e94c9bf07f1730665e33937 assets/immersiveweapons/blockstates/nether_sulfur_ore.json +7acf20ab0ee50c068ca824e0f80435ca38de26e2 assets/immersiveweapons/blockstates/oak_table.json b7d6c52088070f55a8cf2400fc759c18a95ebb8c assets/immersiveweapons/blockstates/orange_stained_bulletproof_glass.json 5aa2c75b2886093c1d0a68f1c2ba135ab5a33557 assets/immersiveweapons/blockstates/pink_stained_bulletproof_glass.json 4943ab83a3c3ef15f8f443f6a591429316c4c88d assets/immersiveweapons/blockstates/purple_stained_bulletproof_glass.json cb68feb987f83dd9fa225981734682b4813920c0 assets/immersiveweapons/blockstates/raw_cobalt_block.json +9d02ac2bbb21d20d0767067d14e39594d787269e assets/immersiveweapons/blockstates/raw_sulfur_block.json e034cf878e5071d75e7962ca65240bf185636b66 assets/immersiveweapons/blockstates/red_stained_bulletproof_glass.json 5fce347c01aabc05fa10cea1c39bb0ab818d4c76 assets/immersiveweapons/blockstates/small_parts_table.json +b1f9b20c3054d3ada0088c3fd9dc034ca5353674 assets/immersiveweapons/blockstates/spruce_table.json 97bb58efe61a488c70606042d82cbbf706fdae83 assets/immersiveweapons/blockstates/stripped_burned_oak_log.json c9060b16155ae237d6aa92ac117dbcbae4bde9dc assets/immersiveweapons/blockstates/stripped_burned_oak_wood.json 6c91fcfb32ee93ef3a63da66854c22433ad997bf assets/immersiveweapons/blockstates/sulfur_ore.json 2619ee77e2528cfc62abe04af44ab64e417f9781 assets/immersiveweapons/blockstates/tesla_block.json ca6c333fb4fa613e072e5c5380b4d92687d2ca35 assets/immersiveweapons/blockstates/ventus_ore.json +c72a317af306860e9c085582861c26883b1d54d6 assets/immersiveweapons/blockstates/warped_table.json 5f9eb79ff6fb20e8b88d5945c408ff9f8662906b assets/immersiveweapons/blockstates/white_stained_bulletproof_glass.json cf9f023eaa56448b7be5c33941dacf1cd6145e6f assets/immersiveweapons/blockstates/yellow_stained_bulletproof_glass.json 70417a6f13cb7cd59ad28424f03fe17eaf6834c9 assets/immersiveweapons/models/block/black_stained_bulletproof_glass.json @@ -118,6 +128,7 @@ c0e423ee893282ffcc3b163849d7912d851e91ff assets/immersiveweapons/models/block/ma 819e3051269f8d11240df985eaad2e79c92bb231 assets/immersiveweapons/models/block/pink_stained_bulletproof_glass.json 6d13b53031de1ffc1422c68a3f59193a83a42d5b assets/immersiveweapons/models/block/purple_stained_bulletproof_glass.json 3d0e0f7d752ecfa882d23eff8d5ac5db8d4cdbb3 assets/immersiveweapons/models/block/raw_cobalt_block.json +8c333f9e44838f89948815ab2ab801f5e2c806a7 assets/immersiveweapons/models/block/raw_sulfur_block.json 3ca40cde7cf60b4a9ba83f116cd5b94f03fc0610 assets/immersiveweapons/models/block/red_stained_bulletproof_glass.json 0d898d424b810f0a2e134ece6b95e1582fc9814e assets/immersiveweapons/models/block/small_parts_table.json 57c04205b6587d4df2a8028730544574008ef677 assets/immersiveweapons/models/block/stripped_burned_oak_log.json @@ -127,6 +138,7 @@ f8436416e42356a219295018378a0a488a31df04 assets/immersiveweapons/models/block/te 108748715cb535c47d44b6de03412dcfc683098f assets/immersiveweapons/models/block/ventus_ore.json 2a6f9df313e779a2965b2c3254ced71e6c7be955 assets/immersiveweapons/models/block/white_stained_bulletproof_glass.json 064b7683a5ffad98d4154290a651732b8eec526c assets/immersiveweapons/models/block/yellow_stained_bulletproof_glass.json +15c319fa3356ed8018576757ced47277f4b67e15 assets/immersiveweapons/models/item/acacia_table.json fc6f50ea4eddd7d5310aa2575a0089d72184c520 assets/immersiveweapons/models/item/american_flag.json 507414a3f8c4978106bcf1c5f56f2ec8acb9cdb4 assets/immersiveweapons/models/item/azul_keystone.json 70e32be005a967b0fa98f03fd1d33e4bb8feba1f assets/immersiveweapons/models/item/azul_keystone_fragment.json @@ -135,6 +147,7 @@ fc6f50ea4eddd7d5310aa2575a0089d72184c520 assets/immersiveweapons/models/item/ame d642f34094b23a3103e535a1d5a84fcedb6efabe assets/immersiveweapons/models/item/barbed_wire_fence.json 12f088010e4d24abc9e597a2d7601c3b2d0ec009 assets/immersiveweapons/models/item/barrel_tap.json cb89d183e9867880c0cdc3740aa07ecf82e15723 assets/immersiveweapons/models/item/biohazard_box.json +814223f93002a636d776fedd1c43a222bc59c729 assets/immersiveweapons/models/item/birch_table.json bcbb36c48ccff9c14891a42a7756ebab61fd25a8 assets/immersiveweapons/models/item/black_stained_bulletproof_glass.json bdf5b18a797d8ee495d5980ad785451fa5ad43ac assets/immersiveweapons/models/item/blank_blueprint.json b6b66fc0ae6c46425eece6c05f0f8b886562f5b0 assets/immersiveweapons/models/item/blue_stained_bulletproof_glass.json @@ -154,6 +167,7 @@ cfd52bb2ea6ff14cde9e4cdfb1949675b08989e0 assets/immersiveweapons/models/item/bur a7af76b7db37084b492b495f4e28e4e8fe0cb147 assets/immersiveweapons/models/item/burned_oak_sign.json 706bc1fc4927806e09365f0b46e424f5c556e024 assets/immersiveweapons/models/item/burned_oak_slab.json 06fc1633a937c68d34d000b1f5e3a0c15eb21fd5 assets/immersiveweapons/models/item/burned_oak_stairs.json +f0d1a26b482a4a39dc7621b6f965e5585d463ee7 assets/immersiveweapons/models/item/burned_oak_table.json d2d3859b53e1e5bdf2e4f3036479223359b4bcac assets/immersiveweapons/models/item/burned_oak_trapdoor.json 576ca56febc3aa5d87b25078e3d6b673349b0c1e assets/immersiveweapons/models/item/burned_oak_wood.json 63a92a8b208338b700273321d88b677b7f942310 assets/immersiveweapons/models/item/camp_chair.json @@ -203,7 +217,9 @@ fd8834f4bd44f756f287ea00b9b7d3e88a886407 assets/immersiveweapons/models/item/cor d391fb7dacf43ff2c50a5863cb8b705f5270c525 assets/immersiveweapons/models/item/corrugated_iron_panel_bars.json 4f9485d61123ef1cd9d7c14adf7c22be07ab6f57 assets/immersiveweapons/models/item/corrugated_iron_panel_flat.json 943384480555f0f21f181edf2c788dec8d9172b9 assets/immersiveweapons/models/item/corrugated_iron_panel_flat_bars.json +4ad032ebed0dd86b4ceee7c460b426b3b51fd84f assets/immersiveweapons/models/item/crimson_table.json f0dbe3edc9dcbd469823b5fbc9bc49aa4edf6c8b assets/immersiveweapons/models/item/cyan_stained_bulletproof_glass.json +3f32e90891356de5cc6eb1683339dc1df77f6861 assets/immersiveweapons/models/item/dark_oak_table.json 2b964fe8218e1e1d6fc9e8c73ef254c7bf651d63 assets/immersiveweapons/models/item/deepslate_cobalt_ore.json 789f742b94f5e4f87aee1e98448848ccb62ed773 assets/immersiveweapons/models/item/deepslate_sulfur_ore.json bf3e263b6a75815879a49a170243767d9f59c3e0 assets/immersiveweapons/models/item/diamond_arrow.json @@ -234,6 +250,7 @@ a7c8cbcea0390f168617496aa6e47dd5ed8ed5d2 assets/immersiveweapons/models/item/imm bda2bbe9416e90228b338198a259392e9a011bd3 assets/immersiveweapons/models/item/iron_arrow.json a4dea1c3dfa2a53914b5d4490648129d64b984ae assets/immersiveweapons/models/item/iron_musket_ball.json 1b69f7c84b76c87a1a38e7de59c0748de149de7d assets/immersiveweapons/models/item/iron_pike_head.json +ab5343ad38dd92b0863f54d9e0ba1b1008b4823e assets/immersiveweapons/models/item/jungle_table.json 98167609bf3898587f7565736a6fc24a7966cacd assets/immersiveweapons/models/item/lava_revenant_spawn_egg.json 9bb7ceeb19db5eca60a67add696cf05b58ae5e1c assets/immersiveweapons/models/item/light_blue_stained_bulletproof_glass.json dd4dead3c49aefa047bb7d4b6090ca769cacb2e1 assets/immersiveweapons/models/item/light_gray_stained_bulletproof_glass.json @@ -253,7 +270,6 @@ ff70ba9e39ea0f165eae8ed14e086c8b372d51f3 assets/immersiveweapons/models/item/mol bd2ba69cd419e3c537761082723e12e53c15b9e2 assets/immersiveweapons/models/item/molten_leggings.json 70b6197c885ffacb3fa6493e83a941be523a8106 assets/immersiveweapons/models/item/molten_ore.json e43e9a406ec4beef35b25d5631cff6b1ca172057 assets/immersiveweapons/models/item/molten_pickaxe.json -3ade49faa65024fe547a9cb5661442a6ced5110a assets/immersiveweapons/models/item/molten_plate.json abf341b99c68fd85dbf4b4139d80946a82a243a5 assets/immersiveweapons/models/item/molten_shard.json 4de2d12c6a81636c985d3686ee231e92ffa8fbed assets/immersiveweapons/models/item/molten_shovel.json eaa8248568db10c523fc4fc7cfef06e8355473d2 assets/immersiveweapons/models/item/molten_sword.json @@ -264,6 +280,7 @@ eaa8248568db10c523fc4fc7cfef06e8355473d2 assets/immersiveweapons/models/item/mol 2b44c9561625aa06165920e1082ccae7ff79b451 assets/immersiveweapons/models/item/nether_sulfur_ore.json 34a11bc928b4636f468b8e6764ccf0a9fb226804 assets/immersiveweapons/models/item/netherite_arrow.json 04a9d056c6e540db9270d7f22fa8c8be387b66f6 assets/immersiveweapons/models/item/netherite_musket_ball.json +a65e07a3238bce2fa4097af6c814875839fe66ed assets/immersiveweapons/models/item/oak_table.json f215d07cf6eb458653a3b1caf71d2caae6ad8713 assets/immersiveweapons/models/item/obsidian_rod.json feeeeae0e337100d9629948aa340539153983362 assets/immersiveweapons/models/item/obsidian_shard.json 9acc9b96676829c3d42290f7218ce274f99dc1e2 assets/immersiveweapons/models/item/orange_stained_bulletproof_glass.json @@ -276,6 +293,7 @@ ac0cf58945d209fd39b3959c88bca8a1e8982688 assets/immersiveweapons/models/item/pun 95f27eff2c91d14fa1406415b03cd1ef4fdc8e41 assets/immersiveweapons/models/item/purple_stained_bulletproof_glass.json aee74d5ed5e46b58ad37606fe3cf7fb1522f932d assets/immersiveweapons/models/item/raw_cobalt.json 736bb1a9c1e87f039aa2529b159bcf82ff48860c assets/immersiveweapons/models/item/raw_cobalt_block.json +39940d7518eb54882182dd63da648034361955b0 assets/immersiveweapons/models/item/raw_sulfur_block.json 4e4632ec508dc0f7c1e81d8637fde075bced4179 assets/immersiveweapons/models/item/red_stained_bulletproof_glass.json 98167609bf3898587f7565736a6fc24a7966cacd assets/immersiveweapons/models/item/rock_spider_spawn_egg.json b41561f346c4b555608262a9dbc67e805a299b2b assets/immersiveweapons/models/item/small_parts_blueprint.json @@ -292,6 +310,7 @@ dd6983b2ad39b45b1f01745a7ff858707898e322 assets/immersiveweapons/models/item/sma fc08a9f7042b04138e0e5f79fc935ddad5fb566d assets/immersiveweapons/models/item/smoke_bomb_arrow_red.json 8657f763c5c3c56398f0e2e7ce50900cbebf1cd5 assets/immersiveweapons/models/item/smoke_bomb_arrow_yellow.json 92f426e45cd6d3f5cb1253f447ec7c3f98292752 assets/immersiveweapons/models/item/smoke_powder.json +544801965337cd3b8e7daffaa83726be68d1a557 assets/immersiveweapons/models/item/spruce_table.json 29af2daf23be78ccf1134b260dee7d7f774e9be0 assets/immersiveweapons/models/item/stone_arrow.json 14f7e9bf90a911dc79e3181c9c9e378cac3d3066 assets/immersiveweapons/models/item/stone_musket_ball.json 1e0f5b61e521e291d51feec57e6796669e24a8ab assets/immersiveweapons/models/item/stone_pike_head.json @@ -310,7 +329,6 @@ f4d259f6cbe664d86e9dd288cca13db1855388a5 assets/immersiveweapons/models/item/sto d576d505c712a382f7ca4fa7db0c2972383f063d assets/immersiveweapons/models/item/tesla_ingot.json 0de5e0ec4906ae0883dd0fbd65c70cc303d01485 assets/immersiveweapons/models/item/tesla_leggings.json 5e8f4c252792ea7380fb72e8be8cc765aa498ada assets/immersiveweapons/models/item/tesla_pickaxe.json -7e9d124e965ec3e537017d6198932b6e50a2ccb4 assets/immersiveweapons/models/item/tesla_plate.json 932c3f111bf97f8de98c570f74a8b5ee2010006b assets/immersiveweapons/models/item/tesla_shovel.json 9c304305138dc67073b2dd5d304862d693cd2093 assets/immersiveweapons/models/item/tesla_sword.json 7ba38d3fbcff25a86dee7681a0545c172687a2bd assets/immersiveweapons/models/item/tesla_synthesizer.json @@ -331,6 +349,7 @@ a115c764be09022dc434fc6d5d7d49b73a5da76f assets/immersiveweapons/models/item/ven 4db469652e5c14c765c85df4c6f35ae2624f767d assets/immersiveweapons/models/item/ventus_sword.json 185b3f72e9392a16c41d64efebee200ee87ef012 assets/immersiveweapons/models/item/wall_shelf.json 98167609bf3898587f7565736a6fc24a7966cacd assets/immersiveweapons/models/item/wandering_warrior_spawn_egg.json +07c6e9a0d7940ee35e2dc63041c9160490c4bbfd assets/immersiveweapons/models/item/warped_table.json 1148a810002831fe0bb7a3aa7aaea6c6e9eaf150 assets/immersiveweapons/models/item/warrior_statue_base.json e391cdf96c4864acd93a6840a0b5a17a3174ab81 assets/immersiveweapons/models/item/warrior_statue_head.json cd1c048af61919b7c0541a9ea07f0b970273a772 assets/immersiveweapons/models/item/warrior_statue_torso.json @@ -341,7 +360,6 @@ c62b4e547a55fdf2d4236594032bff2890114e35 assets/immersiveweapons/models/item/woo 41c796c877b1f49bbe73553b7893c6d195760356 assets/immersiveweapons/models/item/wood_shard.json c51fc2240ec6a033466139d4d43a4520bb56e97c assets/immersiveweapons/models/item/wood_tool_rod.json 0d948a1d52087d824ee1c1175d8e11f0dc11bab5 assets/immersiveweapons/models/item/wooden_spikes.json -d797e7821e84cc6e41636833a42f85e594e3551b assets/immersiveweapons/models/item/wooden_table.json b3cfed076418fd4dd830ce8f1c861c23fec3c10d assets/immersiveweapons/models/item/yellow_stained_bulletproof_glass.json 1669ef931edc11fd4db10520766188d08107d408 data/forge/tags/blocks/bulletproof_glass.json a7bffd9267089ddfe36ba70d024ff653d1650419 data/forge/tags/blocks/glass.json @@ -362,28 +380,57 @@ f995b98ddd6c2aa73e389a839352cab305b6391f data/forge/tags/items/ores.json 587fc72deca2e0aed8867449c0b88e0ab18f1e1c data/forge/tags/items/pickaxes.json abae19f6a9ecfe01b9c3b51f78460e6ac38eb66c data/forge/tags/items/stained_glass.json 60760042df8807aa72082c5e595668c4dc22d3e6 data/immersiveweapons/advancements/almost_flying.json -b1fee0809df39b5115f1be9b3d4314b0b052d5ab data/immersiveweapons/advancements/azul_keystone.json +48919cf5515b1f85a4686d98169cf34fedbed4c3 data/immersiveweapons/advancements/bamboo.json 0c16958cb896e659855bd761486c87d875e77d0c data/immersiveweapons/advancements/bandage.json -069bfbdbcdd29cf491bad03d49f2c00f5d65bcfe data/immersiveweapons/advancements/battlefield.json +9f7000885c57bb7f897c9213b736c6f00782f484 data/immersiveweapons/advancements/biohazard_box.json fcb8e1e4bbd1fb85496c8f31752a8d70eda3e317 data/immersiveweapons/advancements/blueprint.json c1e4e105607442b7f4cb0877e88c455e89602c2c data/immersiveweapons/advancements/blunderbuss.json 19e7d295397efce685b9482ae3af45da7cd6d7f6 data/immersiveweapons/advancements/bottle_of_alcohol.json +ef5c7dc387b5973c614846e1e5f1e341ad8a817b data/immersiveweapons/advancements/cloud.json +66b0db1c43647266f7f9c2f9492308657c376ea3 data/immersiveweapons/advancements/cloud_marble.json +62ea9f424ac61ec22691ca9a3cc240adfcba8ba3 data/immersiveweapons/advancements/cobalt_axe.json +998dd0bec1379b4d48ad2c93f5f9c16bedfd5e63 data/immersiveweapons/advancements/cobalt_hoe.json +9a854a249b7ba9f0210845e206399e057d297645 data/immersiveweapons/advancements/cobalt_ingot.json +4bf05c755c54fd31e5640741b2f24552d7a83afc data/immersiveweapons/advancements/cobalt_pickaxe.json +83955c52dfba9b6b7c3e358e4294178050894e93 data/immersiveweapons/advancements/cobalt_shovel.json +2ec9f29422b6413a4cc0861e22c6b99ee9313824 data/immersiveweapons/advancements/cobalt_sword.json +f2dffad581608701396a88744cd70fe503109a94 data/immersiveweapons/advancements/cobalt_tools.json dd77214c9196328ffe64172b836a1bbf026a8423 data/immersiveweapons/advancements/conductive_alloy.json +a6b1f95a1eeb86c29d42b6ab341836d761cac9be data/immersiveweapons/advancements/copper_axe.json +746fe2bc9ce7e3faf7922141560b6cc60fd1de24 data/immersiveweapons/advancements/copper_hoe.json +903e87fdde4743b1c618ab89f577d443cfd91987 data/immersiveweapons/advancements/copper_ingot.json +72033c167e12dac60b6907e4d99d1430651ffd5c data/immersiveweapons/advancements/copper_pickaxe.json +f79ae1a189268b95096904b40e802120d6993a05 data/immersiveweapons/advancements/copper_shovel.json +f413c4dea6a1751484f31b9b86e0608a4d036c5d data/immersiveweapons/advancements/copper_sword.json +825a33628e397379a672fda5a6bab1581786345d data/immersiveweapons/advancements/copper_tools.json +81ffbb4340c2714506d8e2ff80bff91fe7c2c576 data/immersiveweapons/advancements/diamond_shard.json 66882b23a0854c85ff592cd9e4f655d16fcf44ae data/immersiveweapons/advancements/electric_ingot.json -3d9c4825cfeecc346f2a7d1875f967808aae424f data/immersiveweapons/advancements/energized.json +b1120973063a26aade0ce229c66e281e4b3513d0 data/immersiveweapons/advancements/energized.json c6d96e4714df6fe172a69d1f32149636f1ba3453 data/immersiveweapons/advancements/first_aid_kit.json 09c8146b2ea4dead44781b057f4563a8f814b1d4 data/immersiveweapons/advancements/flintlock_pistol.json 62ead04deadb5148174a0330471a7fe2398aba23 data/immersiveweapons/advancements/gauntlet.json +e13621ee7b0d10a8285305130484a886b9930b9e data/immersiveweapons/advancements/gold_ingot.json +383b04d9051d801fd8838862c80f086b483bfb5c data/immersiveweapons/advancements/ingots.json faafcf82bdadb1152e80a3481fd9c1da96eb45c7 data/immersiveweapons/advancements/lava_bath.json 396163e9f61c8b8672e9517061f58884fbc8db29 data/immersiveweapons/advancements/molotov_cocktail.json +689cb3a87a26ca0af5440b47fc7576a3668ab951 data/immersiveweapons/advancements/molten_axe.json +5bd89a47ca017bd79a27de5f0d25f2547a74fcf0 data/immersiveweapons/advancements/molten_hoe.json 2ee5c5f2f72922679780e159cdbb04038b38e4ef data/immersiveweapons/advancements/molten_ingot.json -af727adc7518699fb902d71c716b2951d4311682 data/immersiveweapons/advancements/molten_plate.json +9fd373950695a513422237f900d420899dfcd6d8 data/immersiveweapons/advancements/molten_pickaxe.json 9058171aca0304ad0ab218929f4929b81710e95a data/immersiveweapons/advancements/molten_shard.json +e1ed57a33c785b78e97bd80c21a20ca6466dfbb9 data/immersiveweapons/advancements/molten_shovel.json 7dbfe98be8dae1f241da120b4d105ac1191730f9 data/immersiveweapons/advancements/molten_sword.json +1db6599ed3cd3853533c42c6e4194e2c0243c3a6 data/immersiveweapons/advancements/mud.json +b6cbf49f276b95d22abe61ea77f3947aaddcd87a data/immersiveweapons/advancements/musket_ball.json +813841587553adc9ed008f27fff7319b6fda8465 data/immersiveweapons/advancements/netherite_ingot.json 6dbcf0319629c2c7191b3620e12750b1931330cd data/immersiveweapons/advancements/netherite_projectile.json +4f1a4839b4806d4fbc93f1a15c522fcae666e201 data/immersiveweapons/advancements/nuggets.json +64e8fcaca83afe2b22678127cfbab3294b186008 data/immersiveweapons/advancements/obsidian_shard.json 1dab3d972cb3da5aa563415d4d7323c34c16c99e data/immersiveweapons/advancements/pike.json -f42dcc29b60a518bc03e32f058c38ce74b8b5995 data/immersiveweapons/advancements/play_with_fire.json -1da40a59e5fa11179f4ac6c40f9a7d5cfe9dc7a0 data/immersiveweapons/advancements/pretty_windy.json +fb697f8055920153f614db5668bd1daa1e54320d data/immersiveweapons/advancements/planks.json +b24e67192570f78f6a7e486ad879c8571b6d247b data/immersiveweapons/advancements/play_with_fire.json +fb618e1122dd1b830eee51a449b5ca6246d0d53a data/immersiveweapons/advancements/pretty_windy.json +3bbac7c874cb5ab2d6b0e9b09db385b0d2479dc2 data/immersiveweapons/advancements/recipes/immersiveweapons/acacia_table.json de074d32bb3e0ef502992735cb0ebed0e8cd454b data/immersiveweapons/advancements/recipes/immersiveweapons/american_flag.json da4659311dc5f5ea128046993ad617f41d96f165 data/immersiveweapons/advancements/recipes/immersiveweapons/azul_keystone.json 063af94b735c38170a6748c6ff29a88e69a0d407 data/immersiveweapons/advancements/recipes/immersiveweapons/bandage.json @@ -391,6 +438,7 @@ da4659311dc5f5ea128046993ad617f41d96f165 data/immersiveweapons/advancements/reci 8f27e47e8ef7ef595c9bf2960244d878f1545627 data/immersiveweapons/advancements/recipes/immersiveweapons/barbed_wire_fence.json b09fb78396d79c0ac16b0b2aebb224740b4acd3b data/immersiveweapons/advancements/recipes/immersiveweapons/barrel_tap.json 038707c917d14f2939550a9ceb8f64fa23ac9f5f data/immersiveweapons/advancements/recipes/immersiveweapons/bear_trap.json +ef81a179fdfcd9db1d6f5973c6aae08c9622adc2 data/immersiveweapons/advancements/recipes/immersiveweapons/birch_table.json 65637ba73d76ba64dac7072e67ce49e18d9f61a1 data/immersiveweapons/advancements/recipes/immersiveweapons/black_stained_bulletproof_glass.json ea4b910cbc448fc22019de4336c5a2f59bcad7d8 data/immersiveweapons/advancements/recipes/immersiveweapons/blank_blueprint.json 365695ba91270afcb9fc3e7443ebde04772a5aa1 data/immersiveweapons/advancements/recipes/immersiveweapons/blue_stained_bulletproof_glass.json @@ -408,6 +456,7 @@ c735cc6546eb48bb5e63f1df0038f4eabc9b4b4e data/immersiveweapons/advancements/reci c6cbf10ba40e2a5510fd9d4cded7d16292f9861e data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_sign.json 87958649774e30d2bdf6a6bc99c57d9b77431eaa data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_slab.json 450bfb9580718dd5e1722a7e1ee9f7ae77356760 data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_stairs.json +14a8c5a93ad7c0c7facba89541bd917c0bd3e527 data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_table.json 707bea34aef3c35c9bace480116ba8227712a4c6 data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_trapdoor.json 0f4a61d9bf382c5d67270be6f7524a14011ebf80 data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_wood.json a09b02da8a71ed08a7d029f6b8af3c150e55de26 data/immersiveweapons/advancements/recipes/immersiveweapons/camp_chair.json @@ -469,7 +518,9 @@ f48f426d879291241b628871f9e512dd45072aa3 data/immersiveweapons/advancements/reci 0efb275561f0aa8d86c7ee554d7e040544fbd528 data/immersiveweapons/advancements/recipes/immersiveweapons/corrugated_iron_panel_bars_alt.json e545d6d57d20df748a10a99b24dc65afeee634cb data/immersiveweapons/advancements/recipes/immersiveweapons/corrugated_iron_panel_flat.json 4ba8bd5c7de39ea227a53bd192d69a2adfa2baba data/immersiveweapons/advancements/recipes/immersiveweapons/corrugated_iron_panel_flat_bars.json +de74f94c0d24ab773a7a153de19bb597473169e7 data/immersiveweapons/advancements/recipes/immersiveweapons/crimson_table.json dfde635a5338d085f733f265c2ea2399b2925695 data/immersiveweapons/advancements/recipes/immersiveweapons/cyan_stained_bulletproof_glass.json +8e37f66061b6aada5e30a73f937dd9a3a4a9beaf data/immersiveweapons/advancements/recipes/immersiveweapons/dark_oak_table.json fae9a0e571b5ac57b6cfe0b471ce57a1bfb80f33 data/immersiveweapons/advancements/recipes/immersiveweapons/diamond_arrow.json f30bda809108510727c2b6f13bd30ad4e59f945a data/immersiveweapons/advancements/recipes/immersiveweapons/diamond_gauntlet.json e7fcfca2be6214df2ed049e12438a69210ba2ea4 data/immersiveweapons/advancements/recipes/immersiveweapons/diamond_musket_ball.json @@ -510,7 +561,8 @@ afd7677c4751768903ae0fc8f05a85ea5d502e77 data/immersiveweapons/advancements/reci 23fadb484f31bd1640ab383e0f32b2462cc384d9 data/immersiveweapons/advancements/recipes/immersiveweapons/iron_musket_ball.json 65fe07a4b50b6c53759cf168831a542f7f82755c data/immersiveweapons/advancements/recipes/immersiveweapons/iron_pike.json 721f98d510cf1d0ddb0903a87be96de0595066cb data/immersiveweapons/advancements/recipes/immersiveweapons/iron_pike_head.json -349e868a88b5ee60bde3dd4ca24efd462631672f data/immersiveweapons/advancements/recipes/immersiveweapons/landmine.json +5a7e01830128ec98637841c22921c5414ce54ba3 data/immersiveweapons/advancements/recipes/immersiveweapons/jungle_table.json +0e1f0681450363e97b2d3e4a30c23b04dbb41a99 data/immersiveweapons/advancements/recipes/immersiveweapons/landmine.json 33e6a915def1fa1bbf90467d74215fa2cd03e61d data/immersiveweapons/advancements/recipes/immersiveweapons/light_blue_stained_bulletproof_glass.json 651d087da57ddcc3e8cf4347ae732113ef0210d1 data/immersiveweapons/advancements/recipes/immersiveweapons/light_gray_stained_bulletproof_glass.json d5e9138f14f5073794d0a4dbcc13c63e09548aca data/immersiveweapons/advancements/recipes/immersiveweapons/lime_stained_bulletproof_glass.json @@ -529,7 +581,6 @@ e125583f89ddcd0131b3aa59b8d23f0042ed5d81 data/immersiveweapons/advancements/reci f136e3e2c7e2887319899aee17ed4a1dc7bf9964 data/immersiveweapons/advancements/recipes/immersiveweapons/molten_ingot_from_smelting_molten_ore.json 000f2c4711852c805929759414b9a87bc2d83900 data/immersiveweapons/advancements/recipes/immersiveweapons/molten_leggings.json 9f7b2bf1a96f27c153385a26ebdb59e6e8075659 data/immersiveweapons/advancements/recipes/immersiveweapons/molten_pickaxe.json -a68da99b9b64fb676f53baec35a62df71a2aef76 data/immersiveweapons/advancements/recipes/immersiveweapons/molten_plate.json dc81b7ab708491cf7b04d98e0e272702c1e01d79 data/immersiveweapons/advancements/recipes/immersiveweapons/molten_shovel.json 1dcee74dd497762684cc57c858f929804ba24e53 data/immersiveweapons/advancements/recipes/immersiveweapons/molten_sword.json b385225e9f645b0d53983245dfe12c97eb69730e data/immersiveweapons/advancements/recipes/immersiveweapons/morphine.json @@ -543,6 +594,7 @@ c34fca120607e779d82362927fc7e7cc12d88420 data/immersiveweapons/advancements/reci 0b8da9f502695c44931b75f47ac160d355d4b041 data/immersiveweapons/advancements/recipes/immersiveweapons/netherite_gauntlet_smithing.json 09cc76217dbf0c31e93bc423f00a97c270cb316f data/immersiveweapons/advancements/recipes/immersiveweapons/netherite_musket_ball.json 109d2769faaed0b6fbe5432b89de087269be1349 data/immersiveweapons/advancements/recipes/immersiveweapons/netherite_pike_smithing.json +14ff2d34ea1351a6b7e0abf86aba9833dedde86b data/immersiveweapons/advancements/recipes/immersiveweapons/oak_table.json 92186f7bd16356da7da0e67b5cc23454731c6361 data/immersiveweapons/advancements/recipes/immersiveweapons/obsidian_rod.json c47f5af8f41af836415d1ac4c8117f69504d164b data/immersiveweapons/advancements/recipes/immersiveweapons/obsidian_shard.json c76a0657161b9bb7a05cc3520c0db1b7e01be34b data/immersiveweapons/advancements/recipes/immersiveweapons/orange_stained_bulletproof_glass.json @@ -555,6 +607,7 @@ db16d3f2cdc951a5d4d48a24b4a159780dc61d5e data/immersiveweapons/advancements/reci d869e46a98d11c463830d4a1381be71a1926db94 data/immersiveweapons/advancements/recipes/immersiveweapons/purple_stained_bulletproof_glass.json 386a539e0153b522760efbdbfe074fc8afa58692 data/immersiveweapons/advancements/recipes/immersiveweapons/raw_cobalt.json e7f769329aaa16c1e019837714077f9279d3a09c data/immersiveweapons/advancements/recipes/immersiveweapons/raw_cobalt_block.json +85588954d33f4fe7d1d7a4dfea9bc90c2bd52d96 data/immersiveweapons/advancements/recipes/immersiveweapons/raw_sulfur_block.json 89a8501242e3a05d65cc24c6382b8e2bb61567ba data/immersiveweapons/advancements/recipes/immersiveweapons/red_stained_bulletproof_glass.json ba5af41097abaee5410602a10411dcbdd74231fb data/immersiveweapons/advancements/recipes/immersiveweapons/sandbag.json d285938ba5f9312b98c7711c0159be2374196e06 data/immersiveweapons/advancements/recipes/immersiveweapons/small_parts_blueprint.json @@ -579,12 +632,14 @@ cd65882c064da3161211f4af5feb3663c350131d data/immersiveweapons/advancements/reci e8d77ef58c050240772dcad0f7b74309e96da4b9 data/immersiveweapons/advancements/recipes/immersiveweapons/smoke_powder.json a1b1b7af85d719747c405eb78e1004013460705f data/immersiveweapons/advancements/recipes/immersiveweapons/spike_trap.json b304227837f5a55e310fe9ec9c3431ce9f214a04 data/immersiveweapons/advancements/recipes/immersiveweapons/spotlight.json +8f963d4f7b791d906ba43144e8d54a2e4220b2e1 data/immersiveweapons/advancements/recipes/immersiveweapons/spruce_table.json e0a24a7e48125c259326bb92e35e0d5a14cc5a88 data/immersiveweapons/advancements/recipes/immersiveweapons/stone_arrow.json 6703edf37a44f337a961689a878291c2e1fabf80 data/immersiveweapons/advancements/recipes/immersiveweapons/stone_gauntlet.json aed12b5cbe3acb4e34f662953dc3ce467fa765fd data/immersiveweapons/advancements/recipes/immersiveweapons/stone_musket_ball.json 584e75615fd714e71123461868129cea1e6c82e9 data/immersiveweapons/advancements/recipes/immersiveweapons/stone_pike.json d86aa6fff04e501e05f688b5a446733deb37ae52 data/immersiveweapons/advancements/recipes/immersiveweapons/stone_pike_head.json e4d1b96e59cdbaefd61ef78fd4fc58343ebb6ad8 data/immersiveweapons/advancements/recipes/immersiveweapons/stone_shard.json +75aed49b7a1e7e5be6297e9c41fba1208c47f69c data/immersiveweapons/advancements/recipes/immersiveweapons/sulfur.json d3146571a6d01a212870ecd067c492a27530517a data/immersiveweapons/advancements/recipes/immersiveweapons/syringe.json 36364e00c15354e0a4eef92de087863f5f5062c6 data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_axe.json 3683d9f7fa70116ef22b100dfc7272f691b55ad2 data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_block.json @@ -596,7 +651,6 @@ f7139fc07645bc824bb4b0ac81f202028d70689f data/immersiveweapons/advancements/reci 53bd1539c91763b5f95a20ab3d45c186d549c540 data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_ingot_from_tesla_block.json 9485d093a06f78d3166fcb2ac44e24ae4dd59264 data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_leggings.json 33ec075d64e9052f50c0e84a649ab9116bee26fd data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_pickaxe.json -449d0feb66ac1c5e5c47369893d488e5344a364d data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_plate.json d93b40d8b30b8edb4eb9652c3fc021cbfddf5908 data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_shovel.json bc3d8f777c541bee75250c1414877d29048c8962 data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_sword.json 9b5af580951eb7530b4a5ea1ab740ac03c7e9640 data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_synthesizer.json @@ -613,6 +667,7 @@ f7d1a470e02b59196674b0591f2018fd85be3162 data/immersiveweapons/advancements/reci cfba54617bf40595fe3e73c99ab883ae110c1af0 data/immersiveweapons/advancements/recipes/immersiveweapons/ventus_staff_core.json a0cf6a60a5d9b3163bee45074bc9d948cc2242f2 data/immersiveweapons/advancements/recipes/immersiveweapons/ventus_sword.json 50e9ab41f799791fce639114b38595fc21c72909 data/immersiveweapons/advancements/recipes/immersiveweapons/wall_shelf.json +0a5d02a40c95228117c375515660d88cb6f5a022 data/immersiveweapons/advancements/recipes/immersiveweapons/warped_table.json d9d912d13e68077164848a4ac4910096883ae550 data/immersiveweapons/advancements/recipes/immersiveweapons/warrior_statue_base.json 5da0426fc1892353e7afd8ca86d70957b8feefa9 data/immersiveweapons/advancements/recipes/immersiveweapons/warrior_statue_head.json 9a12ab302063185f13c7d7b30c15024b195dc86b data/immersiveweapons/advancements/recipes/immersiveweapons/warrior_statue_torso.json @@ -624,26 +679,32 @@ ce4ce92544c5e76fa56e6b597e1a5fa0c3be7e39 data/immersiveweapons/advancements/reci 6dd2f89d3d672971f213e2a4985f582f2fe22560 data/immersiveweapons/advancements/recipes/immersiveweapons/wood_pike_head.json 3cbcdb910fbb71d78f588da5f541295eb914c508 data/immersiveweapons/advancements/recipes/immersiveweapons/wood_tool_rod.json 40306d61781fc28cbdbb28bff63eb092bd3f57e8 data/immersiveweapons/advancements/recipes/immersiveweapons/wooden_spikes.json -c126b6400ce4b2f6437a0ebf80712aea06b9c6f3 data/immersiveweapons/advancements/recipes/immersiveweapons/wooden_table.json 62f7715648f92684266f86e47c20856cfbdbf6e7 data/immersiveweapons/advancements/recipes/immersiveweapons/yellow_stained_bulletproof_glass.json -f2fc36e80a215e4979f19ea6530dbd8287fa673f data/immersiveweapons/advancements/rich_no_more.json -1c973d86144b37a103dcd927a70f2f12bdc3c084 data/immersiveweapons/advancements/root.json -0e53a3617a7ba464cb555b846fd24f94c9443c59 data/immersiveweapons/advancements/shards.json +111210cf74e3b2aefc3d43a60269a2fe1df02c6d data/immersiveweapons/advancements/root.json +9c24c439bbde0e9bccb83c71d2cd8312774684c5 data/immersiveweapons/advancements/shards.json 49e05ed7b7592d0907e8af4d3be10865a7cf506e data/immersiveweapons/advancements/smoke_bomb.json +7573e90f1a26a3b549bf13350f5669e77dbd11b4 data/immersiveweapons/advancements/stone_shard.json +6a94bd6d0acb704a6d92e9561a787f1c268f1c58 data/immersiveweapons/advancements/tesla_axe.json 3cc127d4b018cba7bdf2177a039d925ed073b450 data/immersiveweapons/advancements/tesla_coil.json +fafd45ff9e188b07c6d171f2fe15007a6ae2e001 data/immersiveweapons/advancements/tesla_hoe.json 4ef4286c22f580dab730564576480dbd346189fd data/immersiveweapons/advancements/tesla_ingot.json +8e7c578932b41e9db85a3e865d4a3a44fa9ebb63 data/immersiveweapons/advancements/tesla_pickaxe.json +892abe3c02b60ef84ed034b967dab4eac80a1fdd data/immersiveweapons/advancements/tesla_shovel.json b4af3558485cea031a8265fa308681e8735f4991 data/immersiveweapons/advancements/tesla_sword.json 3edcd8f36edfa52103950028066eb805e450ab79 data/immersiveweapons/advancements/tesla_synthesizer.json -edad11154f0acaaf4c2767e8d8457351ce8a55b8 data/immersiveweapons/advancements/tiltros.json 169624368a63efa5be29ede8106edd82189cf322 data/immersiveweapons/advancements/tool_rod.json 518110556eb5ff5771007b0a3f8c44c95e8bc3d3 data/immersiveweapons/advancements/traps.json ecdf98e9cce18a5c1fae211ac7b0c3204b633a3a data/immersiveweapons/advancements/used_syringe.json +06caed24978597084a272de95c5dfeb651deebc9 data/immersiveweapons/advancements/ventus_axe.json +df241e6c6766cb2c9b11a097a0c4bebb57ef92f6 data/immersiveweapons/advancements/ventus_hoe.json +a6816724da73ce4b99d110bb40a6ce2cba21565b data/immersiveweapons/advancements/ventus_pickaxe.json ccb7f8b1f51295af1eb0913b8d61a6482538902d data/immersiveweapons/advancements/ventus_shard.json +dc80fabaf8bae9239e48232dbc1eba0ac332ad32 data/immersiveweapons/advancements/ventus_shovel.json d4876ace60fe5d0420ceb0056326ad3756ac0040 data/immersiveweapons/advancements/ventus_staff.json 579f4a696b8bcabe48dc1af000b534d389e4004f data/immersiveweapons/advancements/ventus_staff_core.json 3710964e26a22c7cd797803a1e384f500c7a6bf9 data/immersiveweapons/advancements/ventus_sword.json -58622577195573640b46f9c9907cd32816e0065e data/immersiveweapons/advancements/warm_and_toasty.json -5730b7a7706deb2263fb64402320423dccb29f92 data/immersiveweapons/advancements/warrior_statue.json +2a3755764a698e576a63024c32f6d7c67e9b1b86 data/immersiveweapons/advancements/warm_and_toasty.json +47a87dc9991757e91e591355f1482268f7abba69 data/immersiveweapons/advancements/wood_shard.json 2d7f391b4bc350415857eee1218509f9c8f3eee7 data/immersiveweapons/loot_tables/blocks/american_flag.json a6c337c02e1d100738df89268fc3196177ce8496 data/immersiveweapons/loot_tables/blocks/barbed_wire.json 4e433d50c7a535375c42e764b76860a14fe4e99f data/immersiveweapons/loot_tables/blocks/barbed_wire_fence.json @@ -698,6 +759,7 @@ d94ca3e1f0d5cc03bedd774aff3ad52248d670d8 data/immersiveweapons/loot_tables/block 2b356fb96829edf29f9f1b7ebea74b5aaecdb0a5 data/immersiveweapons/loot_tables/blocks/mortar.json c65ff450f8bd6c2f10f25c5169d423d12f3277a9 data/immersiveweapons/loot_tables/blocks/mud.json 6bab2dc7eec2eda0fc59b9a080c2a3994fc32f5e data/immersiveweapons/loot_tables/blocks/nether_sulfur_ore.json +ba24876c47547377474ee114b82ffc21c22ab002 data/immersiveweapons/loot_tables/blocks/oak_table.json 370bb13993c6284d921739d3ee8063c3a22996c3 data/immersiveweapons/loot_tables/blocks/panic_alarm.json 4630a03806722db596044c0712df6f05b05fc4f9 data/immersiveweapons/loot_tables/blocks/pitfall.json 3d752ba0720adf46fa2de9ed157b34688c714540 data/immersiveweapons/loot_tables/blocks/punji_sticks.json @@ -718,19 +780,19 @@ c66eb2c96adf76f16264d950f657dc31ddab10c0 data/immersiveweapons/loot_tables/block 2edce113a8c4519a7337502608b153e86f20c9f2 data/immersiveweapons/loot_tables/blocks/warrior_statue_head.json a6a67131213ed5eb7fef362bbff1eb8ca0520ec5 data/immersiveweapons/loot_tables/blocks/warrior_statue_torso.json 9cb0cb7d34635a50f64593b0a1d60c556759dece data/immersiveweapons/loot_tables/blocks/wooden_spikes.json -05ab199e5c3a909779c46669200129257ce2e1ee data/immersiveweapons/loot_tables/blocks/wooden_table.json 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 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 -eb9172b34f2a9eaa72c42556e5460d6717f7e4d0 data/immersiveweapons/loot_tables/entities/dying_soldier.json +74af4bc233b6c1d25fe5642d99c488b44e905464 data/immersiveweapons/loot_tables/entities/dying_soldier.json 29c8aa58de383aaf60ddb413c89ab7c0f9d0c422 data/immersiveweapons/loot_tables/entities/field_medic.json caaf0a5851ada9fc087b617791bfcd197e6b24ee data/immersiveweapons/loot_tables/entities/hans.json -a2f7c9014d9a1b591c2eaf4fd16a396e05b343c9 data/immersiveweapons/loot_tables/entities/minuteman.json +45acd620be55549a2eb08f23727b12b177aa32b6 data/immersiveweapons/loot_tables/entities/minuteman.json 4ee9be442da08056657ddad3d8154ef4ae5470e6 data/immersiveweapons/loot_tables/entities/rock_spider.json 8fde432d722b7094fb1c5c26639716a2b15dc91d data/immersiveweapons/loot_tables/entities/wandering_warrior.json +1ebdb588901c84b28a27a4fe4e54a54c555b0f81 data/immersiveweapons/recipes/acacia_table.json dda4480ea59c6b064a197b526656c9f1d84536b2 data/immersiveweapons/recipes/american_flag.json dedb9beb43d56920a818b734d2cdd1b57507dbf1 data/immersiveweapons/recipes/azul_keystone.json 0616647a471786c4dd7de756db0651c6227c8799 data/immersiveweapons/recipes/bandage.json @@ -738,6 +800,7 @@ dedb9beb43d56920a818b734d2cdd1b57507dbf1 data/immersiveweapons/recipes/azul_keys 6ac54a9784352527550f66db13b52c9f013eee51 data/immersiveweapons/recipes/barbed_wire_fence.json d359f85355da1ddad88e16cdc768a66a37639300 data/immersiveweapons/recipes/barrel_tap.json c330b2285f163372648aad37f72e7c5fedf69c01 data/immersiveweapons/recipes/bear_trap.json +a28a279e48c82cb6deb4c5301b7961da493bbdee data/immersiveweapons/recipes/birch_table.json a11a1726fdd02befe0502b9822b3f63c63df1cd7 data/immersiveweapons/recipes/black_stained_bulletproof_glass.json cfc72b59ac5dcb251ccce68fd99c92b085a239a4 data/immersiveweapons/recipes/blank_blueprint.json 8c729da2abaefb7a6e9760173c8c04ea51758243 data/immersiveweapons/recipes/blue_stained_bulletproof_glass.json @@ -755,13 +818,14 @@ d1c5d87204479f109ac9c5d782e8170bf4be8dd8 data/immersiveweapons/recipes/burned_oa ffaa3f38ace26b66fa97d5ff39ab989307335c73 data/immersiveweapons/recipes/burned_oak_sign.json 2e0bc15fdffd6a730349a719ab2f62d988eaca42 data/immersiveweapons/recipes/burned_oak_slab.json 8a7976fdb93dc7706a5ebe2343e6a282248ebcdd data/immersiveweapons/recipes/burned_oak_stairs.json +3622eecd0d2efe19b32eda03bc7c32cbf9859027 data/immersiveweapons/recipes/burned_oak_table.json 99cb04df3afb4c122bf61809eb4e019a48b7cbb5 data/immersiveweapons/recipes/burned_oak_trapdoor.json 55f961cb7531f33d6393f13cb0841ab70db2c20e data/immersiveweapons/recipes/burned_oak_wood.json bb4b2b0ca55fc963b12965303b85992f44992fa1 data/immersiveweapons/recipes/camp_chair.json b45724557785a4d9d63c47a063d4604bbfae1f97 data/immersiveweapons/recipes/canadian_flag.json 296c13215d794f9d21b1998c76adf15d8303b7b5 data/immersiveweapons/recipes/celestial_lantern.json a679f18a8a39d4656578f69ceff1b0cc7f132fd3 data/immersiveweapons/recipes/chocolate_bar.json -889d3f4bd3805bb285b5c0e53760bedcbc8bd1b1 data/immersiveweapons/recipes/cloth_scrap.json +cc368f78622b86874adaeac5e47f3022af0453bd data/immersiveweapons/recipes/cloth_scrap.json 85e66dfa5590517d33d5a09684ffc3fa06965c40 data/immersiveweapons/recipes/cloud_marble_brick_slab.json 3fe80b78f422d39abad73a82879a4e7be876c114 data/immersiveweapons/recipes/cloud_marble_brick_slab_from_cloud_marble_bricks_stonecutting.json 9cb35a68f4c222d15f53e9f0d7c93ca8453cafbc data/immersiveweapons/recipes/cloud_marble_brick_stairs.json @@ -816,7 +880,9 @@ e99dd60ec7511496de822e1489bc8f3cf9f487ae data/immersiveweapons/recipes/corrugate 4550382fdeadce4d8fa49477eb2947d3b68fd8a4 data/immersiveweapons/recipes/corrugated_iron_panel_bars_alt.json 4f60fc6cd3d9834c7879f9b13f5ef7c085d2d82c data/immersiveweapons/recipes/corrugated_iron_panel_flat.json 4a9615658a086f67fe8d30f9941006113c488fbd data/immersiveweapons/recipes/corrugated_iron_panel_flat_bars.json +18bc4cc1933045cb07c5a85c21aa03a9a4d81646 data/immersiveweapons/recipes/crimson_table.json 9c0209845e8652e9abe79538b3a6c383fd4d6a12 data/immersiveweapons/recipes/cyan_stained_bulletproof_glass.json +0d2aa4c974e3a61db61ff09041747eed74ffd5d0 data/immersiveweapons/recipes/dark_oak_table.json e7865107344f278ca807b91f3067d0e57168fe9a data/immersiveweapons/recipes/diamond_arrow.json b2c9bde0474a3cc9f600bf414843f64050ca2537 data/immersiveweapons/recipes/diamond_gauntlet.json fef3288cc2b10c55744ec8e2a603107cd453d98b data/immersiveweapons/recipes/diamond_musket_ball.json @@ -828,7 +894,7 @@ a7af626b3d330fbbb4cf02df9c2c83777c705a40 data/immersiveweapons/recipes/diamond_s b192bf920176344ba369506a9382c71fc7450258 data/immersiveweapons/recipes/electric_ingot_from_blasting_electric_ore.json f0de8a61f13be87238f6dbcaacfe859edca83105 data/immersiveweapons/recipes/electric_ingot_from_smelting_electric_ore.json f42f910c4067d5ed83c9c80f5a82e61fd253d8f2 data/immersiveweapons/recipes/electric_ingot_tesla_synthesizing.json -22537d59e523a887be1d902fad5c532f64006378 data/immersiveweapons/recipes/explosive_chocolate_bar.json +9585a0d1391b4a14ca012bca5f26aa566862667b data/immersiveweapons/recipes/explosive_chocolate_bar.json e76298e342b76aae0c8ff5a5112a870c6e73042c data/immersiveweapons/recipes/first_aid_kit.json 66e3e927f60487b6c0d86375749239830e738a15 data/immersiveweapons/recipes/flag_pole.json fa495b819b79df0b099e937c5614bc69161ff947 data/immersiveweapons/recipes/flare.json @@ -857,7 +923,8 @@ b5fa403c0bdde45d7ea9229cccdcad7b634ef983 data/immersiveweapons/recipes/immersive d236c9cb5bd0c97dc5d68d0e39ff98b28aae2b91 data/immersiveweapons/recipes/iron_musket_ball.json 117a1dd2c8a2ecc8c923f2c526f034bd5888ecb8 data/immersiveweapons/recipes/iron_pike.json a7fcb73cbbe1ad7f635e965f92db6ef62d425513 data/immersiveweapons/recipes/iron_pike_head.json -b55e79184ce85e6b9128f9a5015a3a5550d5ea0c data/immersiveweapons/recipes/landmine.json +ff7feed429bb112162e43f6c5e192a6e973340c6 data/immersiveweapons/recipes/jungle_table.json +967ad75d33c882975df78197d10c59ccb3126b78 data/immersiveweapons/recipes/landmine.json 71ef5dbb4ee82a07cc96a58614cc1b5629fe8024 data/immersiveweapons/recipes/light_blue_stained_bulletproof_glass.json efdafca64dc32c7f5380c41448d689b93fbe7936 data/immersiveweapons/recipes/light_gray_stained_bulletproof_glass.json f52a46d4f7fab40b6c5ce59148d3b05b90b5fa5b data/immersiveweapons/recipes/lime_stained_bulletproof_glass.json @@ -876,9 +943,8 @@ d3d40533c27365173b0fba6499c43269ace48083 data/immersiveweapons/recipes/molten_in a802e2c928de128bc01b8ea440db56f7242eab09 data/immersiveweapons/recipes/molten_ingot_from_smelting_molten_ore.json e9946448c0119737327c9978bf7651b4b9fae4be data/immersiveweapons/recipes/molten_leggings.json 40fc96f8c87e5f7d0f3e199f215498d6cd563e5c data/immersiveweapons/recipes/molten_pickaxe.json -ac1e16e975898280ba86e6ff319952ef0442a5eb data/immersiveweapons/recipes/molten_plate.json 27eebe584f5bece246bf92aa399a2f9369275eab data/immersiveweapons/recipes/molten_shovel.json -9f1a8a9d072d6ea8fb77bc8904e3e4b9a6b8fa6b data/immersiveweapons/recipes/molten_sword.json +205c95a17c17c221fb7fd1338b4b1b3cce628f8a data/immersiveweapons/recipes/molten_sword.json 07c3eb30c97ea7cdf5dc7519fccb2c9f1d8c6742 data/immersiveweapons/recipes/morphine.json c9d522ecc8d70d36490a68d2fdfbbef8ff7c5efa data/immersiveweapons/recipes/mortar.json 7bac84c0dde19d742be1751e7fecaa22d0889046 data/immersiveweapons/recipes/mortar_and_pestle.json @@ -890,6 +956,7 @@ ce61cc4c21d96c4086bc068bf9ccfb809228b28a data/immersiveweapons/recipes/mud_ball. 47172ae91d50512a661e99a3d7fd894eef17572d data/immersiveweapons/recipes/netherite_gauntlet_smithing.json fc9948f36341ee318fdd6083c9bebabeade824e3 data/immersiveweapons/recipes/netherite_musket_ball.json 5391d376a41509dcfd3dae9d11ce43ecbdb1551f data/immersiveweapons/recipes/netherite_pike_smithing.json +2619074f2e49e5fca8da6685d5d108f421b2a085 data/immersiveweapons/recipes/oak_table.json db64f8017a9835c304d7cb1b6dd5c0cfee2d87f0 data/immersiveweapons/recipes/obsidian_rod.json 91e44917b96a2765e1a3abc4035dead7fbdede9c data/immersiveweapons/recipes/obsidian_shard.json 61f3ad7d46b45cc1d4bbc80a05d91eb7e6c78de8 data/immersiveweapons/recipes/orange_stained_bulletproof_glass.json @@ -898,12 +965,13 @@ c459ebae671a620c8a019c4baa0d145c1a252453 data/immersiveweapons/recipes/painkille 8cf8de3eb47679aac0295dbb443f2c2f90a287b8 data/immersiveweapons/recipes/pink_stained_bulletproof_glass.json ee8ca4e2e8866d530b63a7552b8ebdb7858c035b data/immersiveweapons/recipes/pitfall.json 2c15b0a3b16fa8c9724dbbed10bb240a5cc3aae0 data/immersiveweapons/recipes/pliers.json -a4fa09e25678c8c5338c8012203b39a8d64af19a data/immersiveweapons/recipes/punji_sticks.json +b887d09bb4920eef83e809015bdef951fa180224 data/immersiveweapons/recipes/punji_sticks.json 809e629cc9c3e1c6e0a82ea97ffede6e08d33276 data/immersiveweapons/recipes/purple_stained_bulletproof_glass.json a79d920cd483ae8e6f05aa2350f91736a8930f29 data/immersiveweapons/recipes/raw_cobalt.json 4775bb43ef0f0982ac00c65e7425f0ca225ac422 data/immersiveweapons/recipes/raw_cobalt_block.json +81143068021f7af4ac08b5164e3a2b9907be77c6 data/immersiveweapons/recipes/raw_sulfur_block.json 7f8d5122bd7e2152cfec457a202c84fa01faed08 data/immersiveweapons/recipes/red_stained_bulletproof_glass.json -942c174d7c5950f6ed88202f4a325c75c70cb50c data/immersiveweapons/recipes/sandbag.json +341b05bd5aed88553f0b02e8d472386f92b27fb6 data/immersiveweapons/recipes/sandbag.json 14819d05d42b278e57e7bf5a098d13581ab37ead data/immersiveweapons/recipes/small_parts_blueprint.json f3c73bd5799ab2bde9c336b7ea66f04799821914 data/immersiveweapons/recipes/small_parts_iron_tinkering.json 55ec5cc90c5a174b065ac8557ed7a2fd910be6a7 data/immersiveweapons/recipes/small_parts_metal_throwable_bomb_blueprint.json @@ -926,12 +994,14 @@ f853d0cb1c3552d9ad1bcac519b50a134e996d84 data/immersiveweapons/recipes/smoke_bom e0e7e7159f9550dccd68748256e7fdc6ef77f6f8 data/immersiveweapons/recipes/smoke_powder.json e6e43ea5c2c27048f5a502cd71df79f1ad014076 data/immersiveweapons/recipes/spike_trap.json 4cbfa1dfedd4015711ee599df696285432e82e1d data/immersiveweapons/recipes/spotlight.json +18cd4657adc893b121bef969ed64254acc4d78db data/immersiveweapons/recipes/spruce_table.json 1a1f3581d382c5ebe1c5ed54047840c3c6bae55d data/immersiveweapons/recipes/stone_arrow.json 92b4eb10002d66a6afab6515cd7ca6cb62059f63 data/immersiveweapons/recipes/stone_gauntlet.json 402ef92540d4cb89d8c0776b590cdbd1048b66f1 data/immersiveweapons/recipes/stone_musket_ball.json ae75b9fde4ee18b320446d9a4457bc134f1217d6 data/immersiveweapons/recipes/stone_pike.json ef909e395a6c28ab1787da1d8b830a6ee222efbd data/immersiveweapons/recipes/stone_pike_head.json 85b2742541047963b7c12e157af9692b13f4eea1 data/immersiveweapons/recipes/stone_shard.json +cf1038781c6d12931c09570de55a363dc73257cb data/immersiveweapons/recipes/sulfur.json 908b7c0923873dd7252a76e06bc783fced90c304 data/immersiveweapons/recipes/syringe.json c7884fa5f676f047827e1bf234dbbd6e2ffe67ff data/immersiveweapons/recipes/tesla_axe.json 552b30c27b489b5fe671fa8f4e1d993f4d0bebff data/immersiveweapons/recipes/tesla_block.json @@ -943,9 +1013,8 @@ f1570d60b328b8dc9473b4626c7690706f35bf32 data/immersiveweapons/recipes/tesla_hoe 6756e91f56b29b4ed6fdca31a5f2dfb31c9b7c83 data/immersiveweapons/recipes/tesla_ingot_from_tesla_block.json 2b55cb6a81bf88a2779318703994981c373889da data/immersiveweapons/recipes/tesla_leggings.json 8f42ac809665f6a43b64da49445830e989fa7d1d data/immersiveweapons/recipes/tesla_pickaxe.json -d01c4a268ae95758cb1efc855fdc3f01ea5ef099 data/immersiveweapons/recipes/tesla_plate.json b194ad0f06e9644d1d780bd4885d61ec33aa04e0 data/immersiveweapons/recipes/tesla_shovel.json -79a9089ecf2daefce49b829c26d364cfa9c97cf8 data/immersiveweapons/recipes/tesla_sword.json +41e2f2195738f8fc86aecc87e0c3e91e7aecc5e8 data/immersiveweapons/recipes/tesla_sword.json e52bc6b8e6ad7cc73989607f02d2f7db3369763f data/immersiveweapons/recipes/tesla_synthesizer.json 9f489dcabef971c60e54528303f7da3aa06088b3 data/immersiveweapons/recipes/troll_flag.json 41e9dbaee19876eff55e2ef510400660ca131eb7 data/immersiveweapons/recipes/ventus_axe.json @@ -958,20 +1027,20 @@ e21d0b2ac3a163ed87d527f324f0ad53556390e2 data/immersiveweapons/recipes/ventus_pi 01069f45ae2922a0cfdb2ac7a0e8af553c1ce72f data/immersiveweapons/recipes/ventus_shovel.json 517fb0e6f543d650ab7f6fb41cccf63bde4c5517 data/immersiveweapons/recipes/ventus_staff.json 251798cc352a31b6517572d91cf7d94912bc5937 data/immersiveweapons/recipes/ventus_staff_core.json -0242fc9bf7d636de4d274faace79b181bde4f97d data/immersiveweapons/recipes/ventus_sword.json +76b57b3e7a2a47366bb0a96ccbee3da1455d589d data/immersiveweapons/recipes/ventus_sword.json 1882cfc71cf1fa9645232044876f24a8e4526c64 data/immersiveweapons/recipes/wall_shelf.json +e441ebb4d26dbc818e516c707593f46026bf7ec8 data/immersiveweapons/recipes/warped_table.json d73f5f4a30a8d5485c1af3a4b911d61fc91c6403 data/immersiveweapons/recipes/warrior_statue_base.json d6d9a0ab9a1e5cbcd5c8dcffdade62c9eaf69e34 data/immersiveweapons/recipes/warrior_statue_head.json ae30c5e16bd8442bff692b6120c5bed930dfd3d4 data/immersiveweapons/recipes/warrior_statue_torso.json 4627fa46015d30e4bef15ed744578ec3d61f0c6c data/immersiveweapons/recipes/white_stained_bulletproof_glass.json c6e119bb0791d87087f735ce2eff9eb1d07e99a9 data/immersiveweapons/recipes/wood_arrow.json -07a1d9f525c215c106f4a08164edfaee4bedc60f data/immersiveweapons/recipes/wood_gauntlet.json +0f0cf66db1d60d3333311f88e91d591c501a19dd data/immersiveweapons/recipes/wood_gauntlet.json fd21abfcfb690de6a16db83ea3aa50c8cfc8556b data/immersiveweapons/recipes/wood_musket_ball.json c3e480e18c80c7daad1a6180c12abaeec2a105b9 data/immersiveweapons/recipes/wood_pike.json 3610fae9533ef5cce9292a785b0953bf9de10129 data/immersiveweapons/recipes/wood_pike_head.json 4a9ea559608b35e7eb76e1b894bf962429cdff9f data/immersiveweapons/recipes/wood_tool_rod.json 78f52295018c54146f5cc79310a411dc70229b7a data/immersiveweapons/recipes/wooden_spikes.json -b33894eb733c763b3027b5c5cf3d6bfaf273835e data/immersiveweapons/recipes/wooden_table.json 3da20f7d4b4921da0f51149764dda0342c10cb99 data/immersiveweapons/recipes/yellow_stained_bulletproof_glass.json e011764cf12202939e98c3bb5536fb3c7e12c227 data/immersiveweapons/tags/blocks/burned_oak_logs.json e011764cf12202939e98c3bb5536fb3c7e12c227 data/immersiveweapons/tags/items/burned_oak_logs.json @@ -990,11 +1059,12 @@ c623b6e951eb3860b531efd062af5eb2bb9a43d7 data/immersiveweapons/tags/items/shards 4a45573a35d3979a08a43e699a64fbda69d0332a data/minecraft/tags/blocks/fences.json 344451d32c25e8e05447677bbe26cdb43b115138 data/minecraft/tags/blocks/logs_that_burn.json b1c60f6d6cef3faee9aec47fae90e06fcc98b6cb data/minecraft/tags/blocks/mineable/axe.json -6233631f73b96afb5d37a558309edcd6697c5005 data/minecraft/tags/blocks/mineable/pickaxe.json +caf6cd49bed906c1fba1df425be12e0d05d6def8 data/minecraft/tags/blocks/mineable/pickaxe.json 37447b1fcaf6daa7acfa17b54380cc0472580a15 data/minecraft/tags/blocks/mineable/shovel.json f6309f619f3a40919509cb915af2ccbb007aa9ca data/minecraft/tags/blocks/needs_diamond_tool.json e3890b5c2bdc09f955bc5c3d8c1f91665d66ba3b data/minecraft/tags/blocks/needs_iron_tool.json -87ddff1df0d935f5b7eecc1b77129c71e8141184 data/minecraft/tags/blocks/needs_stone_tool.json +227fcdfe1b6229e1acc426795af1a5bc8a548861 data/minecraft/tags/blocks/needs_stone_tool.json +df2590c98cb6a736ea64c2f1dc2972552bac879f data/minecraft/tags/blocks/non_flammable_wood.json 767c6545d264df8b63eff5c9726df3e00f04b560 data/minecraft/tags/blocks/planks.json 2d587d4d7345be8ce59efcbb89c2e35cbb96e4a6 data/minecraft/tags/blocks/slabs.json e3bf073ef341370cd031344ec095ddc7efd35914 data/minecraft/tags/blocks/stairs.json diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/acacia_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/acacia_table.json new file mode 100644 index 000000000..63c2d5f9d --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/acacia_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/acacia_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/birch_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/birch_table.json new file mode 100644 index 000000000..b9cba39f1 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/birch_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/birch_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/burned_oak_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/burned_oak_table.json new file mode 100644 index 000000000..18b38cf21 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/burned_oak_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/burned_oak_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/crimson_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/crimson_table.json new file mode 100644 index 000000000..fceb0665a --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/crimson_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/crimson_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/dark_oak_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/dark_oak_table.json new file mode 100644 index 000000000..afbed0979 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/dark_oak_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/dark_oak_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/jungle_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/jungle_table.json new file mode 100644 index 000000000..94ee7eecf --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/jungle_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/jungle_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/oak_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/oak_table.json new file mode 100644 index 000000000..2330fdd8f --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/oak_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/oak_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/raw_sulfur_block.json b/src/generated/resources/assets/immersiveweapons/blockstates/raw_sulfur_block.json new file mode 100644 index 000000000..85cad9c30 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/raw_sulfur_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/raw_sulfur_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/spruce_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/spruce_table.json new file mode 100644 index 000000000..41f4bbc22 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/spruce_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/spruce_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/blockstates/warped_table.json b/src/generated/resources/assets/immersiveweapons/blockstates/warped_table.json new file mode 100644 index 000000000..34f7cda59 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/blockstates/warped_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "immersiveweapons:block/warped_table" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/block/raw_sulfur_block.json b/src/generated/resources/assets/immersiveweapons/models/block/raw_sulfur_block.json new file mode 100644 index 000000000..02f8da6ea --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/block/raw_sulfur_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "immersiveweapons:block/raw_sulfur_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/acacia_table.json b/src/generated/resources/assets/immersiveweapons/models/item/acacia_table.json new file mode 100644 index 000000000..e889f0454 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/acacia_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/acacia_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/birch_table.json b/src/generated/resources/assets/immersiveweapons/models/item/birch_table.json new file mode 100644 index 000000000..4fff66795 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/birch_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/birch_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/burned_oak_table.json b/src/generated/resources/assets/immersiveweapons/models/item/burned_oak_table.json new file mode 100644 index 000000000..c12c001f8 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/burned_oak_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/burned_oak_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/crimson_table.json b/src/generated/resources/assets/immersiveweapons/models/item/crimson_table.json new file mode 100644 index 000000000..b0cc5d20d --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/crimson_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/crimson_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/dark_oak_table.json b/src/generated/resources/assets/immersiveweapons/models/item/dark_oak_table.json new file mode 100644 index 000000000..0583ebbac --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/dark_oak_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/dark_oak_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/jungle_table.json b/src/generated/resources/assets/immersiveweapons/models/item/jungle_table.json new file mode 100644 index 000000000..8a23ce190 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/jungle_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/jungle_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/molten_plate.json b/src/generated/resources/assets/immersiveweapons/models/item/molten_plate.json deleted file mode 100644 index 7f58363fc..000000000 --- a/src/generated/resources/assets/immersiveweapons/models/item/molten_plate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "immersiveweapons:item/molten_plate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/oak_table.json b/src/generated/resources/assets/immersiveweapons/models/item/oak_table.json new file mode 100644 index 000000000..4ca558455 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/oak_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/oak_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/raw_sulfur_block.json b/src/generated/resources/assets/immersiveweapons/models/item/raw_sulfur_block.json new file mode 100644 index 000000000..5f0281a50 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/raw_sulfur_block.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/raw_sulfur_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/spruce_table.json b/src/generated/resources/assets/immersiveweapons/models/item/spruce_table.json new file mode 100644 index 000000000..9361ebedb --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/spruce_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/spruce_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/tesla_plate.json b/src/generated/resources/assets/immersiveweapons/models/item/tesla_plate.json deleted file mode 100644 index bf6f9b5e3..000000000 --- a/src/generated/resources/assets/immersiveweapons/models/item/tesla_plate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "immersiveweapons:item/tesla_plate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/warped_table.json b/src/generated/resources/assets/immersiveweapons/models/item/warped_table.json new file mode 100644 index 000000000..9f02f4979 --- /dev/null +++ b/src/generated/resources/assets/immersiveweapons/models/item/warped_table.json @@ -0,0 +1,3 @@ +{ + "parent": "immersiveweapons:block/warped_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/immersiveweapons/models/item/wooden_table.json b/src/generated/resources/assets/immersiveweapons/models/item/wooden_table.json deleted file mode 100644 index 079c97fc7..000000000 --- a/src/generated/resources/assets/immersiveweapons/models/item/wooden_table.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "immersiveweapons:block/wooden_table" -} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/azul_keystone.json b/src/generated/resources/data/immersiveweapons/advancements/bamboo.json similarity index 56% rename from src/generated/resources/data/immersiveweapons/advancements/azul_keystone.json rename to src/generated/resources/data/immersiveweapons/advancements/bamboo.json index 4d91a6990..40166d9de 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/azul_keystone.json +++ b/src/generated/resources/data/immersiveweapons/advancements/bamboo.json @@ -1,19 +1,19 @@ { - "parent": "immersiveweapons:warrior_statue", + "parent": "immersiveweapons:root", "display": { "icon": { - "item": "immersiveweapons:azul_keystone" + "item": "minecraft:bamboo" }, "title": { - "translate": "advancements.immersiveweapons.tiltros.azul_keystone.title" + "translate": "advancements.immersiveweapons.bamboo.title" }, "description": { - "translate": "advancements.immersiveweapons.tiltros.azul_keystone.description" + "translate": "advancements.immersiveweapons.bamboo.description" }, "frame": "task", "show_toast": true, "announce_to_chat": true, - "hidden": true + "hidden": false }, "criteria": { "hold": { @@ -22,7 +22,7 @@ "items": [ { "items": [ - "immersiveweapons:azul_keystone" + "minecraft:bamboo" ] } ] diff --git a/src/generated/resources/data/immersiveweapons/advancements/battlefield.json b/src/generated/resources/data/immersiveweapons/advancements/battlefield.json deleted file mode 100644 index a1ae54eae..000000000 --- a/src/generated/resources/data/immersiveweapons/advancements/battlefield.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "parent": "immersiveweapons:root", - "display": { - "icon": { - "item": "minecraft:skeleton_skull" - }, - "title": { - "translate": "advancements.immersiveweapons.battlefield.title" - }, - "description": { - "translate": "advancements.immersiveweapons.battlefield.description" - }, - "frame": "task", - "show_toast": true, - "announce_to_chat": true, - "hidden": false - }, - "rewards": { - "experience": 50 - }, - "criteria": { - "visit": { - "trigger": "minecraft:location", - "conditions": { - "location": { - "biome": "immersiveweapons:battlefield" - } - } - } - }, - "requirements": [ - [ - "visit" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/biohazard_box.json b/src/generated/resources/data/immersiveweapons/advancements/biohazard_box.json new file mode 100644 index 000000000..81bd22255 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/biohazard_box.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:root", + "display": { + "icon": { + "item": "immersiveweapons:biohazard_box" + }, + "title": { + "translate": "advancements.immersiveweapons.biohazard_box.title" + }, + "description": { + "translate": "advancements.immersiveweapons.biohazard_box.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:biohazard_box" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/cloud.json b/src/generated/resources/data/immersiveweapons/advancements/cloud.json new file mode 100644 index 000000000..706f097d5 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/cloud.json @@ -0,0 +1,52 @@ +{ + "parent": "immersiveweapons:root", + "display": { + "icon": { + "item": "immersiveweapons:cloud" + }, + "title": { + "translate": "advancements.immersiveweapons.cloud.title" + }, + "description": { + "translate": "advancements.immersiveweapons.cloud.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "predicate": { + "stepping_on": { + "block": { + "blocks": [ + "immersiveweapons:cloud" + ] + } + }, + "equipment": { + "feet": { + "items": [ + "minecraft:air" + ] + } + } + }, + "entity": "this" + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/cloud_marble.json b/src/generated/resources/data/immersiveweapons/advancements/cloud_marble.json new file mode 100644 index 000000000..ba65fed8b --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/cloud_marble.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:root", + "display": { + "icon": { + "item": "immersiveweapons:cloud_marble" + }, + "title": { + "translate": "advancements.immersiveweapons.cloud_marble.title" + }, + "description": { + "translate": "advancements.immersiveweapons.cloud_marble.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:cloud_marble" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/cobalt_axe.json b/src/generated/resources/data/immersiveweapons/advancements/cobalt_axe.json new file mode 100644 index 000000000..5eb0943ec --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/cobalt_axe.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:cobalt_ingot", + "display": { + "icon": { + "item": "immersiveweapons:cobalt_axe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.cobalt_axe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.cobalt_axe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:cobalt_axe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/cobalt_hoe.json b/src/generated/resources/data/immersiveweapons/advancements/cobalt_hoe.json new file mode 100644 index 000000000..616b87456 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/cobalt_hoe.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:cobalt_ingot", + "display": { + "icon": { + "item": "immersiveweapons:cobalt_hoe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.cobalt_hoe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.cobalt_hoe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:cobalt_hoe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/molten_plate.json b/src/generated/resources/data/immersiveweapons/advancements/cobalt_ingot.json similarity index 63% rename from src/generated/resources/data/immersiveweapons/advancements/molten_plate.json rename to src/generated/resources/data/immersiveweapons/advancements/cobalt_ingot.json index c2f314ced..219e54de7 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/molten_plate.json +++ b/src/generated/resources/data/immersiveweapons/advancements/cobalt_ingot.json @@ -1,14 +1,14 @@ { - "parent": "immersiveweapons:molten_ingot", + "parent": "immersiveweapons:ingots", "display": { "icon": { - "item": "immersiveweapons:molten_plate" + "item": "immersiveweapons:cobalt_ingot" }, "title": { - "translate": "advancements.immersiveweapons.molten_plate.title" + "translate": "advancements.immersiveweapons.cobalt_ingot.title" }, "description": { - "translate": "advancements.immersiveweapons.molten_plate.description" + "translate": "advancements.immersiveweapons.cobalt_ingot.description" }, "frame": "task", "show_toast": true, @@ -22,7 +22,7 @@ "items": [ { "items": [ - "immersiveweapons:molten_plate" + "immersiveweapons:cobalt_ingot" ] } ] diff --git a/src/generated/resources/data/immersiveweapons/advancements/cobalt_pickaxe.json b/src/generated/resources/data/immersiveweapons/advancements/cobalt_pickaxe.json new file mode 100644 index 000000000..1e490121a --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/cobalt_pickaxe.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:cobalt_ingot", + "display": { + "icon": { + "item": "immersiveweapons:cobalt_pickaxe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.cobalt_pickaxe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.cobalt_pickaxe.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:cobalt_pickaxe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/cobalt_shovel.json b/src/generated/resources/data/immersiveweapons/advancements/cobalt_shovel.json new file mode 100644 index 000000000..f23b5cc3e --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/cobalt_shovel.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:cobalt_ingot", + "display": { + "icon": { + "item": "immersiveweapons:cobalt_shovel", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.cobalt_shovel.title" + }, + "description": { + "translate": "advancements.immersiveweapons.cobalt_shovel.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:cobalt_shovel" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/cobalt_sword.json b/src/generated/resources/data/immersiveweapons/advancements/cobalt_sword.json new file mode 100644 index 000000000..d2eb542cd --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/cobalt_sword.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:cobalt_ingot", + "display": { + "icon": { + "item": "immersiveweapons:cobalt_sword", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.cobalt_sword.title" + }, + "description": { + "translate": "advancements.immersiveweapons.cobalt_sword.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:cobalt_sword" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/cobalt_tools.json b/src/generated/resources/data/immersiveweapons/advancements/cobalt_tools.json new file mode 100644 index 000000000..ec4e89633 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/cobalt_tools.json @@ -0,0 +1,50 @@ +{ + "parent": "immersiveweapons:cobalt_ingot", + "display": { + "icon": { + "item": "immersiveweapons:cobalt_block" + }, + "title": { + "translate": "advancements.immersiveweapons.cobalt_tools.title" + }, + "description": { + "translate": "advancements.immersiveweapons.cobalt_tools.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "have_advancements": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "predicate": { + "player": { + "advancements": { + "immersiveweapons:cobalt_axe": true, + "immersiveweapons:cobalt_hoe": true, + "immersiveweapons:cobalt_pickaxe": true, + "immersiveweapons:cobalt_sword": true, + "immersiveweapons:cobalt_shovel": true + } + } + }, + "entity": "this" + } + ] + } + } + }, + "requirements": [ + [ + "have_advancements" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/copper_axe.json b/src/generated/resources/data/immersiveweapons/advancements/copper_axe.json new file mode 100644 index 000000000..e0e284cc7 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/copper_axe.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:copper_ingot", + "display": { + "icon": { + "item": "immersiveweapons:copper_axe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.copper_axe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.copper_axe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:copper_axe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/copper_hoe.json b/src/generated/resources/data/immersiveweapons/advancements/copper_hoe.json new file mode 100644 index 000000000..3a736de5d --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/copper_hoe.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:copper_ingot", + "display": { + "icon": { + "item": "immersiveweapons:copper_hoe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.copper_hoe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.copper_hoe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:copper_hoe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/copper_ingot.json b/src/generated/resources/data/immersiveweapons/advancements/copper_ingot.json new file mode 100644 index 000000000..0f272aa69 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/copper_ingot.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:ingots", + "display": { + "icon": { + "item": "minecraft:copper_ingot" + }, + "title": { + "translate": "advancements.immersiveweapons.copper_ingot.title" + }, + "description": { + "translate": "advancements.immersiveweapons.copper_ingot.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:copper_ingot" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/copper_pickaxe.json b/src/generated/resources/data/immersiveweapons/advancements/copper_pickaxe.json new file mode 100644 index 000000000..e3f9568a8 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/copper_pickaxe.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:copper_ingot", + "display": { + "icon": { + "item": "immersiveweapons:copper_pickaxe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.copper_pickaxe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.copper_pickaxe.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:copper_pickaxe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/copper_shovel.json b/src/generated/resources/data/immersiveweapons/advancements/copper_shovel.json new file mode 100644 index 000000000..ef66f6634 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/copper_shovel.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:copper_ingot", + "display": { + "icon": { + "item": "immersiveweapons:copper_shovel", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.copper_shovel.title" + }, + "description": { + "translate": "advancements.immersiveweapons.copper_shovel.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:copper_shovel" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/copper_sword.json b/src/generated/resources/data/immersiveweapons/advancements/copper_sword.json new file mode 100644 index 000000000..eb05a2c6b --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/copper_sword.json @@ -0,0 +1,38 @@ +{ + "parent": "immersiveweapons:copper_ingot", + "display": { + "icon": { + "item": "immersiveweapons:copper_sword", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.copper_sword.title" + }, + "description": { + "translate": "advancements.immersiveweapons.copper_sword.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:copper_sword" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/copper_tools.json b/src/generated/resources/data/immersiveweapons/advancements/copper_tools.json new file mode 100644 index 000000000..fdf32c319 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/copper_tools.json @@ -0,0 +1,50 @@ +{ + "parent": "immersiveweapons:copper_ingot", + "display": { + "icon": { + "item": "minecraft:copper_block" + }, + "title": { + "translate": "advancements.immersiveweapons.copper_tools.title" + }, + "description": { + "translate": "advancements.immersiveweapons.copper_tools.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 25 + }, + "criteria": { + "have_advancements": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "predicate": { + "player": { + "advancements": { + "immersiveweapons:copper_sword": true, + "immersiveweapons:copper_shovel": true, + "immersiveweapons:copper_axe": true, + "immersiveweapons:copper_hoe": true, + "immersiveweapons:copper_pickaxe": true + } + } + }, + "entity": "this" + } + ] + } + } + }, + "requirements": [ + [ + "have_advancements" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/diamond_shard.json b/src/generated/resources/data/immersiveweapons/advancements/diamond_shard.json new file mode 100644 index 000000000..d55bddf6f --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/diamond_shard.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:shards", + "display": { + "icon": { + "item": "immersiveweapons:diamond_shard" + }, + "title": { + "translate": "advancements.immersiveweapons.diamond_shard.title" + }, + "description": { + "translate": "advancements.immersiveweapons.diamond_shard.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:diamond_shard" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/energized.json b/src/generated/resources/data/immersiveweapons/advancements/energized.json index e785edde5..04dbca9d8 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/energized.json +++ b/src/generated/resources/data/immersiveweapons/advancements/energized.json @@ -2,8 +2,7 @@ "parent": "immersiveweapons:tesla_ingot", "display": { "icon": { - "item": "immersiveweapons:tesla_pickaxe", - "nbt": "{Damage:0}" + "item": "immersiveweapons:tesla_block" }, "title": { "translate": "advancements.immersiveweapons.energized.title" @@ -11,43 +10,33 @@ "description": { "translate": "advancements.immersiveweapons.energized.description" }, - "frame": "goal", + "frame": "challenge", "show_toast": true, "announce_to_chat": true, "hidden": false }, "rewards": { - "experience": 100 + "experience": 150 }, "criteria": { - "hold": { - "trigger": "minecraft:inventory_changed", + "have_advancements": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": [ - "immersiveweapons:tesla_sword" - ] - }, - { - "items": [ - "immersiveweapons:tesla_pickaxe" - ] - }, - { - "items": [ - "immersiveweapons:tesla_axe" - ] - }, - { - "items": [ - "immersiveweapons:tesla_shovel" - ] - }, - { - "items": [ - "immersiveweapons:tesla_hoe" - ] + "condition": "minecraft:entity_properties", + "predicate": { + "player": { + "advancements": { + "immersiveweapons:tesla_shovel": true, + "immersiveweapons:tesla_axe": true, + "immersiveweapons:tesla_hoe": true, + "immersiveweapons:tesla_pickaxe": true, + "immersiveweapons:tesla_sword": true + } + } + }, + "entity": "this" } ] } @@ -55,7 +44,7 @@ }, "requirements": [ [ - "hold" + "have_advancements" ] ] } \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/gold_ingot.json b/src/generated/resources/data/immersiveweapons/advancements/gold_ingot.json new file mode 100644 index 000000000..1a1237606 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/gold_ingot.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:ingots", + "display": { + "icon": { + "item": "minecraft:gold_ingot" + }, + "title": { + "translate": "advancements.immersiveweapons.gold_ingot.title" + }, + "description": { + "translate": "advancements.immersiveweapons.gold_ingot.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:gold_ingot" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/ingots.json b/src/generated/resources/data/immersiveweapons/advancements/ingots.json new file mode 100644 index 000000000..2c87918de --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/ingots.json @@ -0,0 +1,35 @@ +{ + "parent": "immersiveweapons:root", + "display": { + "icon": { + "item": "minecraft:iron_ingot" + }, + "title": { + "translate": "advancements.immersiveweapons.ingots.title" + }, + "description": { + "translate": "advancements.immersiveweapons.ingots.description" + }, + "frame": "task", + "show_toast": false, + "announce_to_chat": false, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots" + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/molten_axe.json b/src/generated/resources/data/immersiveweapons/advancements/molten_axe.json new file mode 100644 index 000000000..d26b7168f --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/molten_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:molten_ingot", + "display": { + "icon": { + "item": "immersiveweapons:molten_axe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.molten_axe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.molten_axe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:molten_axe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/molten_hoe.json b/src/generated/resources/data/immersiveweapons/advancements/molten_hoe.json new file mode 100644 index 000000000..64bf89333 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/molten_hoe.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:molten_ingot", + "display": { + "icon": { + "item": "immersiveweapons:molten_hoe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.molten_hoe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.molten_hoe.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 50 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:molten_hoe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/molten_pickaxe.json b/src/generated/resources/data/immersiveweapons/advancements/molten_pickaxe.json new file mode 100644 index 000000000..56147ca38 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/molten_pickaxe.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:molten_ingot", + "display": { + "icon": { + "item": "immersiveweapons:molten_pickaxe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.molten_pickaxe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.molten_pickaxe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:molten_pickaxe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/molten_shovel.json b/src/generated/resources/data/immersiveweapons/advancements/molten_shovel.json new file mode 100644 index 000000000..ec192a65d --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/molten_shovel.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:molten_ingot", + "display": { + "icon": { + "item": "immersiveweapons:molten_shovel", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.molten_shovel.title" + }, + "description": { + "translate": "advancements.immersiveweapons.molten_shovel.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:molten_shovel" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/mud.json b/src/generated/resources/data/immersiveweapons/advancements/mud.json new file mode 100644 index 000000000..1126e042b --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/mud.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:root", + "display": { + "icon": { + "item": "immersiveweapons:mud" + }, + "title": { + "translate": "advancements.immersiveweapons.mud.title" + }, + "description": { + "translate": "advancements.immersiveweapons.mud.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:mud" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/musket_ball.json b/src/generated/resources/data/immersiveweapons/advancements/musket_ball.json new file mode 100644 index 000000000..7fc8e1068 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/musket_ball.json @@ -0,0 +1,35 @@ +{ + "parent": "immersiveweapons:root", + "display": { + "icon": { + "item": "immersiveweapons:gold_musket_ball" + }, + "title": { + "translate": "advancements.immersiveweapons.musket_ball.title" + }, + "description": { + "translate": "advancements.immersiveweapons.musket_ball.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "immersiveweapons:projectiles/musket_balls" + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/netherite_ingot.json b/src/generated/resources/data/immersiveweapons/advancements/netherite_ingot.json new file mode 100644 index 000000000..652e3b56f --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/netherite_ingot.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:ingots", + "display": { + "icon": { + "item": "minecraft:netherite_ingot" + }, + "title": { + "translate": "advancements.immersiveweapons.netherite_ingot.title" + }, + "description": { + "translate": "advancements.immersiveweapons.netherite_ingot.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_ingot" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/nuggets.json b/src/generated/resources/data/immersiveweapons/advancements/nuggets.json new file mode 100644 index 000000000..42218282b --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/nuggets.json @@ -0,0 +1,35 @@ +{ + "parent": "immersiveweapons:root", + "display": { + "icon": { + "item": "minecraft:gold_nugget" + }, + "title": { + "translate": "advancements.immersiveweapons.nuggets.title" + }, + "description": { + "translate": "advancements.immersiveweapons.nuggets.description" + }, + "frame": "task", + "show_toast": false, + "announce_to_chat": false, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:nuggets" + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/obsidian_shard.json b/src/generated/resources/data/immersiveweapons/advancements/obsidian_shard.json new file mode 100644 index 000000000..23ab23bd6 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/obsidian_shard.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:shards", + "display": { + "icon": { + "item": "immersiveweapons:obsidian_shard" + }, + "title": { + "translate": "advancements.immersiveweapons.obsidian_shard.title" + }, + "description": { + "translate": "advancements.immersiveweapons.obsidian_shard.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:obsidian_shard" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/planks.json b/src/generated/resources/data/immersiveweapons/advancements/planks.json new file mode 100644 index 000000000..1cf0ed4ff --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/planks.json @@ -0,0 +1,35 @@ +{ + "parent": "immersiveweapons:root", + "display": { + "icon": { + "item": "minecraft:oak_planks" + }, + "title": { + "translate": "advancements.immersiveweapons.planks.title" + }, + "description": { + "translate": "advancements.immersiveweapons.planks.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/play_with_fire.json b/src/generated/resources/data/immersiveweapons/advancements/play_with_fire.json index 806101714..d6ce3bb81 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/play_with_fire.json +++ b/src/generated/resources/data/immersiveweapons/advancements/play_with_fire.json @@ -2,8 +2,7 @@ "parent": "immersiveweapons:molten_ingot", "display": { "icon": { - "item": "immersiveweapons:molten_pickaxe", - "nbt": "{Damage:0}" + "item": "immersiveweapons:molten_block" }, "title": { "translate": "advancements.immersiveweapons.play_with_fire.title" @@ -11,43 +10,33 @@ "description": { "translate": "advancements.immersiveweapons.play_with_fire.description" }, - "frame": "goal", + "frame": "challenge", "show_toast": true, "announce_to_chat": true, "hidden": false }, "rewards": { - "experience": 100 + "experience": 150 }, "criteria": { - "hold": { - "trigger": "minecraft:inventory_changed", + "have_advancements": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": [ - "immersiveweapons:molten_sword" - ] - }, - { - "items": [ - "immersiveweapons:molten_pickaxe" - ] - }, - { - "items": [ - "immersiveweapons:molten_axe" - ] - }, - { - "items": [ - "immersiveweapons:molten_shovel" - ] - }, - { - "items": [ - "immersiveweapons:molten_hoe" - ] + "condition": "minecraft:entity_properties", + "predicate": { + "player": { + "advancements": { + "immersiveweapons:molten_pickaxe": true, + "immersiveweapons:molten_shovel": true, + "immersiveweapons:molten_axe": true, + "immersiveweapons:molten_hoe": true, + "immersiveweapons:molten_sword": true + } + } + }, + "entity": "this" } ] } @@ -55,7 +44,7 @@ }, "requirements": [ [ - "hold" + "have_advancements" ] ] } \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/pretty_windy.json b/src/generated/resources/data/immersiveweapons/advancements/pretty_windy.json index 225fb9817..910d0dcd1 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/pretty_windy.json +++ b/src/generated/resources/data/immersiveweapons/advancements/pretty_windy.json @@ -2,8 +2,7 @@ "parent": "immersiveweapons:ventus_shard", "display": { "icon": { - "item": "immersiveweapons:ventus_pickaxe", - "nbt": "{Damage:0}" + "item": "immersiveweapons:ventus_ore" }, "title": { "translate": "advancements.immersiveweapons.pretty_windy.title" @@ -11,43 +10,33 @@ "description": { "translate": "advancements.immersiveweapons.pretty_windy.description" }, - "frame": "goal", + "frame": "challenge", "show_toast": true, "announce_to_chat": true, "hidden": false }, "rewards": { - "experience": 100 + "experience": 150 }, "criteria": { - "hold": { - "trigger": "minecraft:inventory_changed", + "have_advancements": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": [ - "immersiveweapons:ventus_sword" - ] - }, - { - "items": [ - "immersiveweapons:ventus_pickaxe" - ] - }, - { - "items": [ - "immersiveweapons:ventus_axe" - ] - }, - { - "items": [ - "immersiveweapons:ventus_shovel" - ] - }, - { - "items": [ - "immersiveweapons:ventus_hoe" - ] + "condition": "minecraft:entity_properties", + "predicate": { + "player": { + "advancements": { + "immersiveweapons:ventus_pickaxe": true, + "immersiveweapons:ventus_shovel": true, + "immersiveweapons:ventus_sword": true, + "immersiveweapons:ventus_axe": true, + "immersiveweapons:ventus_hoe": true + } + } + }, + "entity": "this" } ] } @@ -55,7 +44,7 @@ }, "requirements": [ [ - "hold" + "have_advancements" ] ] } \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_plate.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/acacia_table.json similarity index 69% rename from src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_plate.json rename to src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/acacia_table.json index 0512b7757..4584101c0 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/tesla_plate.json +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/acacia_table.json @@ -2,16 +2,16 @@ "parent": "minecraft:recipes/root", "rewards": { "recipes": [ - "immersiveweapons:tesla_plate" + "immersiveweapons:acacia_table" ] }, "criteria": { - "tesla_ingot": { + "planks": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { - "tag": "immersiveweapons:ingots/tesla" + "tag": "minecraft:planks" } ] } @@ -19,13 +19,13 @@ "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { - "recipe": "immersiveweapons:tesla_plate" + "recipe": "immersiveweapons:acacia_table" } } }, "requirements": [ [ - "tesla_ingot", + "planks", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/molten_plate.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/birch_table.json similarity index 68% rename from src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/molten_plate.json rename to src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/birch_table.json index fa77032b1..6d047e03d 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/molten_plate.json +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/birch_table.json @@ -2,16 +2,16 @@ "parent": "minecraft:recipes/root", "rewards": { "recipes": [ - "immersiveweapons:molten_plate" + "immersiveweapons:birch_table" ] }, "criteria": { - "molten_ingot": { + "planks": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { - "tag": "immersiveweapons:ingots/molten" + "tag": "minecraft:planks" } ] } @@ -19,13 +19,13 @@ "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { - "recipe": "immersiveweapons:molten_plate" + "recipe": "immersiveweapons:birch_table" } } }, "requirements": [ [ - "molten_ingot", + "planks", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_table.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_table.json new file mode 100644 index 000000000..bb6764b8b --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/burned_oak_table.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "immersiveweapons:burned_oak_table" + ] + }, + "criteria": { + "planks": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "immersiveweapons:burned_oak_table" + } + } + }, + "requirements": [ + [ + "planks", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/crimson_table.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/crimson_table.json new file mode 100644 index 000000000..d97e1e596 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/crimson_table.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "immersiveweapons:crimson_table" + ] + }, + "criteria": { + "planks": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "immersiveweapons:crimson_table" + } + } + }, + "requirements": [ + [ + "planks", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/dark_oak_table.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/dark_oak_table.json new file mode 100644 index 000000000..032a87846 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/dark_oak_table.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "immersiveweapons:dark_oak_table" + ] + }, + "criteria": { + "planks": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "immersiveweapons:dark_oak_table" + } + } + }, + "requirements": [ + [ + "planks", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/jungle_table.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/jungle_table.json new file mode 100644 index 000000000..71ca17b67 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/jungle_table.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "immersiveweapons:jungle_table" + ] + }, + "criteria": { + "planks": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "immersiveweapons:jungle_table" + } + } + }, + "requirements": [ + [ + "planks", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/landmine.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/landmine.json index c5d125c0b..f31be826d 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/landmine.json +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/landmine.json @@ -11,7 +11,9 @@ "conditions": { "items": [ { - "tag": "forge:gunpowder" + "items": [ + "minecraft:tnt" + ] } ] } diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/oak_table.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/oak_table.json new file mode 100644 index 000000000..526f7d988 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/oak_table.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "immersiveweapons:oak_table" + ] + }, + "criteria": { + "planks": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "immersiveweapons:oak_table" + } + } + }, + "requirements": [ + [ + "planks", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/wooden_table.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/raw_sulfur_block.json similarity index 72% rename from src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/wooden_table.json rename to src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/raw_sulfur_block.json index b8c6c910a..291762b7d 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/wooden_table.json +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/raw_sulfur_block.json @@ -2,17 +2,17 @@ "parent": "minecraft:recipes/root", "rewards": { "recipes": [ - "immersiveweapons:wooden_table" + "immersiveweapons:raw_sulfur_block" ] }, "criteria": { - "oak_slab": { + "sulfur": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ { "items": [ - "minecraft:oak_slab" + "immersiveweapons:sulfur" ] } ] @@ -21,13 +21,13 @@ "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { - "recipe": "immersiveweapons:wooden_table" + "recipe": "immersiveweapons:raw_sulfur_block" } } }, "requirements": [ [ - "oak_slab", + "sulfur", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/spruce_table.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/spruce_table.json new file mode 100644 index 000000000..36ea585e1 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/spruce_table.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "immersiveweapons:spruce_table" + ] + }, + "criteria": { + "planks": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "immersiveweapons:spruce_table" + } + } + }, + "requirements": [ + [ + "planks", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/sulfur.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/sulfur.json new file mode 100644 index 000000000..823591a54 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/sulfur.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "immersiveweapons:sulfur" + ] + }, + "criteria": { + "raw_sulfur_block": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:raw_sulfur_block" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "immersiveweapons:sulfur" + } + } + }, + "requirements": [ + [ + "raw_sulfur_block", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/warped_table.json b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/warped_table.json new file mode 100644 index 000000000..5aeac1472 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/recipes/immersiveweapons/warped_table.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "immersiveweapons:warped_table" + ] + }, + "criteria": { + "planks": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "minecraft:planks" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "immersiveweapons:warped_table" + } + } + }, + "requirements": [ + [ + "planks", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/root.json b/src/generated/resources/data/immersiveweapons/advancements/root.json index 9ac98294c..0475c2ede 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/root.json +++ b/src/generated/resources/data/immersiveweapons/advancements/root.json @@ -17,6 +17,11 @@ "hidden": false, "background": "immersiveweapons:textures/block/red_stained_bulletproof_glass.png" }, + "rewards": { + "loot": [ + "immersiveweapons:grant_encyclopedia_book_on_first_join" + ] + }, "criteria": { "exist": { "trigger": "minecraft:location", diff --git a/src/generated/resources/data/immersiveweapons/advancements/shards.json b/src/generated/resources/data/immersiveweapons/advancements/shards.json index 8fa660c22..7e0ddd58a 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/shards.json +++ b/src/generated/resources/data/immersiveweapons/advancements/shards.json @@ -11,8 +11,8 @@ "translate": "advancements.immersiveweapons.shards.description" }, "frame": "task", - "show_toast": true, - "announce_to_chat": true, + "show_toast": false, + "announce_to_chat": false, "hidden": false }, "criteria": { diff --git a/src/generated/resources/data/immersiveweapons/advancements/stone_shard.json b/src/generated/resources/data/immersiveweapons/advancements/stone_shard.json new file mode 100644 index 000000000..87329f466 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/stone_shard.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:shards", + "display": { + "icon": { + "item": "immersiveweapons:stone_shard" + }, + "title": { + "translate": "advancements.immersiveweapons.stone_shard.title" + }, + "description": { + "translate": "advancements.immersiveweapons.stone_shard.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:stone_shard" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/tesla_axe.json b/src/generated/resources/data/immersiveweapons/advancements/tesla_axe.json new file mode 100644 index 000000000..03bc6a41f --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/tesla_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:tesla_ingot", + "display": { + "icon": { + "item": "immersiveweapons:tesla_axe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.tesla_axe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.tesla_axe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:tesla_axe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/rich_no_more.json b/src/generated/resources/data/immersiveweapons/advancements/tesla_hoe.json similarity index 81% rename from src/generated/resources/data/immersiveweapons/advancements/rich_no_more.json rename to src/generated/resources/data/immersiveweapons/advancements/tesla_hoe.json index 2b5b6e912..a998f43cb 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/rich_no_more.json +++ b/src/generated/resources/data/immersiveweapons/advancements/tesla_hoe.json @@ -6,10 +6,10 @@ "nbt": "{Damage:0}" }, "title": { - "translate": "advancements.immersiveweapons.rich_no_more.title" + "translate": "advancements.immersiveweapons.tesla_hoe.title" }, "description": { - "translate": "advancements.immersiveweapons.rich_no_more.description" + "translate": "advancements.immersiveweapons.tesla_hoe.description" }, "frame": "challenge", "show_toast": true, diff --git a/src/generated/resources/data/immersiveweapons/advancements/tesla_pickaxe.json b/src/generated/resources/data/immersiveweapons/advancements/tesla_pickaxe.json new file mode 100644 index 000000000..f9ccf7b20 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/tesla_pickaxe.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:tesla_ingot", + "display": { + "icon": { + "item": "immersiveweapons:tesla_pickaxe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.tesla_pickaxe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.tesla_pickaxe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:tesla_pickaxe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/tesla_shovel.json b/src/generated/resources/data/immersiveweapons/advancements/tesla_shovel.json new file mode 100644 index 000000000..15d0134fa --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/tesla_shovel.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:tesla_ingot", + "display": { + "icon": { + "item": "immersiveweapons:tesla_shovel", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.tesla_shovel.title" + }, + "description": { + "translate": "advancements.immersiveweapons.tesla_shovel.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:tesla_shovel" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/tiltros.json b/src/generated/resources/data/immersiveweapons/advancements/tiltros.json deleted file mode 100644 index 280d4f5fc..000000000 --- a/src/generated/resources/data/immersiveweapons/advancements/tiltros.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "parent": "immersiveweapons:azul_keystone", - "display": { - "icon": { - "item": "immersiveweapons:azul_stained_orchid" - }, - "title": { - "translate": "advancements.immersiveweapons.tiltros.tiltros.title" - }, - "description": { - "translate": "advancements.immersiveweapons.tiltros.tiltros.description" - }, - "frame": "goal", - "show_toast": true, - "announce_to_chat": true, - "hidden": true - }, - "criteria": { - "visit": { - "trigger": "minecraft:location", - "conditions": { - "location": { - "biome": "immersiveweapons:tiltros" - } - } - } - }, - "requirements": [ - [ - "visit" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/ventus_axe.json b/src/generated/resources/data/immersiveweapons/advancements/ventus_axe.json new file mode 100644 index 000000000..703e9d519 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/ventus_axe.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:ventus_shard", + "display": { + "icon": { + "item": "immersiveweapons:ventus_axe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.ventus_axe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.ventus_axe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:ventus_axe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/ventus_hoe.json b/src/generated/resources/data/immersiveweapons/advancements/ventus_hoe.json new file mode 100644 index 000000000..b43eb1e2b --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/ventus_hoe.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:ventus_shard", + "display": { + "icon": { + "item": "immersiveweapons:ventus_hoe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.ventus_hoe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.ventus_hoe.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 50 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:ventus_hoe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/ventus_pickaxe.json b/src/generated/resources/data/immersiveweapons/advancements/ventus_pickaxe.json new file mode 100644 index 000000000..0acc65c23 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/ventus_pickaxe.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:ventus_shard", + "display": { + "icon": { + "item": "immersiveweapons:ventus_pickaxe", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.ventus_pickaxe.title" + }, + "description": { + "translate": "advancements.immersiveweapons.ventus_pickaxe.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:ventus_pickaxe" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/ventus_shovel.json b/src/generated/resources/data/immersiveweapons/advancements/ventus_shovel.json new file mode 100644 index 000000000..c33afe785 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/ventus_shovel.json @@ -0,0 +1,41 @@ +{ + "parent": "immersiveweapons:ventus_shard", + "display": { + "icon": { + "item": "immersiveweapons:ventus_shovel", + "nbt": "{Damage:0}" + }, + "title": { + "translate": "advancements.immersiveweapons.ventus_shovel.title" + }, + "description": { + "translate": "advancements.immersiveweapons.ventus_shovel.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "rewards": { + "experience": 35 + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:ventus_shovel" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/warm_and_toasty.json b/src/generated/resources/data/immersiveweapons/advancements/warm_and_toasty.json index 55b667751..d7ec4b414 100644 --- a/src/generated/resources/data/immersiveweapons/advancements/warm_and_toasty.json +++ b/src/generated/resources/data/immersiveweapons/advancements/warm_and_toasty.json @@ -1,5 +1,5 @@ { - "parent": "immersiveweapons:molten_plate", + "parent": "immersiveweapons:molten_ingot", "display": { "icon": { "item": "immersiveweapons:molten_helmet", diff --git a/src/generated/resources/data/immersiveweapons/advancements/warrior_statue.json b/src/generated/resources/data/immersiveweapons/advancements/warrior_statue.json deleted file mode 100644 index 573d55c41..000000000 --- a/src/generated/resources/data/immersiveweapons/advancements/warrior_statue.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "parent": "immersiveweapons:root", - "display": { - "icon": { - "item": "immersiveweapons:warrior_statue_head" - }, - "title": { - "translate": "advancements.immersiveweapons.tiltros.warrior_statue.title" - }, - "description": { - "translate": "advancements.immersiveweapons.tiltros.warrior_statue.description" - }, - "frame": "task", - "show_toast": true, - "announce_to_chat": true, - "hidden": true - }, - "criteria": { - "hold": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": [ - "immersiveweapons:warrior_statue_base" - ] - }, - { - "items": [ - "immersiveweapons:warrior_statue_torso" - ] - }, - { - "items": [ - "immersiveweapons:warrior_statue_head" - ] - } - ] - } - } - }, - "requirements": [ - [ - "hold" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/advancements/wood_shard.json b/src/generated/resources/data/immersiveweapons/advancements/wood_shard.json new file mode 100644 index 000000000..a36abf629 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/advancements/wood_shard.json @@ -0,0 +1,37 @@ +{ + "parent": "immersiveweapons:shards", + "display": { + "icon": { + "item": "immersiveweapons:wood_shard" + }, + "title": { + "translate": "advancements.immersiveweapons.wood_shard.title" + }, + "description": { + "translate": "advancements.immersiveweapons.wood_shard.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveweapons:wood_shard" + ] + } + ] + } + } + }, + "requirements": [ + [ + "hold" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/loot_tables/blocks/wooden_table.json b/src/generated/resources/data/immersiveweapons/loot_tables/blocks/oak_table.json similarity index 85% rename from src/generated/resources/data/immersiveweapons/loot_tables/blocks/wooden_table.json rename to src/generated/resources/data/immersiveweapons/loot_tables/blocks/oak_table.json index 23ae5f719..ff39cc378 100644 --- a/src/generated/resources/data/immersiveweapons/loot_tables/blocks/wooden_table.json +++ b/src/generated/resources/data/immersiveweapons/loot_tables/blocks/oak_table.json @@ -7,7 +7,7 @@ "entries": [ { "type": "minecraft:item", - "name": "immersiveweapons:wooden_table" + "name": "immersiveweapons:oak_table" } ], "conditions": [ diff --git a/src/generated/resources/data/immersiveweapons/loot_tables/entities/dying_soldier.json b/src/generated/resources/data/immersiveweapons/loot_tables/entities/dying_soldier.json index db7610a47..0361cc3aa 100644 --- a/src/generated/resources/data/immersiveweapons/loot_tables/entities/dying_soldier.json +++ b/src/generated/resources/data/immersiveweapons/loot_tables/entities/dying_soldier.json @@ -7,108 +7,7 @@ "entries": [ { "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:set_count", - "count": { - "type": "minecraft:uniform", - "min": 0.0, - "max": 2.0 - }, - "add": false - }, - { - "function": "minecraft:looting_enchant", - "count": { - "type": "minecraft:uniform", - "min": 0.0, - "max": 1.0 - } - } - ], - "name": "minecraft:rotten_flesh" - } - ] - }, - { - "rolls": 1.0, - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:set_count", - "count": { - "type": "minecraft:uniform", - "min": 0.0, - "max": 4.0 - }, - "add": false - }, - { - "function": "minecraft:looting_enchant", - "count": { - "type": "minecraft:uniform", - "min": 0.0, - "max": 1.0 - } - } - ], - "name": "immersiveweapons:iron_musket_ball" - } - ], - "conditions": [ - { - "condition": "minecraft:killed_by_player" - } - ] - }, - { - "rolls": 1.0, - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:looting_enchant", - "count": { - "type": "minecraft:uniform", - "min": 0.0, - "max": 1.0 - } - } - ], - "name": "immersiveweapons:chocolate_bar" - }, - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:looting_enchant", - "count": { - "type": "minecraft:uniform", - "min": 0.0, - "max": 1.0 - } - } - ], - "name": "minecraft:carrot" - }, - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:looting_enchant", - "count": { - "type": "minecraft:uniform", - "min": 0.0, - "max": 1.0 - } - } - ], - "name": "minecraft:potato" + "name": "immersiveweapons:flintlock_pistol" } ], "conditions": [ @@ -117,24 +16,8 @@ }, { "condition": "minecraft:random_chance_with_looting", - "chance": 0.035, - "looting_multiplier": 0.02 - } - ], - "functions": [ - { - "function": "minecraft:furnace_smelt", - "conditions": [ - { - "condition": "minecraft:entity_properties", - "predicate": { - "flags": { - "is_on_fire": true - } - }, - "entity": "this" - } - ] + "chance": 0.02, + "looting_multiplier": 0.05 } ] } diff --git a/src/generated/resources/data/immersiveweapons/loot_tables/entities/minuteman.json b/src/generated/resources/data/immersiveweapons/loot_tables/entities/minuteman.json index 8e5abd610..41ddbe7f0 100644 --- a/src/generated/resources/data/immersiveweapons/loot_tables/entities/minuteman.json +++ b/src/generated/resources/data/immersiveweapons/loot_tables/entities/minuteman.json @@ -64,6 +64,26 @@ } ] }, + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "immersiveweapons:blunderbuss" + } + ], + "conditions": [ + { + "condition": "minecraft:killed_by_player" + }, + { + "condition": "minecraft:random_chance_with_looting", + "chance": 0.017, + "looting_multiplier": 0.05 + } + ] + }, { "rolls": 1.0, "bonus_rolls": 0.0, diff --git a/src/generated/resources/data/immersiveweapons/recipes/acacia_table.json b/src/generated/resources/data/immersiveweapons/recipes/acacia_table.json new file mode 100644 index 000000000..407e3cdb0 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/acacia_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "tables", + "pattern": [ + "a", + "b" + ], + "key": { + "a": { + "item": "minecraft:acacia_slab" + }, + "b": { + "item": "minecraft:acacia_fence" + } + }, + "result": { + "item": "immersiveweapons:acacia_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/birch_table.json b/src/generated/resources/data/immersiveweapons/recipes/birch_table.json new file mode 100644 index 000000000..4e953bac5 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/birch_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "tables", + "pattern": [ + "a", + "b" + ], + "key": { + "a": { + "item": "minecraft:birch_slab" + }, + "b": { + "item": "minecraft:birch_fence" + } + }, + "result": { + "item": "immersiveweapons:birch_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/burned_oak_table.json b/src/generated/resources/data/immersiveweapons/recipes/burned_oak_table.json new file mode 100644 index 000000000..f377b0052 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/burned_oak_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "tables", + "pattern": [ + "a", + "b" + ], + "key": { + "a": { + "item": "immersiveweapons:burned_oak_slab" + }, + "b": { + "item": "immersiveweapons:burned_oak_fence" + } + }, + "result": { + "item": "immersiveweapons:burned_oak_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/cloth_scrap.json b/src/generated/resources/data/immersiveweapons/recipes/cloth_scrap.json index 5482bc3e1..14f6ab294 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/cloth_scrap.json +++ b/src/generated/resources/data/immersiveweapons/recipes/cloth_scrap.json @@ -15,6 +15,7 @@ } }, "result": { - "item": "immersiveweapons:cloth_scrap" + "item": "immersiveweapons:cloth_scrap", + "count": 4 } } \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/crimson_table.json b/src/generated/resources/data/immersiveweapons/recipes/crimson_table.json new file mode 100644 index 000000000..6fdd4b4ec --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/crimson_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "tables", + "pattern": [ + "a", + "b" + ], + "key": { + "a": { + "item": "minecraft:crimson_slab" + }, + "b": { + "item": "minecraft:crimson_fence" + } + }, + "result": { + "item": "immersiveweapons:crimson_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/dark_oak_table.json b/src/generated/resources/data/immersiveweapons/recipes/dark_oak_table.json new file mode 100644 index 000000000..00ff8ee8e --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/dark_oak_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "tables", + "pattern": [ + "a", + "b" + ], + "key": { + "a": { + "item": "minecraft:dark_oak_slab" + }, + "b": { + "item": "minecraft:dark_oak_fence" + } + }, + "result": { + "item": "immersiveweapons:dark_oak_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/explosive_chocolate_bar.json b/src/generated/resources/data/immersiveweapons/recipes/explosive_chocolate_bar.json index be2786a77..7f51bca0d 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/explosive_chocolate_bar.json +++ b/src/generated/resources/data/immersiveweapons/recipes/explosive_chocolate_bar.json @@ -6,13 +6,7 @@ "item": "immersiveweapons:chocolate_bar" }, { - "item": "minecraft:gunpowder" - }, - { - "item": "minecraft:gunpowder" - }, - { - "item": "minecraft:gunpowder" + "item": "minecraft:tnt" } ], "result": { diff --git a/src/generated/resources/data/immersiveweapons/recipes/jungle_table.json b/src/generated/resources/data/immersiveweapons/recipes/jungle_table.json new file mode 100644 index 000000000..f3470aa80 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/jungle_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "tables", + "pattern": [ + "a", + "b" + ], + "key": { + "a": { + "item": "minecraft:jungle_slab" + }, + "b": { + "item": "minecraft:jungle_fence" + } + }, + "result": { + "item": "immersiveweapons:jungle_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/landmine.json b/src/generated/resources/data/immersiveweapons/recipes/landmine.json index d908293a9..8ba8a3a8f 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/landmine.json +++ b/src/generated/resources/data/immersiveweapons/recipes/landmine.json @@ -13,7 +13,7 @@ "item": "minecraft:heavy_weighted_pressure_plate" }, "c": { - "tag": "forge:gunpowder" + "item": "minecraft:tnt" } }, "result": { diff --git a/src/generated/resources/data/immersiveweapons/recipes/molten_plate.json b/src/generated/resources/data/immersiveweapons/recipes/molten_plate.json deleted file mode 100644 index abf564556..000000000 --- a/src/generated/resources/data/immersiveweapons/recipes/molten_plate.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "molten", - "pattern": [ - "aa " - ], - "key": { - "a": { - "tag": "immersiveweapons:ingots/molten" - } - }, - "result": { - "item": "immersiveweapons:molten_plate" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/molten_sword.json b/src/generated/resources/data/immersiveweapons/recipes/molten_sword.json index f96e27bd9..a32f07aa8 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/molten_sword.json +++ b/src/generated/resources/data/immersiveweapons/recipes/molten_sword.json @@ -11,7 +11,7 @@ "tag": "immersiveweapons:ingots/molten" }, "b": { - "item": "minecraft:stick" + "item": "immersiveweapons:obsidian_rod" } }, "result": { diff --git a/src/generated/resources/data/immersiveweapons/recipes/wooden_table.json b/src/generated/resources/data/immersiveweapons/recipes/oak_table.json similarity index 77% rename from src/generated/resources/data/immersiveweapons/recipes/wooden_table.json rename to src/generated/resources/data/immersiveweapons/recipes/oak_table.json index ef15888a8..14bad1cbb 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/wooden_table.json +++ b/src/generated/resources/data/immersiveweapons/recipes/oak_table.json @@ -2,8 +2,8 @@ "type": "minecraft:crafting_shaped", "group": "tables", "pattern": [ - " a ", - " b " + "a", + "b" ], "key": { "a": { @@ -14,6 +14,6 @@ } }, "result": { - "item": "immersiveweapons:wooden_table" + "item": "immersiveweapons:oak_table" } } \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/punji_sticks.json b/src/generated/resources/data/immersiveweapons/recipes/punji_sticks.json index f0d7c5274..71404d9ec 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/punji_sticks.json +++ b/src/generated/resources/data/immersiveweapons/recipes/punji_sticks.json @@ -14,7 +14,10 @@ "item": "minecraft:bamboo" }, "c": { - "item": "minecraft:spider_eye" + "type": "forge:nbt", + "item": "minecraft:potion", + "count": 1, + "nbt": "{Potion:\"minecraft:poison\"}" } }, "result": { diff --git a/src/generated/resources/data/immersiveweapons/recipes/raw_sulfur_block.json b/src/generated/resources/data/immersiveweapons/recipes/raw_sulfur_block.json new file mode 100644 index 000000000..7142c3d4b --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/raw_sulfur_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sulfur", + "pattern": [ + "aaa", + "aaa", + "aaa" + ], + "key": { + "a": { + "item": "immersiveweapons:sulfur" + } + }, + "result": { + "item": "immersiveweapons:raw_sulfur_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/sandbag.json b/src/generated/resources/data/immersiveweapons/recipes/sandbag.json index 2876e3303..3fc04b405 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/sandbag.json +++ b/src/generated/resources/data/immersiveweapons/recipes/sandbag.json @@ -3,7 +3,7 @@ "group": "sandbags", "pattern": [ "bbb", - "bab", + "aaa", "bbb" ], "key": { @@ -16,6 +16,6 @@ }, "result": { "item": "immersiveweapons:sandbag", - "count": 2 + "count": 6 } } \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/spruce_table.json b/src/generated/resources/data/immersiveweapons/recipes/spruce_table.json new file mode 100644 index 000000000..2da228535 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/spruce_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "tables", + "pattern": [ + "a", + "b" + ], + "key": { + "a": { + "item": "minecraft:spruce_slab" + }, + "b": { + "item": "minecraft:spruce_fence" + } + }, + "result": { + "item": "immersiveweapons:spruce_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/sulfur.json b/src/generated/resources/data/immersiveweapons/recipes/sulfur.json new file mode 100644 index 000000000..5520007e5 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/sulfur.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "sulfur", + "ingredients": [ + { + "item": "immersiveweapons:raw_sulfur_block" + } + ], + "result": { + "item": "immersiveweapons:sulfur", + "count": 9 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/tesla_plate.json b/src/generated/resources/data/immersiveweapons/recipes/tesla_plate.json deleted file mode 100644 index 4e13098b8..000000000 --- a/src/generated/resources/data/immersiveweapons/recipes/tesla_plate.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "tesla", - "pattern": [ - "aa " - ], - "key": { - "a": { - "tag": "immersiveweapons:ingots/tesla" - } - }, - "result": { - "item": "immersiveweapons:tesla_plate" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/tesla_sword.json b/src/generated/resources/data/immersiveweapons/recipes/tesla_sword.json index 31416ac17..b9ce8089e 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/tesla_sword.json +++ b/src/generated/resources/data/immersiveweapons/recipes/tesla_sword.json @@ -11,7 +11,7 @@ "tag": "immersiveweapons:ingots/tesla" }, "b": { - "item": "minecraft:stick" + "item": "immersiveweapons:obsidian_rod" } }, "result": { diff --git a/src/generated/resources/data/immersiveweapons/recipes/ventus_sword.json b/src/generated/resources/data/immersiveweapons/recipes/ventus_sword.json index 478fb9ebe..b48003175 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/ventus_sword.json +++ b/src/generated/resources/data/immersiveweapons/recipes/ventus_sword.json @@ -11,7 +11,7 @@ "tag": "immersiveweapons:shards/ventus" }, "b": { - "item": "minecraft:stick" + "item": "immersiveweapons:obsidian_rod" } }, "result": { diff --git a/src/generated/resources/data/immersiveweapons/recipes/warped_table.json b/src/generated/resources/data/immersiveweapons/recipes/warped_table.json new file mode 100644 index 000000000..0e2482f90 --- /dev/null +++ b/src/generated/resources/data/immersiveweapons/recipes/warped_table.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "tables", + "pattern": [ + "a", + "b" + ], + "key": { + "a": { + "item": "minecraft:warped_slab" + }, + "b": { + "item": "minecraft:warped_fence" + } + }, + "result": { + "item": "immersiveweapons:warped_table" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/immersiveweapons/recipes/wood_gauntlet.json b/src/generated/resources/data/immersiveweapons/recipes/wood_gauntlet.json index 9c837d004..a6ed51719 100644 --- a/src/generated/resources/data/immersiveweapons/recipes/wood_gauntlet.json +++ b/src/generated/resources/data/immersiveweapons/recipes/wood_gauntlet.json @@ -7,7 +7,7 @@ ], "key": { "a": { - "tag": "immersiveweapons:shards/wood" + "tag": "minecraft:planks" }, "b": { "item": "immersiveweapons:gauntlet_scaffolding" diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 318018f48..75a6d3a26 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -27,6 +27,7 @@ "immersiveweapons:sulfur_ore", "immersiveweapons:deepslate_sulfur_ore", "immersiveweapons:nether_sulfur_ore", + "immersiveweapons:raw_sulfur_block", "immersiveweapons:barbed_wire_fence", "immersiveweapons:cobalt_ore", "immersiveweapons:deepslate_cobalt_ore", diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json index 9a85f80d2..ab174feb6 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json @@ -12,6 +12,7 @@ "immersiveweapons:sulfur_ore", "immersiveweapons:deepslate_sulfur_ore", "immersiveweapons:nether_sulfur_ore", + "immersiveweapons:raw_sulfur_block", "immersiveweapons:wooden_spikes", "immersiveweapons:punji_sticks" ] diff --git a/src/generated/resources/data/minecraft/tags/blocks/non_flammable_wood.json b/src/generated/resources/data/minecraft/tags/blocks/non_flammable_wood.json new file mode 100644 index 000000000..d662878cc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/non_flammable_wood.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "immersiveweapons:warped_table", + "immersiveweapons:crimson_table" + ] +} \ 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 f73c907c6..6069a9ac3 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/ImmersiveWeapons.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/ImmersiveWeapons.java @@ -1,20 +1,20 @@ package com.anonymoushacker1279.immersiveweapons; +import com.anonymoushacker1279.immersiveweapons.block.properties.WoodTypes; import com.anonymoushacker1279.immersiveweapons.config.ClientConfig; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.*; -import com.anonymoushacker1279.immersiveweapons.util.CustomWoodTypes; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.OreGeneratorHandler; import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.Structures; 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 net.minecraftforge.fml.loading.FMLPaths; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -30,8 +30,8 @@ public class ImmersiveWeapons { // Mod setup begins here public ImmersiveWeapons() { // Load configuration - ServerConfig.setup(FMLPaths.CONFIGDIR.get().resolve(MOD_ID + "-server.toml")); - ClientConfig.setup(FMLPaths.CONFIGDIR.get().resolve(MOD_ID + "-client.toml")); + ModLoadingContext.get().registerConfig(Type.COMMON, CommonConfig.COMMON_SPEC); + ModLoadingContext.get().registerConfig(Type.CLIENT, ClientConfig.CLIENT_SPEC); // Initialize deferred registry DeferredRegistryHandler.init(); @@ -58,7 +58,7 @@ public void setup(FMLCommonSetupEvent event) { DispenserBehaviorRegistry.init(); OreGeneratorHandler.init(); event.enqueueWork(() -> { - WoodType.register(CustomWoodTypes.BURNED_OAK); + WoodType.register(WoodTypes.BURNED_OAK); Structures.setupStructures(); Structures.registerConfiguredStructures(); }); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/MortarBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/MortarBlock.java index a61f49d5b..15b114be6 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/MortarBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/MortarBlock.java @@ -2,12 +2,13 @@ import com.anonymoushacker1279.immersiveweapons.entity.projectile.MortarShellEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; +import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -27,7 +28,6 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent.Context; @@ -85,7 +85,9 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext selectionContext) { + return SHAPE; } @@ -103,29 +105,38 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @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)) { ItemStack itemStack = player.getMainHandItem(); + // If the mortar is loaded and the player is holding flint and steel, fire the shell if (state.getValue(LOADED) && itemStack.getItem() == Items.FLINT_AND_STEEL) { if (!player.isCreative()) { itemStack.setDamageValue(itemStack.getDamageValue() - 1); } fire(worldIn, pos, state); return InteractionResult.CONSUME; + + // If the mortar is not loaded and the player is holding a mortar shell , load the mortar } else if (!state.getValue(LOADED) && itemStack.getItem() == DeferredRegistryHandler.MORTAR_SHELL.get()) { worldIn.setBlock(pos, state.setValue(LOADED, true), 3); if (!player.isCreative()) { itemStack.shrink(1); } return InteractionResult.CONSUME; - } else if (itemStack.getItem() == Items.AIR && player.isCrouching()) { - if (state.getValue(LOADED)) { - if (!player.isCreative()) { - player.getInventory().add(new ItemStack(DeferredRegistryHandler.MORTAR_SHELL.get())); - } - worldIn.setBlock(pos, state.setValue(LOADED, false), 3); + + // If the player is crouching, not holding anything, and the mortar is loaded, remove the shell + // and give it to the player + } else if (itemStack.getItem() == Items.AIR && player.isCrouching() && state.getValue(LOADED)) { + if (!player.isCreative()) { + player.getInventory().add(new ItemStack(DeferredRegistryHandler.MORTAR_SHELL.get())); } + worldIn.setBlock(pos, state.setValue(LOADED, false), 3); return InteractionResult.SUCCESS; + + // If the player isn't holding anything, cycle through the rotations } else if (itemStack.getItem() == Items.AIR) { if (state.getValue(ROTATION) < 2) { worldIn.setBlock(pos, state.setValue(ROTATION, state.getValue(ROTATION) + 1), 3); @@ -137,7 +148,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { return InteractionResult.SUCCESS; } - return InteractionResult.PASS; + return InteractionResult.CONSUME_PARTIAL; } /** @@ -152,7 +163,9 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @SuppressWarnings("deprecation") @Override - public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull BlockPos pos, @NotNull Block blockIn, @NotNull BlockPos fromPos, boolean isMoving) { + public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull BlockPos pos, @NotNull Block blockIn, + @NotNull BlockPos fromPos, boolean isMoving) { + if (!worldIn.isClientSide) { if (state.getValue(LOADED) && worldIn.hasNeighborSignal(pos)) { fire(worldIn, pos, state); @@ -168,7 +181,9 @@ public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull B * @param state the BlockState of the block */ private void fire(Level worldIn, BlockPos pos, BlockState state) { - PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> worldIn.getChunkAt(pos)), new MortarBlockPacketHandler(pos)); + PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> worldIn.getChunkAt(pos)), + new MortarBlockPacketHandler(pos)); + worldIn.setBlock(pos, state.setValue(LOADED, false), 3); MortarShellEntity.create(worldIn, pos, 1f, state); } @@ -220,11 +235,13 @@ public static void handle(MortarBlockPacketHandler msg, Supplier contex * * @param msg the MortarBlockPacketHandler message being sent */ - @OnlyIn(Dist.CLIENT) private static void handleOnClient(MortarBlockPacketHandler msg) { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.level != null) { - minecraft.level.playLocalSound(msg.blockPos, SoundEvents.TNT_PRIMED, SoundSource.BLOCKS, 0.7f, 1f, false); + minecraft.level.playLocalSound(msg.blockPos, DeferredRegistryHandler.MORTAR_FIRE.get(), SoundSource.BLOCKS, 1f, + GeneralUtilities.getRandomNumber(0.1f, 0.5f) + 0.5f, true); + minecraft.level.addParticle(ParticleTypes.LARGE_SMOKE, msg.blockPos.getX(), msg.blockPos.getY(), msg.blockPos.getZ(), + 0.0f, 0.2f, 0.0f); } } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/PanicAlarmBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/PanicAlarmBlock.java index da2640e42..ea650aced 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/PanicAlarmBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/PanicAlarmBlock.java @@ -5,23 +5,17 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; @@ -50,14 +44,16 @@ public PanicAlarmBlock(Properties properties) { * Set the shape of the block. * * @param state the BlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param collisionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext collisionContext) { + return switch (state.getValue(FACING)) { case SOUTH -> SHAPE_SOUTH; case EAST -> SHAPE_EAST; @@ -69,7 +65,7 @@ public PanicAlarmBlock(Properties properties) { /** * Create the BlockState definition. * - * @param builder the StateContainer.Builder of the block + * @param builder the StateDefinition.Builder of the block */ @Override public void createBlockStateDefinition(StateDefinition.Builder builder) { @@ -98,20 +94,27 @@ public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockStat * @return BlockEntityTicker */ @Override - public BlockEntityTicker getTicker(Level level, @NotNull BlockState blockState, @NotNull BlockEntityType blockEntityType) { - return level.isClientSide ? null : BaseEntityBlock.createTickerHelper(blockEntityType, DeferredRegistryHandler.PANIC_ALARM_BLOCK_ENTITY.get(), (level1, blockPos, blockState1, panicAlarmBlockEntity) -> PanicAlarmBlockEntity.serverTick(level1, blockPos, panicAlarmBlockEntity)); + public BlockEntityTicker getTicker(@NotNull Level level, @NotNull BlockState blockState, + @NotNull BlockEntityType blockEntityType) { + + return level.isClientSide ? null : BaseEntityBlock.createTickerHelper(blockEntityType, + DeferredRegistryHandler.PANIC_ALARM_BLOCK_ENTITY.get(), + (level1, blockPos, blockState1, panicAlarmBlockEntity) -> + panicAlarmBlockEntity.tick(level1, blockPos)); } /** * Set placement properties. * Sets the facing direction of the block for placement. * - * @param context the BlockItemUseContext during placement + * @param context the BlockPlaceContext during placement * @return BlockState */ @Override public BlockState getStateForPlacement(BlockPlaceContext context) { - return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()).setValue(WATERLOGGED, context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); + return defaultBlockState() + .setValue(FACING, context.getHorizontalDirection().getOpposite()) + .setValue(WATERLOGGED, context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); } /** @@ -131,7 +134,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { * Runs when neighboring blocks change state. * * @param state the BlockState of the block - * @param worldIn the World the block is in + * @param level the Level the block is in * @param pos the BlockPos the block is at * @param blockIn the Block that is changing * @param fromPos the BlockPos of the changing block @@ -139,10 +142,12 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @SuppressWarnings("deprecation") @Override - public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull BlockPos pos, @NotNull Block blockIn, @NotNull BlockPos fromPos, boolean isMoving) { - if (!worldIn.isClientSide) { - playSiren(worldIn, pos); - worldIn.scheduleTick(pos, state.getBlock(), 5); + public void neighborChanged(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Block blockIn, + @NotNull BlockPos fromPos, boolean isMoving) { + + if (!level.isClientSide) { + checkPowered(level, pos); + level.scheduleTick(pos, state.getBlock(), 5); } } @@ -150,18 +155,18 @@ public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull B * Runs when neighboring blocks change state. * * @param state the BlockState of the block - * @param worldIn the World the block is in + * @param level the Level the block is in * @param pos the BlockPos the block is at * @param oldState the BlockState the block previously had * @param isMoving determines if the block is moving */ @SuppressWarnings("deprecation") @Override - public void onPlace(BlockState state, @NotNull Level worldIn, @NotNull BlockPos pos, BlockState oldState, boolean isMoving) { + public void onPlace(BlockState state, @NotNull Level level, @NotNull BlockPos pos, BlockState oldState, boolean isMoving) { if (!oldState.is(state.getBlock())) { - if (worldIn.hasNeighborSignal(pos)) { - if (!worldIn.isClientSide) { - worldIn.scheduleTick(pos, state.getBlock(), 5); + if (level.hasNeighborSignal(pos)) { + if (!level.isClientSide) { + level.scheduleTick(pos, state.getBlock(), 5); } } } @@ -170,74 +175,39 @@ public void onPlace(BlockState state, @NotNull Level worldIn, @NotNull BlockPos /** * Runs once every tick * - * @param state the BlockState of the block - * @param worldIn the ServerWorld of the block - * @param pos the BlockPos the block is at - * @param rand a Random instance + * @param state the BlockState of the block + * @param serverLevel the ServerLevel of the block + * @param pos the BlockPos the block is at + * @param rand a Random instance */ @SuppressWarnings("deprecation") @Override - public void tick(@NotNull BlockState state, ServerLevel worldIn, @NotNull BlockPos pos, @NotNull Random rand) { - if (!worldIn.isClientSide) { - playSiren(worldIn, pos); - worldIn.scheduleTick(pos, state.getBlock(), 5); + public void tick(@NotNull BlockState state, ServerLevel serverLevel, @NotNull BlockPos pos, @NotNull Random rand) { + if (!serverLevel.isClientSide) { + checkPowered(serverLevel, pos); + serverLevel.scheduleTick(pos, state.getBlock(), 5); } } /** * Plays a sound when powered. * - * @param worldIn the World the block is at - * @param pos the BlockPos the block is at + * @param level the Level the block is at + * @param pos the BlockPos the block is at */ - private void playSiren(Level worldIn, BlockPos pos) { - BlockState state = worldIn.getBlockState(pos); - if (state.getBlock() != DeferredRegistryHandler.PANIC_ALARM.get()) { - return; - } - BlockEntity tileEntity = worldIn.getBlockEntity(pos); + private void checkPowered(Level level, BlockPos pos) { + BlockEntity blockEntity = level.getBlockEntity(pos); - if (tileEntity instanceof PanicAlarmBlockEntity panicAlarmTileEntity) { - if (worldIn.getBestNeighborSignal(pos) > 0) { - boolean isPowered = panicAlarmTileEntity.isPowered(); - - if (!isPowered) { + if (blockEntity instanceof PanicAlarmBlockEntity panicAlarmTileEntity) { + if (level.getBestNeighborSignal(pos) > 0) { + if (!panicAlarmTileEntity.isPowered()) { panicAlarmTileEntity.setPowered(true); } } else { - boolean isPowered = panicAlarmTileEntity.isPowered(); - - if (isPowered) { + if (panicAlarmTileEntity.isPowered()) { panicAlarmTileEntity.setPowered(false); } } } } - - /** - * Runs when the block is activated. - * Allows the block to respond to user interaction. - * - * @param state the BlockState of the block - * @param worldIn the World the block is in - * @param pos the BlockPos the block is at - * @param player the PlayerEntity interacting with the block - * @param handIn the Hand the PlayerEntity used - * @param blockRayTraceResult the BlockRayTraceResult of the interaction - * @return ActionResultType - */ - @SuppressWarnings("deprecation") - @Override - public @NotNull InteractionResult use(@NotNull BlockState state, Level worldIn, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand handIn, @NotNull BlockHitResult blockRayTraceResult) { - BlockEntity tileEntity = worldIn.getBlockEntity(pos); - if (tileEntity instanceof PanicAlarmBlockEntity) { - if (!worldIn.isClientSide && handIn == InteractionHand.MAIN_HAND) { - ((PanicAlarmBlockEntity) tileEntity).changeAlarmSound(player); - return InteractionResult.SUCCESS; - } else { - return InteractionResult.PASS; - } - } - return InteractionResult.FAIL; - } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/SandbagBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/SandbagBlock.java index 524428842..bb505b844 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/SandbagBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/SandbagBlock.java @@ -1,11 +1,13 @@ package com.anonymoushacker1279.immersiveweapons.block.base; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -17,8 +19,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; public class SandbagBlock extends HorizontalDirectionalBlock { @@ -91,7 +91,6 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @SuppressWarnings("deprecation") @Override - @OnlyIn(Dist.CLIENT) public float getShadeBrightness(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos) { return 1.0F; } @@ -110,7 +109,10 @@ public float getShadeBrightness(@NotNull BlockState state, @NotNull BlockGetter */ @SuppressWarnings("deprecation") @Override - public @NotNull InteractionResult use(@NotNull BlockState state, @NotNull Level worldIn, @NotNull BlockPos pos, Player player, @NotNull InteractionHand handIn, @NotNull BlockHitResult blockRayTraceResult) { + public @NotNull InteractionResult use(@NotNull BlockState state, @NotNull Level worldIn, @NotNull BlockPos pos, + Player player, @NotNull InteractionHand handIn, + @NotNull BlockHitResult blockRayTraceResult) { + if (player.getMainHandItem().getItem() == DeferredRegistryHandler.SANDBAG_ITEM.get()) { if (state.getValue(BAGS) == 1) { worldIn.setBlock(pos, state.setValue(BAGS, 2).setValue(FACING, state.getValue(FACING)), 3); @@ -136,4 +138,18 @@ public float getShadeBrightness(@NotNull BlockState state, @NotNull BlockGetter } return InteractionResult.PASS; } + + @SuppressWarnings("deprecation") + @Override + public void onProjectileHit(Level level, @NotNull BlockState state, @NotNull BlockHitResult hitResult, + @NotNull Projectile projectile) { + + if (level.isClientSide) { + level.addParticle(DeferredRegistryHandler.SAND_CLOUD_PARTICLE.get(), + projectile.getX(), projectile.getY(), projectile.getZ(), + GeneralUtilities.getRandomNumber(-0.01d, 0.01d), + GeneralUtilities.getRandomNumber(-0.01d, 0.01d), + GeneralUtilities.getRandomNumber(-0.01d, 0.01d)); + } + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/SpotlightBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/SpotlightBlock.java index 1c8ff2a88..11393c3f4 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/SpotlightBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/SpotlightBlock.java @@ -4,14 +4,8 @@ import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -20,12 +14,15 @@ import net.minecraft.world.level.material.Fluids; import org.jetbrains.annotations.NotNull; -import java.util.Random; +import java.util.*; public class SpotlightBlock extends HorizontalDirectionalBlock implements SimpleWaterloggedBlock { public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; private static final BooleanProperty LIT = BlockStateProperties.LIT; + private static final List lightPositions = new ArrayList<>(8); + private static final BlockState airState = Blocks.AIR.defaultBlockState(); + private static final BlockState lightState = Blocks.LIGHT.defaultBlockState(); /** * Constructor for SpotlightBlock. @@ -34,7 +31,8 @@ public class SpotlightBlock extends HorizontalDirectionalBlock implements Simple */ public SpotlightBlock(Properties properties) { super(properties); - registerDefaultState(stateDefinition.any().setValue(WATERLOGGED, false).setValue(FACING, Direction.NORTH).setValue(LIT, false)); + registerDefaultState(stateDefinition.any().setValue(WATERLOGGED, false).setValue(FACING, Direction.NORTH) + .setValue(LIT, false)); } /** @@ -51,7 +49,7 @@ public void createBlockStateDefinition(StateDefinition.BuilderBlockState of the block - * @param reader the IWorldReader for the block + * @param reader the LevelReader for the block * @param pos the BlocKPos the block is at * @return boolean */ @@ -59,34 +57,39 @@ public void createBlockStateDefinition(StateDefinition.BuilderBlockState of the block - * @param facing the Direction the block is facing - * @param facingState the BlockState of the facing block - * @param worldIn the IWorld the block is in - * @param currentPos the BlockPos the block is at - * @param facingPos the BlocKPos the facing block is at + * @param stateIn the BlockState of the block + * @param facing the Direction the block is facing + * @param facingState the BlockState of the facing block + * @param levelAccessor the LevelAccessor the block is in + * @param currentPos the BlockPos the block is at + * @param facingPos the BlocKPos the facing block is at * @return BlockState */ @SuppressWarnings("deprecation") @Override - public @NotNull BlockState updateShape(BlockState stateIn, @NotNull Direction facing, @NotNull BlockState facingState, @NotNull LevelAccessor worldIn, @NotNull BlockPos currentPos, @NotNull BlockPos facingPos) { + public @NotNull BlockState updateShape(BlockState stateIn, @NotNull Direction facing, @NotNull BlockState facingState, + @NotNull LevelAccessor levelAccessor, @NotNull BlockPos currentPos, @NotNull BlockPos facingPos) { + if (stateIn.getValue(WATERLOGGED)) { - worldIn.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(worldIn)); + levelAccessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(levelAccessor)); } - return facing.getOpposite() == stateIn.getValue(FACING) && !stateIn.canSurvive(worldIn, currentPos) ? Blocks.AIR.defaultBlockState() : stateIn; + return facing.getOpposite() == stateIn.getValue(FACING) && !stateIn.canSurvive(levelAccessor, currentPos) + ? Blocks.AIR.defaultBlockState() : stateIn; } @Override public BlockState getStateForPlacement(BlockPlaceContext context) { - return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()).setValue(LIT, false).setValue(WATERLOGGED, context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()) + .setValue(LIT, false) + .setValue(WATERLOGGED, context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); } /** @@ -106,7 +109,7 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { * Runs when neighboring blocks change state. * * @param state the BlockState of the block - * @param worldIn the World the block is in + * @param level the Level the block is in * @param pos the BlockPos the block is at * @param blockIn the Block that is changing * @param fromPos the BlockPos of the changing block @@ -114,14 +117,17 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @SuppressWarnings("deprecation") @Override - public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull BlockPos pos, @NotNull Block blockIn, @NotNull BlockPos fromPos, boolean isMoving) { - if (!worldIn.isClientSide) { - boolean flag = state.getValue(LIT); - if (flag != worldIn.hasNeighborSignal(pos)) { - if (flag) { - worldIn.scheduleTick(pos, this, 1); + public void neighborChanged(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Block blockIn, + @NotNull BlockPos fromPos, boolean isMoving) { + + if (!level.isClientSide) { + boolean isLit = state.getValue(LIT); + if (isLit != level.hasNeighborSignal(pos)) { + if (isLit) { + level.scheduleTick(pos, this, 1); } else { - worldIn.setBlock(pos, state.cycle(LIT), 3); + stateToggled(pos, level, state, state.getValue(LIT)); + level.setBlock(pos, state.cycle(LIT), 3); } } } @@ -131,17 +137,18 @@ public void neighborChanged(@NotNull BlockState state, Level worldIn, @NotNull B * Runs when neighboring blocks change state. * * @param state the BlockState of the block - * @param worldIn the World the block is in + * @param level the Level the block is in * @param pos the BlockPos the block is at * @param oldState the BlockState the block previously had * @param isMoving determines if the block is moving */ @SuppressWarnings("deprecation") @Override - public void onPlace(BlockState state, @NotNull Level worldIn, @NotNull BlockPos pos, BlockState oldState, boolean isMoving) { + public void onPlace(BlockState state, @NotNull Level level, @NotNull BlockPos pos, BlockState oldState, boolean isMoving) { if (!oldState.is(state.getBlock())) { - if (worldIn.hasNeighborSignal(pos)) { - worldIn.setBlock(pos, state.setValue(LIT, true), 3); + if (level.hasNeighborSignal(pos)) { + stateToggled(pos, level, state, false); + level.setBlock(pos, state.setValue(LIT, true), 3); } } } @@ -149,24 +156,59 @@ public void onPlace(BlockState state, @NotNull Level worldIn, @NotNull BlockPos /** * Runs once every tick * - * @param state the BlockState of the block - * @param worldIn the ServerWorld of the block - * @param pos the BlockPos the block is at - * @param rand a Random instance + * @param state the BlockState of the block + * @param serverLevel the ServerLevel of the block + * @param pos the BlockPos the block is at + * @param rand a Random instance */ @SuppressWarnings("deprecation") @Override - public void tick(BlockState state, @NotNull ServerLevel worldIn, @NotNull BlockPos pos, @NotNull Random rand) { - if (state.getValue(LIT) && !worldIn.hasNeighborSignal(pos)) { - worldIn.setBlock(pos, state.setValue(LIT, false), 3); + public void tick(BlockState state, @NotNull ServerLevel serverLevel, @NotNull BlockPos pos, @NotNull Random rand) { + if (state.getValue(LIT) && !serverLevel.hasNeighborSignal(pos)) { + stateToggled(pos, serverLevel, state, true); + serverLevel.setBlock(pos, state.setValue(LIT, false), 3); + } + } + + private void stateToggled(BlockPos pos, Level level, BlockState state, boolean lit) { + // Start building a list of light positions in front of the block + if (!level.isClientSide) { + Direction facing = state.getValue(FACING); + BlockPos orientedPos = pos.relative(facing); + lightPositions.add(orientedPos.below()); + lightPositions.add(orientedPos.below().relative(facing)); + lightPositions.add(orientedPos.below(2).relative(facing, 2)); + lightPositions.add(orientedPos.below(2).relative(facing, 3)); + lightPositions.add(orientedPos.below(3).relative(facing, 4)); + lightPositions.add(orientedPos.below(3).relative(facing, 5)); + lightPositions.add(orientedPos.below(4).relative(facing, 6)); + lightPositions.add(orientedPos.below(4).relative(facing, 7)); + + int iteration = 0; + for (BlockPos position : lightPositions) { + if (!lit && level.getBlockState(position) == airState) { + level.setBlockAndUpdate(position, lightState.setValue(LightBlock.LEVEL, 15 - iteration)); + } + if (lit && level.getBlockState(position).getBlock() == Blocks.LIGHT) { + level.setBlockAndUpdate(position, airState); + } + iteration++; + } + lightPositions.clear(); } } + @Override + public void destroy(@NotNull LevelAccessor pLevel, @NotNull BlockPos pPos, @NotNull BlockState pState) { + super.destroy(pLevel, pPos, pState); + stateToggled(pPos, (Level) pLevel, pState, true); + } + /** * Get the light value of the block. * * @param state the BlockState of the block - * @param reader the IBlockReader of the block + * @param reader the BlockGetter of the block * @param pos the BlockPos the block is at * @return int */ diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/DriedMudBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/DriedMudBlock.java index 9668ba25e..239321b5e 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/DriedMudBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/DriedMudBlock.java @@ -18,6 +18,7 @@ public DriedMudBlock(Properties properties) { super(properties); } + @SuppressWarnings("deprecation") @Override public void randomTick(@NotNull BlockState pState, ServerLevel pLevel, @NotNull BlockPos pPos, @NotNull Random pRandom) { if (pLevel.isRainingAt(pPos)) { diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/HardenedMudWindowBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/HardenedMudWindowBlock.java index eb7753941..558cad110 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/HardenedMudWindowBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/HardenedMudWindowBlock.java @@ -4,20 +4,14 @@ import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraft.world.phys.shapes.*; import org.jetbrains.annotations.NotNull; public class HardenedMudWindowBlock extends HorizontalDirectionalBlock implements SimpleWaterloggedBlock { @@ -38,6 +32,7 @@ public HardenedMudWindowBlock(Properties properties) { registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(WATERLOGGED, false)); } + @SuppressWarnings("deprecation") @Override public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { if (state.getValue(FACING) == Direction.NORTH || state.getValue(FACING) == Direction.SOUTH) { @@ -57,12 +52,13 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { return defaultBlockState().setValue(FACING, context.getHorizontalDirection()); } + @SuppressWarnings("deprecation") @Override - @OnlyIn(Dist.CLIENT) public float getShadeBrightness(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos) { return 1.0F; } + @SuppressWarnings("deprecation") @Override public @NotNull FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/MudBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/MudBlock.java index d23b090cb..de426532a 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/MudBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/base/mud/MudBlock.java @@ -18,6 +18,7 @@ public MudBlock(Properties properties) { super(properties); } + @SuppressWarnings("deprecation") @Override public void randomTick(@NotNull BlockState pState, ServerLevel pLevel, @NotNull BlockPos pPos, @NotNull Random pRandom) { if (pLevel.isRainingAt(pPos)) { 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 439654766..410f79047 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/AzulStainedOrchidBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/AzulStainedOrchidBlock.java @@ -1,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.block.decoration; import com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior.WarriorStatueTorso; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import com.anonymoushacker1279.immersiveweapons.world.TiltrosTeleporter; @@ -35,9 +35,10 @@ public AzulStainedOrchidBlock(MobEffect mobEffect, int effectDuration, Propertie return OffsetType.NONE; } + @SuppressWarnings("deprecation") @Override public void entityInside(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull Entity entity) { - if (ServerConfig.TILTROS_ENABLED.get()) { + if (CommonConfig.TILTROS_ENABLED.get()) { entity.playSound(SoundEvents.ENDERMAN_AMBIENT, 0.05f, 0.075f); if (!entity.isPassenger() && !entity.isVehicle() && entity.canChangeDimensions() && teleportDelay <= 0) { teleportDelay = 80; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/BiohazardBoxBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/BiohazardBoxBlock.java index ba73e2c6d..584eee085 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/BiohazardBoxBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/BiohazardBoxBlock.java @@ -4,9 +4,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -39,14 +37,16 @@ public BiohazardBoxBlock(Properties properties) { * Set the shape of the block. * * @param state the BlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param collisionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext collisionContext) { + return switch (state.getValue(FACING)) { case SOUTH -> SHAPE_SOUTH; case EAST -> SHAPE_EAST; @@ -58,7 +58,7 @@ public BiohazardBoxBlock(Properties properties) { /** * Create the BlockState definition. * - * @param builder the StateContainer.Builder of the block + * @param builder the StateDefinition.Builder of the block */ @Override public void createBlockStateDefinition(StateDefinition.Builder builder) { @@ -69,7 +69,7 @@ public void createBlockStateDefinition(StateDefinition.BuilderBlockItemUseContext during placement + * @param context the BlockPlaceContext during placement * @return BlockState */ @Override diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/BranchBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/BranchBlock.java index 3061a17ea..116d4e6aa 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/BranchBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/BranchBlock.java @@ -1,12 +1,10 @@ package com.anonymoushacker1279.immersiveweapons.block.decoration; import com.anonymoushacker1279.immersiveweapons.block.core.BasicOrientableBlock; -import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.data.tags.groups.immersiveweapons.ImmersiveWeaponsBlockTagGroups; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -34,14 +32,16 @@ public BranchBlock(Properties properties) { * Set the shape of the block. * * @param state the BlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param collisionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext collisionContext) { + return switch (state.getValue(FACING)) { case SOUTH -> SHAPE_SOUTH; case EAST -> SHAPE_EAST; @@ -62,23 +62,26 @@ public BranchBlock(Properties properties) { @Override public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { BlockState blockstate = reader.getBlockState(pos.relative(state.getValue(FACING))); - return blockstate.is(DeferredRegistryHandler.BURNED_OAK_LOG.get()); + return blockstate.is(ImmersiveWeaponsBlockTagGroups.BURNED_OAK_LOGS); } /** * Update the block's shape. * - * @param state the new BlockState of the block - * @param direction the Direction the block is facing - * @param state1 the old BlockState of the block - * @param accessor the LevelAccessor for the block - * @param pos the new BlockPos the block is at - * @param pos1 the old BlockPos the block was at + * @param state the new BlockState of the block + * @param direction the Direction the block is facing + * @param neighborState the neighbor BlockState of the block + * @param level the LevelAccessor for the block + * @param pos the new BlockPos the block is at + * @param neighborPos the old BlockPos the block was at * @return BlockState */ @SuppressWarnings("deprecation") @Override - public @NotNull BlockState updateShape(BlockState state, @NotNull Direction direction, @NotNull BlockState state1, @NotNull LevelAccessor accessor, @NotNull BlockPos pos, @NotNull BlockPos pos1) { - return direction == state.getValue(FACING) && !state.canSurvive(accessor, pos) ? Blocks.AIR.defaultBlockState() : super.updateShape(state, direction, state1, accessor, pos, pos1); + public @NotNull BlockState updateShape(BlockState state, @NotNull Direction direction, @NotNull BlockState neighborState, + @NotNull LevelAccessor level, @NotNull BlockPos pos, @NotNull BlockPos neighborPos) { + + return direction == state.getValue(FACING) && !state.canSurvive(level, pos) ? Blocks.AIR.defaultBlockState() + : super.updateShape(state, direction, neighborState, level, pos, neighborPos); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/FlagBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/FlagBlock.java index 4871f5ded..7214c4e4d 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/FlagBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/FlagBlock.java @@ -4,27 +4,21 @@ import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraft.world.phys.shapes.*; import org.jetbrains.annotations.NotNull; public class FlagBlock extends HorizontalDirectionalBlock implements SimpleWaterloggedBlock { public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - private static final VoxelShape SHAPE_POLE = Shapes.or(Block.box(7.0D, 0.0D, 7.0D, 9.0D, 14.0D, 9.0D), Block.box(6.0D, 14.0D, 6.0D, 10.0D, 16.0D, 10.0D)); + private static final VoxelShape SHAPE_POLE = Shapes.or(Block.box(7.0D, 0.0D, 7.0D, 9.0D, 14.0D, 9.0D), + Block.box(6.0D, 14.0D, 6.0D, 10.0D, 16.0D, 10.0D)); /** * Constructor for FlagBlock. @@ -39,7 +33,7 @@ public FlagBlock(Properties properties) { /** * Create the BlockState definition. * - * @param builder the StateContainer.Builder of the block + * @param builder the StateDefinition.Builder of the block */ @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { @@ -50,12 +44,13 @@ protected void createBlockStateDefinition(StateDefinition.BuilderBlockItemUseContext during placement + * @param context the BlockPlaceContext during placement * @return BlockState */ @Override public BlockState getStateForPlacement(BlockPlaceContext context) { BlockState blockStateBelow = context.getLevel().getBlockState(context.getClickedPos().below()); + if (blockStateBelow.getBlock() instanceof FlagPoleBlock || blockStateBelow.getBlock() instanceof FlagBlock) { return defaultBlockState().setValue(FACING, context.getHorizontalDirection()); } else { @@ -67,14 +62,16 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { * Set the shape of the block. * * @param state the BlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param collisionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext collisionContext) { + return SHAPE_POLE; } @@ -82,17 +79,17 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { * Set the shading brightness on the client. * * @param state the BlockState of the block - * @param reader the IBlockReader of the block + * @param reader the BlockGetter of the block * @param pos the BlockPos the block is at * @return float */ @SuppressWarnings("deprecation") @Override - @OnlyIn(Dist.CLIENT) public float getShadeBrightness(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos) { return 1.0F; } + @SuppressWarnings("deprecation") @Override public @NotNull FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/FlagPoleBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/FlagPoleBlock.java index 48a38245c..b5fd7f46f 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/FlagPoleBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/FlagPoleBlock.java @@ -11,10 +11,7 @@ import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.phys.Vec3; -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 FlagPoleBlock extends Block implements SimpleWaterloggedBlock { @@ -37,7 +34,7 @@ public FlagPoleBlock(Properties properties) { /** * Create the BlockState definition. * - * @param builder the StateContainer.Builder of the block + * @param builder the StateDefinition.Builder of the block */ @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { @@ -48,7 +45,7 @@ protected void createBlockStateDefinition(StateDefinition.BuilderBlockItemUseContext during placement + * @param context the BlockPlaceContext during placement * @return BlockState */ @Override @@ -65,22 +62,24 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { * Set the shape of the block. * * @param state the BlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param collisionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { - Vec3 vector3d = state.getOffset(reader, pos); + public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext collisionContext) { + if (state.getValue(IS_BASE)) { - return SHAPE_BASE.move(vector3d.x, vector3d.y, vector3d.z); + return SHAPE_BASE; } else { - return SHAPE_POLE.move(vector3d.x, vector3d.y, vector3d.z); + return SHAPE_POLE; } } + @SuppressWarnings("deprecation") @Override public @NotNull FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/WoodenTableBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/WoodenTableBlock.java index 778dcb816..dd8e01d56 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/WoodenTableBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/decoration/WoodenTableBlock.java @@ -10,14 +10,13 @@ import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; -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 WoodenTableBlock extends Block implements SimpleWaterloggedBlock { - public static final VoxelShape SHAPE = Shapes.or(Block.box(0.0D, 14.0D, 0.0D, 16.0D, 16.0D, 16.0D), Block.box(7.0D, 0.0D, 7.0D, 9.0D, 14.0D, 9.0D)); + public static final VoxelShape SHAPE = Shapes.or(Block.box(0.0D, 14.0D, 0.0D, 16.0D, 16.0D, 16.0D), + Block.box(7.0D, 0.0D, 7.0D, 9.0D, 14.0D, 9.0D)); public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; /** @@ -27,13 +26,14 @@ public class WoodenTableBlock extends Block implements SimpleWaterloggedBlock { */ public WoodenTableBlock(Properties properties) { super(properties); - registerDefaultState(stateDefinition.any().setValue(WATERLOGGED, false)); + registerDefaultState(stateDefinition.any() + .setValue(WATERLOGGED, false)); } /** * Create the BlockState definition. * - * @param builder the StateContainer.Builder of the block + * @param builder the StateDefinition.Builder of the block */ @Override public void createBlockStateDefinition(StateDefinition.Builder builder) { @@ -57,14 +57,16 @@ public void createBlockStateDefinition(StateDefinition.BuilderBlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param collisionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext collisionContext) { + return SHAPE; } } \ 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/portal/statue/warrior/WarriorStatueBase.java index a3284ed26..10614f138 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueBase.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueBase.java @@ -4,9 +4,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -15,8 +13,6 @@ import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; public class WarriorStatueBase extends HorizontalDirectionalBlock implements SimpleWaterloggedBlock { @@ -86,11 +82,11 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @SuppressWarnings("deprecation") @Override - @OnlyIn(Dist.CLIENT) public float getShadeBrightness(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos) { return 1.0F; } + @SuppressWarnings("deprecation") @Override public @NotNull FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); 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/portal/statue/warrior/WarriorStatueHead.java index 0a0b93d08..ea6390485 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueHead.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueHead.java @@ -10,10 +10,7 @@ import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -22,8 +19,6 @@ import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; public class WarriorStatueHead extends HorizontalDirectionalBlock implements SimpleWaterloggedBlock { @@ -97,11 +92,11 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @SuppressWarnings("deprecation") @Override - @OnlyIn(Dist.CLIENT) public float getShadeBrightness(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos) { return 1.0F; } + @SuppressWarnings("deprecation") @Override public @NotNull FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); 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/portal/statue/warrior/WarriorStatueTorso.java index 824008127..b9586f32b 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueTorso.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/misc/portal/statue/warrior/WarriorStatueTorso.java @@ -1,8 +1,8 @@ package com.anonymoushacker1279.immersiveweapons.block.misc.portal.statue.warrior; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -29,7 +29,6 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent.Context; @@ -109,11 +108,11 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { */ @SuppressWarnings("deprecation") @Override - @OnlyIn(Dist.CLIENT) public float getShadeBrightness(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos) { return 1.0F; } + @SuppressWarnings("deprecation") @Override public @NotNull FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); @@ -248,7 +247,6 @@ public static void handle(WarriorStatueTorsoPacketHandler msg, Supplier * * @param msg the WarriorStatueTorsoPacketHandler message being sent */ - @OnlyIn(Dist.CLIENT) private static void handleOnClient(WarriorStatueTorsoPacketHandler msg) { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.level != null) { diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomWoodTypes.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/properties/WoodTypes.java similarity index 77% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomWoodTypes.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/block/properties/WoodTypes.java index 3d3ca3a7f..ac80343c5 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomWoodTypes.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/properties/WoodTypes.java @@ -1,10 +1,10 @@ -package com.anonymoushacker1279.immersiveweapons.util; +package com.anonymoushacker1279.immersiveweapons.block.properties; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.properties.WoodType; -public class CustomWoodTypes { +public class WoodTypes { public static final WoodType BURNED_OAK = WoodType.create(new ResourceLocation(ImmersiveWeapons.MOD_ID, "burned_oak").toString()); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/LandmineBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/LandmineBlock.java index c0da22940..5eea0c12d 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/LandmineBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/LandmineBlock.java @@ -7,30 +7,20 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Explosion; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.RenderShape; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.*; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.BlockHitResult; -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; import javax.annotation.Nullable; @@ -98,12 +88,14 @@ private static void explode(Level worldIn, BlockPos pos, @Nullable LivingEntity if (!player.isCreative()) { currentlyHeldItem.shrink(1); } + return InteractionResult.CONSUME; } if (!state.getValue(SAND) && !state.getValue(VINES) && currentlyHeldItem.getItem() == Items.SAND) { worldIn.setBlock(pos, state.setValue(SAND, true), 3); if (!player.isCreative()) { currentlyHeldItem.shrink(1); } + return InteractionResult.CONSUME; } } return InteractionResult.PASS; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/PitfallBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/PitfallBlock.java index 300601afd..0302e9281 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/PitfallBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/PitfallBlock.java @@ -4,16 +4,11 @@ import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; 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 PitfallBlock extends Block { @@ -33,14 +28,16 @@ public PitfallBlock(Properties properties) { * Set the shape of the block. * * @param state the BlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param collisionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext collisionContext) { + return SHAPE; } @@ -48,39 +45,45 @@ public PitfallBlock(Properties properties) { * Get the collision shape of the block. * * @param state the BlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param collisionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getCollisionShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getCollisionShape(@NotNull BlockState state, @NotNull BlockGetter reader, + @NotNull BlockPos pos, @NotNull CollisionContext collisionContext) { + return Shapes.empty(); } /** * Updates the block when required. * - * @param stateIn the BlockState of the block - * @param facing the Direction the block is facing - * @param facingState the BlockState of the facing block - * @param worldIn the IWorld the block is in - * @param currentPos the BlockPos the block is at - * @param facingPos the BlocKPos the facing block is at + * @param stateIn the BlockState of the block + * @param facing the Direction the block is facing + * @param facingState the BlockState of the facing block + * @param levelAccessor the LevelAccessor the block is in + * @param currentPos the BlockPos the block is at + * @param facingPos the BlocKPos the facing block is at * @return BlockState */ @SuppressWarnings("deprecation") @Override - public @NotNull BlockState updateShape(BlockState stateIn, @NotNull Direction facing, @NotNull BlockState facingState, @NotNull LevelAccessor worldIn, @NotNull BlockPos currentPos, @NotNull BlockPos facingPos) { - return !stateIn.canSurvive(worldIn, currentPos) ? Blocks.AIR.defaultBlockState() : super.updateShape(stateIn, facing, facingState, worldIn, currentPos, facingPos); + public @NotNull BlockState updateShape(BlockState stateIn, @NotNull Direction facing, @NotNull BlockState facingState, + @NotNull LevelAccessor levelAccessor, @NotNull BlockPos currentPos, + @NotNull BlockPos facingPos) { + + return !stateIn.canSurvive(levelAccessor, currentPos) ? Blocks.AIR.defaultBlockState() + : super.updateShape(stateIn, facing, facingState, levelAccessor, currentPos, facingPos); } /** * Determines if the block can exist in a given state. * * @param state the BlockState of the block - * @param reader the IWorldReader for the block + * @param reader the LevelReader for the block * @param pos the BlocKPos the block is at * @return boolean */ @@ -88,17 +91,18 @@ public PitfallBlock(Properties properties) { @Override public boolean canSurvive(@NotNull BlockState state, @NotNull LevelReader reader, @NotNull BlockPos pos) { for (Direction facing : new Direction[]{Direction.EAST, Direction.WEST, Direction.SOUTH, Direction.NORTH}) { - BlockPos posOff = pos.relative(facing); - BlockState blockstate = reader.getBlockState(posOff); - if (Block.canSupportCenter(reader, posOff, facing.getOpposite()) || blockstate.getBlock() == this) + + BlockPos relativePosition = pos.relative(facing); + BlockState blockstate = reader.getBlockState(relativePosition); + if (Block.canSupportCenter(reader, relativePosition, facing.getOpposite()) || blockstate.getBlock() == this) { return true; + } } return false; } /** * Runs when an entity is inside the block's collision area. - * Allows the block to deal damage on contact. * * @param state the BlockState of the block * @param level the Level the block is in diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/PunjiSticksBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/PunjiSticksBlock.java index c0d736391..7277edd52 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/PunjiSticksBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/PunjiSticksBlock.java @@ -1,5 +1,6 @@ package com.anonymoushacker1279.immersiveweapons.block.trap; +import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffectInstance; @@ -26,7 +27,8 @@ public class PunjiSticksBlock extends Block implements SimpleWaterloggedBlock { public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 1.0D, 16.0D); - private final DamageSource damageSource = new DamageSource("immersiveweapons.punji_sticks"); + private final DamageSource fallDamageSource = new DamageSource("immersiveweapons.punji_sticks").bypassArmor(); + private final DamageSource normalDamageSource = new DamageSource("immersiveweapons.punji_sticks"); /** * Constructor for PunjiSticksBlock. @@ -101,13 +103,18 @@ protected void createBlockStateDefinition(StateDefinition.Builder= 5F) { - livingEntity.hurt(damageSource, livingEntity.fallDistance >= 10F ? livingEntity.fallDistance + 20F * 0.5f : 20F); + if (livingEntity.fallDistance >= 2.5f) { + int featherFallingLevel = GeneralUtilities.getFeatherFallingLevel(livingEntity); + float damage = (livingEntity.fallDistance + 10f) * + (1.25f - (featherFallingLevel <= 4 ? featherFallingLevel * 0.25f : 1.0f)); + livingEntity.hurt(fallDamageSource, damage); } else { - float damageTodo = (float) livingEntity.getDeltaMovement().dot(new Vec3(1, 1, 1)) / 1.5F; - livingEntity.hurt(damageSource, 2F + damageTodo); + float damage = (float) (livingEntity.getDeltaMovement().dot(new Vec3(1, 1, 1)) / 1.5f) + 2.0f; + livingEntity.hurt(normalDamageSource, damage); } - (livingEntity).addEffect(new MobEffectInstance(MobEffects.POISON, 60, 0, false, false)); + (livingEntity).addEffect(new MobEffectInstance(MobEffects.POISON, 60, 0, false, true)); + + livingEntity.makeStuckInBlock(state, new Vec3(0.85F, 0.80D, 0.85F)); } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/SpikeTrapBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/SpikeTrapBlock.java index d4cded705..b9963e7ee 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/SpikeTrapBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/SpikeTrapBlock.java @@ -1,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.block.trap; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -12,13 +12,8 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/WoodenSpikesBlock.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/WoodenSpikesBlock.java index db15df907..596ce4490 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/WoodenSpikesBlock.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/block/trap/WoodenSpikesBlock.java @@ -1,15 +1,17 @@ package com.anonymoushacker1279.immersiveweapons.block.trap; +import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -46,7 +48,9 @@ public WoodenSpikesBlock(Properties properties) { */ @Override public BlockState getStateForPlacement(BlockPlaceContext context) { - return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()).setValue(WATERLOGGED, context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); + return defaultBlockState() + .setValue(FACING, context.getHorizontalDirection().getOpposite()) + .setValue(WATERLOGGED, context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); } /** @@ -76,14 +80,16 @@ protected void createBlockStateDefinition(StateDefinition.BuilderBlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at - * @param selectionContext the ISelectionContext of the block + * @param selectionContext the CollisionContext of the block * @return VoxelShape */ @SuppressWarnings("deprecation") @Override - public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, @NotNull CollisionContext selectionContext) { + public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter reader, @NotNull BlockPos pos, + @NotNull CollisionContext selectionContext) { + return SHAPE; } @@ -91,7 +97,7 @@ protected void createBlockStateDefinition(StateDefinition.BuilderBlockState of the block - * @param reader the IBlockReader for the block + * @param reader the BlockGetter for the block * @param pos the BlockPos the block is at * @return boolean */ @@ -115,10 +121,19 @@ public void entityInside(@NotNull BlockState state, @NotNull Level level, @NotNu if (entity instanceof LivingEntity) { entity.makeStuckInBlock(state, new Vec3(0.85F, 0.80D, 0.85F)); if (!level.isClientSide && (entity.xOld != entity.getX() || entity.zOld != entity.getZ())) { - double d0 = Math.abs(entity.getX() - entity.xOld); - double d1 = Math.abs(entity.getZ() - entity.zOld); - if (d0 >= (double) 0.003F || d1 >= (double) 0.003F) { + double deltaX = Math.abs(entity.getX() - entity.xOld); + double deltaZ = Math.abs(entity.getZ() - entity.zOld); + if (deltaX >= (double) 0.003F || deltaZ >= (double) 0.003F) { entity.hurt(damageSource, 1.5F); + + if (entity instanceof Player player && player.isCreative()) { + return; + } + + if (GeneralUtilities.getRandomNumber(0.0f, 1.0f) <= 0.15f) { + ((LivingEntity) entity).addEffect(new MobEffectInstance(DeferredRegistryHandler.BLEEDING_EFFECT.get(), + 200, 0, true, false)); + } } } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/AbstractTeslaSynthesizerBlockEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/AbstractTeslaSynthesizerBlockEntity.java index 0b06cf8d8..8dcbf91c8 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/AbstractTeslaSynthesizerBlockEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/AbstractTeslaSynthesizerBlockEntity.java @@ -81,7 +81,7 @@ public int getCount() { }; /** - * Constructor for AbstractTeslaTileEntity. + * Constructor for AbstractTeslaBlockEntity. */ AbstractTeslaSynthesizerBlockEntity(BlockPos blockPos, BlockState blockState) { super(DeferredRegistryHandler.TESLA_SYNTHESIZER_BLOCK_ENTITY.get(), blockPos, blockState); @@ -148,54 +148,58 @@ public static boolean isFuel(ItemStack stack) { /** * Runs once per tick. Handle smelting procedures here. */ - public static void serverTick(Level level, AbstractTeslaSynthesizerBlockEntity abstractTeslaSynthesizerTileEntity) { - boolean flag = abstractTeslaSynthesizerTileEntity.isBurning(); - boolean flag1 = false; - if (abstractTeslaSynthesizerTileEntity.isBurning()) { - --abstractTeslaSynthesizerTileEntity.burnTime; + public static void serverTick(Level level, AbstractTeslaSynthesizerBlockEntity blockEntity) { + boolean isBurning = blockEntity.isBurning(); + boolean hasChanged = false; + if (blockEntity.isBurning()) { + --blockEntity.burnTime; } - ItemStack itemstack = abstractTeslaSynthesizerTileEntity.items.get(3); - if (abstractTeslaSynthesizerTileEntity.isBurning() || !itemstack.isEmpty() && !abstractTeslaSynthesizerTileEntity.items.get(0).isEmpty() && !abstractTeslaSynthesizerTileEntity.items.get(1).isEmpty() && !abstractTeslaSynthesizerTileEntity.items.get(2).isEmpty()) { + ItemStack fuel = blockEntity.items.get(3); + if (blockEntity.isBurning() || !fuel.isEmpty() && !blockEntity.items.get(0).isEmpty() + && !blockEntity.items.get(1).isEmpty() && !blockEntity.items.get(2).isEmpty()) { + RecipeManager recipeManager = level.getRecipeManager(); - Recipe iRecipe = recipeManager.getRecipeFor(ICustomRecipeType.TESLA_SYNTHESIZER, abstractTeslaSynthesizerTileEntity, level).orElse(null); - if (!abstractTeslaSynthesizerTileEntity.isBurning() && abstractTeslaSynthesizerTileEntity.canSmelt(iRecipe)) { - abstractTeslaSynthesizerTileEntity.burnTime = getBurnTime(itemstack); - abstractTeslaSynthesizerTileEntity.burnTimeTotal = abstractTeslaSynthesizerTileEntity.burnTime; - if (abstractTeslaSynthesizerTileEntity.isBurning()) { - flag1 = true; - if (itemstack.hasContainerItem()) - abstractTeslaSynthesizerTileEntity.items.set(3, itemstack.getContainerItem()); - else if (!itemstack.isEmpty()) { - itemstack.shrink(1); - if (itemstack.isEmpty()) { - abstractTeslaSynthesizerTileEntity.items.set(3, itemstack.getContainerItem()); + Recipe synthesizerRecipe = recipeManager.getRecipeFor(ICustomRecipeType.TESLA_SYNTHESIZER, blockEntity, level) + .orElse(null); + + if (!blockEntity.isBurning() && blockEntity.canSmelt(synthesizerRecipe)) { + blockEntity.burnTime = getBurnTime(fuel); + blockEntity.burnTimeTotal = blockEntity.burnTime; + if (blockEntity.isBurning()) { + hasChanged = true; + if (fuel.hasContainerItem()) + blockEntity.items.set(3, fuel.getContainerItem()); + else if (!fuel.isEmpty()) { + fuel.shrink(1); + if (fuel.isEmpty()) { + blockEntity.items.set(3, fuel.getContainerItem()); } } } } - if (abstractTeslaSynthesizerTileEntity.isBurning() && abstractTeslaSynthesizerTileEntity.canSmelt(iRecipe)) { - ++abstractTeslaSynthesizerTileEntity.cookTime; - if (abstractTeslaSynthesizerTileEntity.cookTime == abstractTeslaSynthesizerTileEntity.cookTimeTotal) { - abstractTeslaSynthesizerTileEntity.cookTime = 0; - abstractTeslaSynthesizerTileEntity.cookTimeTotal = abstractTeslaSynthesizerTileEntity.getCookTime(); - abstractTeslaSynthesizerTileEntity.smelt(iRecipe); - flag1 = true; + if (blockEntity.isBurning() && blockEntity.canSmelt(synthesizerRecipe)) { + ++blockEntity.cookTime; + if (blockEntity.cookTime == blockEntity.cookTimeTotal) { + blockEntity.cookTime = 0; + blockEntity.cookTimeTotal = blockEntity.getCookTime(); + blockEntity.smelt(synthesizerRecipe); + hasChanged = true; } } else { - abstractTeslaSynthesizerTileEntity.cookTime = 0; + blockEntity.cookTime = 0; } - } else if (!abstractTeslaSynthesizerTileEntity.isBurning() && abstractTeslaSynthesizerTileEntity.cookTime > 0) { - abstractTeslaSynthesizerTileEntity.cookTime = Mth.clamp(abstractTeslaSynthesizerTileEntity.cookTime - 2, 0, abstractTeslaSynthesizerTileEntity.cookTimeTotal); + } else if (!blockEntity.isBurning() && blockEntity.cookTime > 0) { + blockEntity.cookTime = Mth.clamp(blockEntity.cookTime - 2, 0, blockEntity.cookTimeTotal); } - if (flag != abstractTeslaSynthesizerTileEntity.isBurning()) { - flag1 = true; + if (isBurning != blockEntity.isBurning()) { + hasChanged = true; } - if (flag1) { - abstractTeslaSynthesizerTileEntity.setChanged(); + if (hasChanged) { + blockEntity.setChanged(); } } @@ -245,8 +249,8 @@ public void load(@NotNull CompoundTag nbt) { burnTimeTotal = getBurnTime(items.get(3)); CompoundTag compoundTag = nbt.getCompound("RecipesUsed"); - for (String s : compoundTag.getAllKeys()) { - recipes.put(new ResourceLocation(s), compoundTag.getInt(s)); + for (String string : compoundTag.getAllKeys()) { + recipes.put(new ResourceLocation(string), compoundTag.getInt(string)); } } @@ -276,19 +280,20 @@ protected void saveAdditional(@NotNull CompoundTag pTag) { */ private boolean canSmelt(@Nullable Recipe recipeIn) { if (!items.get(0).isEmpty() && !items.get(1).isEmpty() && !items.get(2).isEmpty() && recipeIn != null) { - ItemStack itemstack = recipeIn.getResultItem(); - if (itemstack.isEmpty()) { + ItemStack resultItem = recipeIn.getResultItem(); + if (resultItem.isEmpty()) { return false; } else { - ItemStack itemStack1 = items.get(4); - if (itemStack1.isEmpty()) { + ItemStack output = items.get(4); + if (output.isEmpty()) { return true; - } else if (!itemStack1.sameItem(itemstack)) { + } else if (!output.sameItem(resultItem)) { return false; - } else if (itemStack1.getCount() + itemstack.getCount() <= getMaxStackSize() && itemStack1.getCount() + itemstack.getCount() <= itemStack1.getMaxStackSize()) { // Forge fix: make furnace respect stack sizes in furnace recipes + } else if (output.getCount() + resultItem.getCount() <= getMaxStackSize() && output.getCount() + + resultItem.getCount() <= output.getMaxStackSize()) { return true; } else { - return itemStack1.getCount() + itemstack.getCount() <= itemstack.getMaxStackSize(); + return output.getCount() + resultItem.getCount() <= resultItem.getMaxStackSize(); } } } else { @@ -331,9 +336,11 @@ private void smelt(@Nullable Recipe recipe) { */ private int getCookTime() { if (level != null) { - Optional optional = level.getRecipeManager().getRecipeFor(ICustomRecipeType.TESLA_SYNTHESIZER, this, level); - if (optional.isPresent()) - return optional.get().getCookTime(); + Optional recipe = level.getRecipeManager() + .getRecipeFor(ICustomRecipeType.TESLA_SYNTHESIZER, this, level); + + if (recipe.isPresent()) + return recipe.get().getCookTime(); } return 0; } @@ -447,8 +454,8 @@ public boolean canTakeItemThroughFace(int index, @NotNull ItemStack itemStack, @ */ @Override public void setItem(int index, ItemStack stack) { - ItemStack itemstack = items.get(index); - boolean flag = !stack.isEmpty() && stack.sameItem(itemstack) && ItemStack.tagMatches(stack, itemstack); + ItemStack itemStack = items.get(index); + boolean flag = !stack.isEmpty() && stack.sameItem(itemStack) && ItemStack.tagMatches(stack, itemStack); items.set(index, stack); if (stack.getCount() > getMaxStackSize()) { stack.setCount(getMaxStackSize()); @@ -473,7 +480,9 @@ public boolean stillValid(@NotNull Player player) { if ((level != null ? level.getBlockEntity(worldPosition) : null) != this) { return false; } else { - return player.distanceToSqr((double) worldPosition.getX() + 0.5D, (double) worldPosition.getY() + 0.5D, (double) worldPosition.getZ() + 0.5D) <= 64.0D; + return player.distanceToSqr((double) worldPosition.getX() + 0.5D, + (double) worldPosition.getY() + 0.5D, + (double) worldPosition.getZ() + 0.5D) <= 64.0D; } } @@ -514,8 +523,8 @@ public Recipe getRecipeUsed() { @Override public void setRecipeUsed(@Nullable Recipe recipe) { if (recipe != null) { - ResourceLocation resourcelocation = recipe.getId(); - recipes.addTo(resourcelocation, 1); + ResourceLocation recipeId = recipe.getId(); + recipes.addTo(recipeId, 1); } } @@ -536,8 +545,8 @@ public void awardUsedRecipes(@NotNull Player player) { */ @Override public void fillStackedContents(@NotNull StackedContents helper) { - for (ItemStack itemstack : items) { - helper.accountStack(itemstack); + for (ItemStack itemStack : items) { + helper.accountStack(itemStack); } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MedicStatueBlockEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MedicStatueBlockEntity.java index 137522e06..055f58190 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MedicStatueBlockEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MedicStatueBlockEntity.java @@ -1,6 +1,6 @@ package com.anonymoushacker1279.immersiveweapons.blockentity; -import com.anonymoushacker1279.immersiveweapons.entity.passive.FieldMedicEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.FieldMedicEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MinutemanStatueBlockEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MinutemanStatueBlockEntity.java index 777f695ee..3899a8cd7 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MinutemanStatueBlockEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/MinutemanStatueBlockEntity.java @@ -1,6 +1,6 @@ package com.anonymoushacker1279.immersiveweapons.blockentity; -import com.anonymoushacker1279.immersiveweapons.entity.passive.MinutemanEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.MinutemanEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/PanicAlarmBlockEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/PanicAlarmBlockEntity.java index e7af0ac4b..4c2a9dece 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/PanicAlarmBlockEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/blockentity/PanicAlarmBlockEntity.java @@ -1,36 +1,24 @@ package com.anonymoushacker1279.immersiveweapons.blockentity; +import com.anonymoushacker1279.immersiveweapons.config.ClientConfig; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; -import net.minecraft.ChatFormatting; -import net.minecraft.Util; -import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.NetworkEvent.Context; -import net.minecraftforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.function.Supplier; public class PanicAlarmBlockEntity extends BlockEntity implements EntityBlock { private boolean isPowered = false; private int cooldown = 0; - private int currentlyPlayingSound = 1; /** * Constructor for PanicAlarmBlockEntity. @@ -40,27 +28,18 @@ public PanicAlarmBlockEntity(BlockPos blockPos, BlockState blockState) { } /** - * Runs once each tick. Handle scanning and spawning entities. + * Runs once each tick. Handle playing alarm sounds. */ - public static void serverTick(Level level, BlockPos blockPos, PanicAlarmBlockEntity panicAlarmBlockEntity) { - if (panicAlarmBlockEntity.cooldown > 0) { - panicAlarmBlockEntity.cooldown--; - } - - if (panicAlarmBlockEntity.isPowered && panicAlarmBlockEntity.cooldown == 0) { - PanicAlarmBlockEntity blockEntity = (PanicAlarmBlockEntity) level.getBlockEntity(blockPos); + public void tick(Level level, BlockPos blockPos) { - if (blockEntity != null) { - PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(blockPos)), new PanicAlarmPacketHandler(panicAlarmBlockEntity.currentlyPlayingSound, blockPos)); + if (isPowered && cooldown-- <= 0) { + for (ServerPlayer serverPlayer : ((ServerLevel) level).getPlayers(player -> player.blockPosition() + .distSqr(blockPos) <= Math.pow(ClientConfig.PANIC_ALARM_RANGE.get(), 2))) { - if (panicAlarmBlockEntity.currentlyPlayingSound == 1) { - blockEntity.setCooldown(60); - } else { - blockEntity.setCooldown(240); - } - - level.setBlockEntity(blockEntity); + serverPlayer.playNotifySound(DeferredRegistryHandler.PANIC_ALARM_SOUND.get(), SoundSource.BLOCKS, 1.0F, 1.0F); } + + setCooldown(40); } } @@ -88,42 +67,15 @@ public boolean isPowered() { /** * Set the power status. - * - * @param isPowered if the device should be powered - */ - public void setPowered(boolean isPowered) { - this.isPowered = isPowered; - } - - /** - * Set the cooldown. - * - * @param cooldown the cooldown time */ - private void setCooldown(int cooldown) { - this.cooldown = cooldown; + public void setPowered(boolean state) { + isPowered = state; + setChanged(); } - /** - * Handle changing of alarm sounds. - * - * @param activator the PlayerEntity interacting with the block entity - */ - public void changeAlarmSound(Player activator) { - if (currentlyPlayingSound == 1) { - currentlyPlayingSound++; - activator.sendMessage(new TranslatableComponent("immersiveweapons.block.alarm.alarm2").withStyle(ChatFormatting.YELLOW), Util.NIL_UUID); - } else if (currentlyPlayingSound == 2) { - currentlyPlayingSound++; - activator.sendMessage(new TranslatableComponent("immersiveweapons.block.alarm.alarm3").withStyle(ChatFormatting.YELLOW), Util.NIL_UUID); - } else if (currentlyPlayingSound == 3) { - // Reset back to zero - we're already at the last one - currentlyPlayingSound = 1; - activator.sendMessage(new TranslatableComponent("immersiveweapons.block.alarm.alarm1").withStyle(ChatFormatting.YELLOW), Util.NIL_UUID); - } else { - currentlyPlayingSound = 1; - activator.sendMessage(new TranslatableComponent("immersiveweapons.block.alarm.alarm1").withStyle(ChatFormatting.YELLOW), Util.NIL_UUID); - } + public void setCooldown(int delay) { + cooldown = delay; + setChanged(); } /** @@ -134,9 +86,9 @@ public void changeAlarmSound(Player activator) { @Override protected void saveAdditional(@NotNull CompoundTag pTag) { super.saveAdditional(pTag); + pTag.putInt("cooldown", cooldown); pTag.putBoolean("isPowered", isPowered); - pTag.putInt("currentlyPlayingSound", currentlyPlayingSound); } /** @@ -150,71 +102,5 @@ public void load(@NotNull CompoundTag nbt) { cooldown = nbt.getInt("cooldown"); isPowered = nbt.getBoolean("isPowered"); - currentlyPlayingSound = nbt.getInt("currentlyPlayingSound"); - } - - public record PanicAlarmPacketHandler(int currentlyPlayingSound, BlockPos blockPos) { - - /** - * Constructor for PanicAlarmPacketHandler. - */ - public PanicAlarmPacketHandler { - } - - /** - * Encodes a packet - * - * @param msg the PanicAlarmPacketHandler message being sent - * @param packetBuffer the PacketBuffer containing packet data - */ - public static void encode(PanicAlarmPacketHandler msg, FriendlyByteBuf packetBuffer) { - packetBuffer.writeInt(msg.currentlyPlayingSound); - packetBuffer.writeBlockPos(msg.blockPos); - } - - /** - * Decodes a packet - * - * @param packetBuffer the PacketBuffer containing packet data - * @return PanicAlarmPacketHandler - */ - public static PanicAlarmPacketHandler decode(FriendlyByteBuf packetBuffer) { - return new PanicAlarmPacketHandler(packetBuffer.readInt(), packetBuffer.readBlockPos()); - } - - /** - * Handles an incoming packet, by sending it to the client/server - * - * @param msg the PanicAlarmPacketHandler message being sent - * @param contextSupplier the Supplier providing context - */ - public static void handle(PanicAlarmPacketHandler msg, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> handleOnClient(msg))); - context.setPacketHandled(true); - } - - /** - * Runs specifically on the client, when a packet is received - * - * @param msg the PanicAlarmPacketHandler message being sent - */ - @OnlyIn(Dist.CLIENT) - private static void handleOnClient(PanicAlarmPacketHandler msg) { - int currentlyPlayingSound = msg.currentlyPlayingSound; - Minecraft minecraft = Minecraft.getInstance(); - if (minecraft.level != null) { - PanicAlarmBlockEntity blockEntity = (PanicAlarmBlockEntity) minecraft.level.getBlockEntity(msg.blockPos); - if (blockEntity != null) { - if (currentlyPlayingSound == 1) { - minecraft.level.playLocalSound(msg.blockPos, DeferredRegistryHandler.ALARM_1.get(), SoundSource.BLOCKS, 1.0f, 1.0f, false); - } else if (currentlyPlayingSound == 2) { - minecraft.level.playLocalSound(msg.blockPos, DeferredRegistryHandler.ALARM_2.get(), SoundSource.BLOCKS, 1.0f, 1.0f, false); - } else if (currentlyPlayingSound == 3) { - minecraft.level.playLocalSound(msg.blockPos, DeferredRegistryHandler.ALARM_3.get(), SoundSource.BLOCKS, 1.0f, 1.0f, false); - } - } - } - } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/category/SmallPartsRecipeCategory.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/category/SmallPartsRecipeCategory.java index 702b6adfa..779ef6d7e 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/category/SmallPartsRecipeCategory.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/category/SmallPartsRecipeCategory.java @@ -33,6 +33,7 @@ public class SmallPartsRecipeCategory implements IRecipeCategoryIGuiHelper instance */ + @SuppressWarnings("deprecation") public SmallPartsRecipeCategory(IGuiHelper guiHelper) { icon = guiHelper.createDrawableIngredient(new ItemStack(DeferredRegistryHandler.SMALL_PARTS_TABLE.get())); background = guiHelper.createDrawable(GUI_TEXTURE, 0, 0, 125, 18); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/category/TeslaSynthesizerRecipeCategory.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/category/TeslaSynthesizerRecipeCategory.java index 910abdacd..e15acc047 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/category/TeslaSynthesizerRecipeCategory.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/integration/jei/category/TeslaSynthesizerRecipeCategory.java @@ -34,6 +34,7 @@ public class TeslaSynthesizerRecipeCategory implements IRecipeCategoryIGuiHelper instance */ + @SuppressWarnings("deprecation") public TeslaSynthesizerRecipeCategory(IGuiHelper guiHelper) { icon = guiHelper.createDrawableIngredient(new ItemStack(DeferredRegistryHandler.TESLA_SYNTHESIZER.get())); background = guiHelper.createDrawable(GUI_TEXTURE, 0, 0, 132, 54); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/AbstractParticleData.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/AbstractParticleData.java deleted file mode 100644 index 2bc18fb91..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/AbstractParticleData.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.client.particle; - -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.Mth; - -import javax.annotation.Nonnull; -import java.awt.*; -import java.util.Locale; - -public abstract class AbstractParticleData implements ParticleOptions { - - private final Color tint; - private final double diameter; - - /** - * Constructor for AbstractParticleData. - * - * @param tint a Color instance - * @param diameter the particle diameter - */ - public AbstractParticleData(Color tint, double diameter) { - this.tint = tint; - this.diameter = constrainDiameterToValidRange(diameter); - } - - /** - * Constructor for AbstractParticleData. - * - * @param tintRGB an integer for RGB tinting - * @param diameter the particle diameter - */ - public AbstractParticleData(int tintRGB, double diameter) { - tint = new Color(tintRGB); - this.diameter = constrainDiameterToValidRange(diameter); - } - - /** - * Clamps diameters to a valid range. - * - * @param diameter the particle diameter - * @return double - */ - protected static double constrainDiameterToValidRange(double diameter) { - final double MIN_DIAMETER = 0.001; - final double MAX_DIAMETER = 10; - return Mth.clamp(diameter, MIN_DIAMETER, MAX_DIAMETER); - } - - /** - * Get the tint of the particle. - * - * @return Color - */ - public Color getTint() { - return tint; - } - - /** - * Get the diameter of the particle. - * - * @return double - */ - public double getDiameter() { - return diameter; - } - - /** - * Write particle information to a PacketBuffer. - * - * @param buf a PacketBuffer instance - */ - @Override - public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeInt(tint.getRed()); - buf.writeInt(tint.getGreen()); - buf.writeInt(tint.getBlue()); - buf.writeDouble(diameter); - } - - /** - * For debugging: Write information to a readable format - * - * @return String - */ - @Nonnull - @Override - public String writeToString() { - return String.format(Locale.ROOT, "%s %.2f %d %d %d", getType().getRegistryName(), diameter, tint.getRed(), tint.getGreen(), tint.getBlue()); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/BloodParticle.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/BloodParticle.java new file mode 100644 index 000000000..13dec1810 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/BloodParticle.java @@ -0,0 +1,69 @@ +package com.anonymoushacker1279.immersiveweapons.client.particle; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; +import org.jetbrains.annotations.NotNull; + +public class BloodParticle extends TextureSheetParticle { + + protected static SpriteSet sprites; + + public static class Provider implements ParticleProvider { + + public Provider(SpriteSet pSprites) { + sprites = pSprites; + } + + @Override + public Particle createParticle(@NotNull SimpleParticleType pType, @NotNull ClientLevel pLevel, double pX, double pY, double pZ, + double pXSpeed, double pYSpeed, double pZSpeed) { + + return new BloodParticle(pLevel, pX, pY, pZ, pXSpeed, pYSpeed, pZSpeed, sprites); + } + } + + protected BloodParticle(ClientLevel level, double x, double y, double z, + double xSpeed, double ySpeed, + double zSpeed, SpriteSet spriteSet) { + + super(level, x, y, z, 0.0D, 0.0D, 0.0D); + friction = 0.96F; + gravity = (float) 0.2; + speedUpWhenYMotionIsBlocked = true; + sprites = spriteSet; + xd *= (float) 0.0; + yd *= (float) 0.0; + zd *= (float) 0.0; + xd += xSpeed; + yd += ySpeed; + zd += zSpeed; + float vibrancyModifier = level.random.nextFloat(); + rCol = vibrancyModifier; + gCol = vibrancyModifier; + bCol = vibrancyModifier; + quadSize *= 0.75F * (float) 0.5; + lifetime = (int) ((double) 40 / ((double) level.random.nextFloat() * 0.8D + 0.2D)); + lifetime = (int) ((float) lifetime * (float) 0.5); + lifetime = Math.max(lifetime, 1); + setSpriteFromAge(spriteSet); + hasPhysics = true; + } + + @Override + public @NotNull ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public float getQuadSize(float pScaleFactor) { + return quadSize * Mth.clamp(((float) age + pScaleFactor) / (float) lifetime * 32.0F, 0.0F, 1.0F); + } + + @Override + public void tick() { + super.tick(); + setSpriteFromAge(sprites); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/GenericParticle.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/GenericParticle.java deleted file mode 100644 index be521648f..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/GenericParticle.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.client.particle; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.particle.ParticleRenderType; -import net.minecraft.client.particle.TextureSheetParticle; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.core.BlockPos; -import org.jetbrains.annotations.NotNull; - -import java.awt.*; - -public class GenericParticle extends TextureSheetParticle { - - private final double xPos; - private final double yPos; - private final double zPos; - - /** - * Constructor for GenericParticle. - * - * @param world the ClientWorld the particle is in - * @param x the X position to spawn at - * @param y the Y position to spawn at - * @param z the Z position to spawn at - * @param velocityX the X velocity to spawn with - * @param velocityY the Y velocity to spawn with - * @param velocityZ the Z velocity to spawn with - * @param tint the Color to spawn with - * @param diameter the diameter to spawn at - */ - public GenericParticle(ClientLevel world, double x, double y, double z, double velocityX, double velocityY, double velocityZ, Color tint, double diameter) { - super(world, x, y, z, velocityX, velocityY, velocityZ); - - xPos = x; - yPos = y; - zPos = z; - - setColor(tint.getRed() / 255.0F, tint.getGreen() / 255.0F, tint.getBlue() / 255.0F); - setSize((float) diameter, (float) diameter); // the size (width, height) of the collision box. - - final float PARTICLE_SCALE_FOR_ONE_METER = 0.5F; // if the particleScale is 0.5, the texture will be rendered as 1 meter high - quadSize = PARTICLE_SCALE_FOR_ONE_METER * (float) diameter; // sets the rendering size of the particle for a TexturedParticle. - - lifetime = 500; // lifetime in ticks: 100 ticks = 5 seconds - - alpha = 0.95F; // transparency - - //the vanilla Particle constructor added random variation to our starting velocity. Undo it! - xd = velocityX; - yd = velocityY; - zd = velocityZ; - - hasPhysics = true; // the move() method will check for collisions with scenery - } - - /** - * Get the lighting color. - * - * @param partialTick the current partial tick - * @return int - */ - @Override - protected int getLightColor(float partialTick) { - BlockPos blockPos = new BlockPos(xPos, yPos, zPos).above(); - int lightAtParticleLocation = 0; // Get the light level at the current position - Minecraft mc = Minecraft.getInstance(); - if (mc.level != null) { - lightAtParticleLocation = mc.level.getMaxLocalRawBrightness(blockPos); - } - int BLOCK_LIGHT = lightAtParticleLocation; - int SKY_LIGHT = lightAtParticleLocation; - return LightTexture.pack(BLOCK_LIGHT, SKY_LIGHT); - } - - /** - * Get the render type. - * - * @return IParticleRenderType - */ - @Override - public @NotNull ParticleRenderType getRenderType() { - return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; - } - - /** - * Runs once per tick to update particle data. - */ - @Override - public void tick() { - xo = x; - yo = y; - zo = z; - - move(xd, yd, zd); - if (onGround) { - remove(); - } - if (yo == y && yd > 0) { - remove(); - } - if (age++ >= lifetime) { - remove(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/SandCloudParticle.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/SandCloudParticle.java new file mode 100644 index 000000000..b8ac05b9f --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/SandCloudParticle.java @@ -0,0 +1,70 @@ +package com.anonymoushacker1279.immersiveweapons.client.particle; + +import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; +import org.jetbrains.annotations.NotNull; + +public class SandCloudParticle extends TextureSheetParticle { + + protected static SpriteSet sprites; + + public static class Provider implements ParticleProvider { + + public Provider(SpriteSet pSprites) { + sprites = pSprites; + } + + @Override + public Particle createParticle(@NotNull SimpleParticleType pType, @NotNull ClientLevel pLevel, double pX, double pY, double pZ, + double pXSpeed, double pYSpeed, double pZSpeed) { + + return new SandCloudParticle(pLevel, pX, pY, pZ, pXSpeed, pYSpeed, pZSpeed, sprites); + } + } + + protected SandCloudParticle(ClientLevel level, double x, double y, double z, + double xSpeed, double ySpeed, + double zSpeed, SpriteSet spriteSet) { + + super(level, x, y, z, 0.0D, 0.0D, 0.0D); + friction = 0.96F; + gravity = (float) 0.075; + speedUpWhenYMotionIsBlocked = true; + sprites = spriteSet; + xd *= (float) 0.0; + yd *= (float) 0.0; + zd *= (float) 0.0; + xd += xSpeed; + yd += ySpeed; + zd += zSpeed; + float vibrancyModifier = GeneralUtilities.getRandomNumber(0.6f, 1.0f); + rCol = vibrancyModifier; + gCol = vibrancyModifier; + bCol = vibrancyModifier; + quadSize *= 0.75F * (float) 3.5; + lifetime = (int) ((double) 20 / ((double) level.random.nextFloat() * 0.8D + 0.2D)); + lifetime = (int) ((float) lifetime * (float) 3.5); + lifetime = Math.max(lifetime, 1); + setSpriteFromAge(spriteSet); + hasPhysics = true; + } + + @Override + public @NotNull ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public float getQuadSize(float pScaleFactor) { + return quadSize * Mth.clamp(((float) age + pScaleFactor) / (float) lifetime * 32.0F, 0.0F, 1.0F); + } + + @Override + public void tick() { + super.tick(); + setSpriteFromAge(sprites); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleData.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleData.java deleted file mode 100644 index 79f7edaf9..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleData.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.client.particle.blood; - -import com.anonymoushacker1279.immersiveweapons.client.particle.AbstractParticleData; -import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.Mth; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nonnull; -import java.awt.*; - -public class BloodParticleData extends AbstractParticleData { - - static final Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( - Codec.INT.fieldOf("tint").forGetter(d -> d.tint.getRGB()), - Codec.DOUBLE.fieldOf("diameter").forGetter(d -> d.diameter) - ).apply(instance, BloodParticleData::new) - ); - @SuppressWarnings("deprecation") - static final Deserializer DESERIALIZER = new Deserializer<>() { - - /** - * Parse information for spawning particles with commands. - * - * @param type a ParticleType instance extending BloodParticleData - * @param reader a StringReader instance - * @return BloodParticleData - * @throws CommandSyntaxException occurs when improper command syntax is provided - */ - @Override - public @NotNull BloodParticleData fromCommand(@Nonnull ParticleType type, @Nonnull StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - double diameter = constrainDiameterToValidRange(reader.readDouble()); - - final int MIN_COLOR = 0; - final int MAX_COLOR = 255; - reader.expect(' '); - int red = Mth.clamp(reader.readInt(), MIN_COLOR, MAX_COLOR); - reader.expect(' '); - int green = Mth.clamp(reader.readInt(), MIN_COLOR, MAX_COLOR); - reader.expect(' '); - int blue = Mth.clamp(reader.readInt(), MIN_COLOR, MAX_COLOR); - Color color = new Color(red, green, blue); - - return new BloodParticleData(color, diameter); - } - - /** - * Read particle data from a packet. - * - * @param type a ParticleType instance extending BloodParticleData - * @param buf a PacketBuffer containing packet data - * @return BloodParticleData - */ - @Override - public @NotNull BloodParticleData fromNetwork(@Nonnull ParticleType type, FriendlyByteBuf buf) { - final int MIN_COLOR = 0; - final int MAX_COLOR = 255; - int red = Mth.clamp(buf.readInt(), MIN_COLOR, MAX_COLOR); - int green = Mth.clamp(buf.readInt(), MIN_COLOR, MAX_COLOR); - int blue = Mth.clamp(buf.readInt(), MIN_COLOR, MAX_COLOR); - Color color = new Color(red, green, blue); - double diameter = constrainDiameterToValidRange(buf.readDouble()); - - return new BloodParticleData(color, diameter); - } - }; - - private final Color tint; - private final double diameter; - - /** - * Constructor for BloodParticleData. - * - * @param tint a Color instance - * @param diameter the particle diameter - */ - public BloodParticleData(Color tint, double diameter) { - super(tint, diameter); - this.tint = tint; - this.diameter = constrainDiameterToValidRange(diameter); - } - - /** - * Constructor for BloodParticleData. - * - * @param tintRGB an integer for RGB tinting - * @param diameter the particle diameter - */ - private BloodParticleData(int tintRGB, double diameter) { - super(tintRGB, diameter); - tint = new Color(tintRGB); - this.diameter = constrainDiameterToValidRange(diameter); - } - - /** - * Get the particle type. - * - * @return ParticleType extending BloodParticleData - */ - @Override - public @NotNull ParticleType getType() { - return DeferredRegistryHandler.BLOOD_PARTICLE_TYPE.get(); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleFactory.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleFactory.java deleted file mode 100644 index f56c15334..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.client.particle.blood; - -import com.anonymoushacker1279.immersiveweapons.client.particle.GenericParticle; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleProvider; -import net.minecraft.client.particle.SpriteSet; -import org.jetbrains.annotations.NotNull; - -public class BloodParticleFactory implements ParticleProvider { - - private final SpriteSet sprites; - - /** - * Constructor for BloodParticleFactory. - * - * @param sprite an IAnimatedSprite instance - */ - public BloodParticleFactory(SpriteSet sprite) { - sprites = sprite; - } - - /** - * Create a particle at the given coordinates with velocity. - * - * @param bloodParticleData a BloodParticleData instance - * @param world the ClientWorld the particle is in - * @param xPos the X position to spawn at - * @param yPos the Y position to spawn at - * @param zPos the Z position to spawn at - * @param xVelocity the X velocity to spawn with - * @param yVelocity the Y velocity to spawn with - * @param zVelocity the Z velocity to spawn with - * @return Particle - */ - @Override - public Particle createParticle(BloodParticleData bloodParticleData, @NotNull ClientLevel world, double xPos, double yPos, double zPos, double xVelocity, double yVelocity, double zVelocity) { - GenericParticle newParticle = new GenericParticle(world, xPos, yPos, zPos, xVelocity, yVelocity, zVelocity, - bloodParticleData.getTint(), bloodParticleData.getDiameter() - ); - newParticle.pickSprite(sprites); // choose a random sprite from the available list (in this case there is only one) - return newParticle; - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleType.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleType.java deleted file mode 100644 index ffeb9dcad..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/blood/BloodParticleType.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.client.particle.blood; - -import com.mojang.serialization.Codec; -import net.minecraft.core.particles.ParticleType; -import org.jetbrains.annotations.NotNull; - -public class BloodParticleType extends ParticleType { - - /** - * Constructor for BloodParticleType. - */ - public BloodParticleType() { - super(false, BloodParticleData.DESERIALIZER); - } - - /** - * Get the particle codec. - * - * @return Codec extending BloodParticleData - */ - @Override - public @NotNull Codec codec() { - return BloodParticleData.CODEC; - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smoke_bomb/SmokeBombParticle.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smoke_bomb/SmokeBombParticle.java new file mode 100644 index 000000000..d77c74d47 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smoke_bomb/SmokeBombParticle.java @@ -0,0 +1,74 @@ +package com.anonymoushacker1279.immersiveweapons.client.particle.smoke_bomb; + +import com.mojang.math.Vector3f; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.util.Mth; +import org.jetbrains.annotations.NotNull; + +public class SmokeBombParticle extends TextureSheetParticle { + + protected static SpriteSet sprites; + + public static class Provider implements ParticleProvider { + + public Provider(SpriteSet pSprites) { + sprites = pSprites; + } + + @Override + public Particle createParticle(@NotNull SmokeBombParticleOptions pType, @NotNull ClientLevel pLevel, double pX, double pY, double pZ, + double pXSpeed, double pYSpeed, double pZSpeed) { + + return new SmokeBombParticle(pLevel, pX, pY, pZ, + pXSpeed, pYSpeed, pZSpeed, sprites, pType.getColor()); + } + } + + protected SmokeBombParticle(ClientLevel level, double x, double y, double z, + double xSpeed, double ySpeed, + double zSpeed, SpriteSet spriteSet, Vector3f color) { + + super(level, x, y, z, 0.0D, 0.0D, 0.0D); + friction = 0.96F; + gravity = (float) 0.005; + speedUpWhenYMotionIsBlocked = true; + sprites = spriteSet; + xd *= (float) 1.0; + yd *= (float) 1.0; + zd *= (float) 1.0; + xd += xSpeed; + yd += ySpeed; + zd += zSpeed; + float vibrancyModifier = level.random.nextFloat() * 0.4f + 0.6f; + rCol = randomizeColor(color.x(), vibrancyModifier); + gCol = randomizeColor(color.y(), vibrancyModifier); + bCol = randomizeColor(color.z(), vibrancyModifier); + quadSize *= 0.75F * (float) 35.0; + lifetime = (int) ((double) 90 / ((double) level.random.nextFloat() * 0.8D + 0.2D)); + lifetime = (int) ((float) lifetime * ((float) 35.0 * 0.1)); + lifetime = Math.max(lifetime, 1); + setSpriteFromAge(spriteSet); + hasPhysics = true; + } + + protected float randomizeColor(float color, float multiplier) { + return (random.nextFloat() * 0.05F + 0.95F) * color * multiplier; + } + + @Override + public @NotNull ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public float getQuadSize(float pScaleFactor) { + return quadSize * Mth.clamp(((float) age + pScaleFactor) / (float) lifetime * 32.0F, 0.0F, 1.0F); + } + + @Override + public void tick() { + super.tick(); + setSpriteFromAge(sprites); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smoke_bomb/SmokeBombParticleOptions.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smoke_bomb/SmokeBombParticleOptions.java new file mode 100644 index 000000000..50ac4b3c8 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smoke_bomb/SmokeBombParticleOptions.java @@ -0,0 +1,127 @@ +package com.anonymoushacker1279.immersiveweapons.client.particle.smoke_bomb; + +import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.math.Vector3f; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +public class SmokeBombParticleOptions implements ParticleOptions { + + public static final Codec CODEC = RecordCodecBuilder.create((particleOptionsInstance) + -> particleOptionsInstance + .group(Vector3f.CODEC.fieldOf("color").forGetter((particleOptions) -> particleOptions.color), + Codec.FLOAT.fieldOf("scale").forGetter((particleOptions) -> particleOptions.scale)) + .apply(particleOptionsInstance, SmokeBombParticleOptions::new)); + + protected final Vector3f color; + protected final float scale; + + @SuppressWarnings("deprecation") + public static final ParticleOptions.Deserializer DESERIALIZER = new ParticleOptions.Deserializer<>() { + @Override + public @NotNull SmokeBombParticleOptions fromCommand(@NotNull ParticleType particleType, + @NotNull StringReader reader) throws CommandSyntaxException { + + Vector3f vector3f = SmokeBombParticleOptions.readVector3f(reader); + reader.expect(' '); + float vibrancy = reader.readFloat(); + return new SmokeBombParticleOptions(vector3f, vibrancy); + } + + @Override + public @NotNull SmokeBombParticleOptions fromNetwork(@NotNull ParticleType particleType, + @NotNull FriendlyByteBuf byteBuf) { + + return new SmokeBombParticleOptions(SmokeBombParticleOptions.readVector3f(byteBuf), byteBuf.readFloat()); + } + }; + + public SmokeBombParticleOptions(Vector3f vector3f, float vibrancy) { + color = vector3f; + scale = Mth.clamp(vibrancy, 0.001F, 100.0F); + } + + public static Vector3f readVector3f(StringReader reader) throws CommandSyntaxException { + reader.expect(' '); + float f = reader.readFloat(); + reader.expect(' '); + float f1 = reader.readFloat(); + reader.expect(' '); + float f2 = reader.readFloat(); + return new Vector3f(f, f1, f2); + } + + public static Vector3f readVector3f(FriendlyByteBuf byteBuf) { + return new Vector3f(byteBuf.readFloat(), byteBuf.readFloat(), byteBuf.readFloat()); + } + + @Override + public void writeToNetwork(FriendlyByteBuf byteBuf) { + byteBuf.writeFloat(color.x()); + byteBuf.writeFloat(color.y()); + byteBuf.writeFloat(color.z()); + byteBuf.writeFloat(scale); + } + + @Override + public @NotNull String writeToString() { + return String.format(Locale.ROOT, "%s %.2f %.2f %.2f %.2f", ForgeRegistries.PARTICLE_TYPES + .getKey(getType()), color.x(), color.y(), color.z(), scale); + } + + public Vector3f getColor() { + return color; + } + + public float getScale() { + return scale; + } + + @Override + public @NotNull ParticleType getType() { + return DeferredRegistryHandler.SMOKE_BOMB_PARTICLE.get(); + } + + public static class SmokeBombColors { + public static final Vector3f GRAY = new Vector3f(Vec3.fromRGB24(16777215)); + public static final Vector3f RED = new Vector3f(Vec3.fromRGB24(16711680)); + public static final Vector3f GREEN = new Vector3f(Vec3.fromRGB24(5294200)); + public static final Vector3f BLUE = new Vector3f(Vec3.fromRGB24(1644912)); + public static final Vector3f PURPLE = new Vector3f(Vec3.fromRGB24(5046349)); + public static final Vector3f YELLOW = new Vector3f(Vec3.fromRGB24(16318253)); + } + + /** + * Utility for getting particle colors from resources spawning smoke bomb particles. + * + * @param colorID the ID representing the color to be selected. + *
0 -> Gray + *
1 -> Red + *
2 -> Green + *
3 -> Blue + *
4 -> Purple + *
5 -> Yellow + * @return SmokeBombParticleOptions + */ + public static SmokeBombParticleOptions getParticleByColor(int colorID) { + return switch (colorID) { + case 1 -> new SmokeBombParticleOptions(SmokeBombColors.RED, 1.0F); + case 2 -> new SmokeBombParticleOptions(SmokeBombColors.GREEN, 1.0F); + case 3 -> new SmokeBombParticleOptions(SmokeBombColors.BLUE, 1.0F); + case 4 -> new SmokeBombParticleOptions(SmokeBombColors.PURPLE, 1.0F); + case 5 -> new SmokeBombParticleOptions(SmokeBombColors.YELLOW, 1.0F); + default -> new SmokeBombParticleOptions(SmokeBombColors.GRAY, 1.0F); + }; + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleData.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleData.java deleted file mode 100644 index 68d9330d1..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleData.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb; - -import com.anonymoushacker1279.immersiveweapons.client.particle.AbstractParticleData; -import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.Mth; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nonnull; -import java.awt.*; - -public class SmokeBombParticleData extends AbstractParticleData { - - static final Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( - Codec.INT.fieldOf("tint").forGetter(d -> d.tint.getRGB()), - Codec.DOUBLE.fieldOf("diameter").forGetter(d -> d.diameter) - ).apply(instance, SmokeBombParticleData::new) - ); - @SuppressWarnings("deprecation") - static final Deserializer DESERIALIZER = new Deserializer<>() { - - /** - * Parse information for spawning particles with commands. - * - * @param type a ParticleType instance extending SmokeBombParticleData - * @param reader a StringReader instance - * @return SmokeBombParticleData - * @throws CommandSyntaxException occurs when improper command syntax is provided - */ - @Override - public @NotNull SmokeBombParticleData fromCommand(@Nonnull ParticleType type, @Nonnull StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - double diameter = constrainDiameterToValidRange(reader.readDouble()); - - final int MIN_COLOR = 0; - final int MAX_COLOR = 255; - reader.expect(' '); - int red = Mth.clamp(reader.readInt(), MIN_COLOR, MAX_COLOR); - reader.expect(' '); - int green = Mth.clamp(reader.readInt(), MIN_COLOR, MAX_COLOR); - reader.expect(' '); - int blue = Mth.clamp(reader.readInt(), MIN_COLOR, MAX_COLOR); - Color color = new Color(red, green, blue); - - return new SmokeBombParticleData(color, diameter); - } - - /** - * Read particle data from a packet. - * - * @param type a ParticleType instance extending SmokeBombParticleData - * @param buf a PacketBuffer containing packet data - * @return SmokeBombParticleData - */ - @Override - public @NotNull SmokeBombParticleData fromNetwork(@Nonnull ParticleType type, FriendlyByteBuf buf) { - final int MIN_COLOR = 0; - final int MAX_COLOR = 255; - int red = Mth.clamp(buf.readInt(), MIN_COLOR, MAX_COLOR); - int green = Mth.clamp(buf.readInt(), MIN_COLOR, MAX_COLOR); - int blue = Mth.clamp(buf.readInt(), MIN_COLOR, MAX_COLOR); - Color color = new Color(red, green, blue); - double diameter = constrainDiameterToValidRange(buf.readDouble()); - - return new SmokeBombParticleData(color, diameter); - } - }; - - private final Color tint; - private final double diameter; - - /** - * Constructor for SmokeBombParticleData. - * - * @param tint a Color instance - * @param diameter the particle diameter - */ - public SmokeBombParticleData(Color tint, double diameter) { - super(tint, diameter); - this.tint = tint; - this.diameter = constrainDiameterToValidRange(diameter); - } - - /** - * Constructor for SmokeBombParticleData. - * - * @param tintRGB an integer for RGB tinting - * @param diameter the particle diameter - */ - private SmokeBombParticleData(int tintRGB, double diameter) { - super(tintRGB, diameter); - tint = new Color(tintRGB); - this.diameter = constrainDiameterToValidRange(diameter); - } - - /** - * Get the particle type. - * - * @return ParticleType extending SmokeBombParticleData - */ - @Override - public @NotNull ParticleType getType() { - return DeferredRegistryHandler.SMOKE_BOMB_PARTICLE_TYPE.get(); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleFactory.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleFactory.java deleted file mode 100644 index ad841f931..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb; - -import com.anonymoushacker1279.immersiveweapons.client.particle.GenericParticle; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleProvider; -import net.minecraft.client.particle.SpriteSet; -import org.jetbrains.annotations.NotNull; - -public class SmokeBombParticleFactory implements ParticleProvider { - - private final SpriteSet sprites; - - /** - * Constructor for SmokeBombParticleFactory. - * - * @param sprite an IAnimatedSprite instance - */ - public SmokeBombParticleFactory(SpriteSet sprite) { - sprites = sprite; - } - - /** - * Create a particle at the given coordinates with velocity. - * - * @param smokeBombParticleData a SmokeBombParticleData instance - * @param world the ClientWorld the particle is in - * @param xPos the X position to spawn at - * @param yPos the Y position to spawn at - * @param zPos the Z position to spawn at - * @param xVelocity the X velocity to spawn with - * @param yVelocity the Y velocity to spawn with - * @param zVelocity the Z velocity to spawn with - * @return Particle - */ - @Override - public Particle createParticle(SmokeBombParticleData smokeBombParticleData, @NotNull ClientLevel world, double xPos, double yPos, double zPos, double xVelocity, double yVelocity, double zVelocity) { - GenericParticle newParticle = new GenericParticle(world, xPos, yPos, zPos, xVelocity, yVelocity, zVelocity, - smokeBombParticleData.getTint(), smokeBombParticleData.getDiameter() - ); - newParticle.pickSprite(sprites); // choose a random sprite from the available list (in this case there is only one) - return newParticle; - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleType.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleType.java deleted file mode 100644 index a0981b883..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/particle/smokebomb/SmokeBombParticleType.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb; - -import com.mojang.serialization.Codec; -import net.minecraft.core.particles.ParticleType; -import org.jetbrains.annotations.NotNull; - -public class SmokeBombParticleType extends ParticleType { - - /** - * Constructor for SmokeBombParticleType. - */ - public SmokeBombParticleType() { - super(false, SmokeBombParticleData.DESERIALIZER); - } - - /** - * Get the particle codec. - * - * @return Codec extending SmokeBombParticleData - */ - @Override - public @NotNull Codec codec() { - return SmokeBombParticleData.CODEC; - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/FieldMedicRenderer.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/FieldMedicRenderer.java index eb052a4a6..48a93f3d8 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/FieldMedicRenderer.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/FieldMedicRenderer.java @@ -1,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.client.renderer.entity.mob; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.entity.passive.FieldMedicEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.FieldMedicEntity; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.ModelLayers; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/MinutemanRenderer.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/MinutemanRenderer.java index dcd4e4a8b..c57cbf76c 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/MinutemanRenderer.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/client/renderer/entity/mob/MinutemanRenderer.java @@ -1,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.client.renderer.entity.mob; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.entity.passive.MinutemanEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.MinutemanEntity; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.ModelLayers; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/config/ClientConfig.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/config/ClientConfig.java index 886962750..3a8ab1f96 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/config/ClientConfig.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/config/ClientConfig.java @@ -1,48 +1,38 @@ package com.anonymoushacker1279.immersiveweapons.config; -import com.electronwill.nightconfig.core.file.CommentedFileConfig; -import com.electronwill.nightconfig.core.io.WritingMode; import net.minecraftforge.common.ForgeConfigSpec; - -import java.nio.file.Path; +import net.minecraftforge.common.ForgeConfigSpec.Builder; +import org.apache.commons.lang3.tuple.Pair; public class ClientConfig { - private static final ForgeConfigSpec.Builder CONFIG_BUILDER = new ForgeConfigSpec.Builder(); - private static final ForgeConfigSpec CONFIG; + public static final ForgeConfigSpec CLIENT_SPEC; + public static final ClientConfig CLIENT; - public static final ForgeConfigSpec.ConfigValue TESLA_ARMOR_EFFECT_SOUND; + public static ForgeConfigSpec.ConfigValue TESLA_ARMOR_EFFECT_SOUND; + public static ForgeConfigSpec.ConfigValue PANIC_ALARM_RANGE; - /* - * Initialize the client configuration file. - */ - static { - CONFIG_BUILDER.push("Client Configuration"); + ClientConfig(ForgeConfigSpec.Builder builder) { + builder.push("Client Configuration"); - CONFIG_BUILDER.push("Sounds"); - TESLA_ARMOR_EFFECT_SOUND = CONFIG_BUILDER + builder.push("Sounds"); + TESLA_ARMOR_EFFECT_SOUND = builder .comment("Enable the Tesla Armor effect sound - Default true") .translation("config.immersiveweapons.tesla_armor_effect_sound") .define("tesla_armor_effect_sound", true); - CONFIG_BUILDER.pop(); + PANIC_ALARM_RANGE = builder + .comment("Set the range of the Panic Alarm's sound - Default 48") + .translation("config.immersiveweapons.panic_alarm_range") + .define("panic_alarm_range", 48); + builder.pop(); - CONFIG_BUILDER.pop(); - CONFIG = CONFIG_BUILDER.build(); + builder.pop(); } - /** - * Setup a configuration file. - * - * @param path the Path of the file - */ - public static void setup(Path path) { - CommentedFileConfig configData = CommentedFileConfig.builder(path) - .sync() - .autosave() - .writingMode(WritingMode.REPLACE) - .build(); - - configData.load(); - CONFIG.setConfig(configData); + static { + Pair clientForgeConfigSpecPair = new Builder().configure(ClientConfig::new); + + CLIENT_SPEC = clientForgeConfigSpecPair.getRight(); + CLIENT = clientForgeConfigSpecPair.getLeft(); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/config/ServerConfig.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/config/CommonConfig.java similarity index 56% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/config/ServerConfig.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/config/CommonConfig.java index 323bcd299..36ec83bff 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/config/ServerConfig.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/config/CommonConfig.java @@ -1,334 +1,320 @@ package com.anonymoushacker1279.immersiveweapons.config; -import com.electronwill.nightconfig.core.file.CommentedFileConfig; -import com.electronwill.nightconfig.core.io.WritingMode; import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.common.ForgeConfigSpec.Builder; +import org.apache.commons.lang3.tuple.Pair; -import java.nio.file.Path; import java.util.*; -public class ServerConfig { +public class CommonConfig { - private static final ForgeConfigSpec.Builder CONFIG_BUILDER = new ForgeConfigSpec.Builder(); - private static final ForgeConfigSpec CONFIG; + public static final ForgeConfigSpec COMMON_SPEC; + public static final CommonConfig COMMON; - public static final ForgeConfigSpec.ConfigValue MAX_SMOKE_BOMB_PARTICLES; - public static final ForgeConfigSpec.ConfigValue BULLETS_BREAK_GLASS; - public static final ForgeConfigSpec.ConfigValue DYING_SOLDIER_SPAWN; - public static final ForgeConfigSpec.ConfigValue WANDERING_WARRIOR_SPAWN; - public static final ForgeConfigSpec.ConfigValue HANS_SPAWN; - public static final ForgeConfigSpec.ConfigValue LAVA_REVENANT_SPAWN; - public static final ForgeConfigSpec.ConfigValue ROCK_SPIDER_SPAWN; - public static final ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_SPAWN; - public static final ForgeConfigSpec.ConfigValue TILTROS_ENABLED; - public static final ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_XZ_SPAWN_CHECK_RADIUS; - public static final ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_Y_SPAWN_CHECK_RADIUS; - public static final ForgeConfigSpec.ConfigValue CELESTIAL_TOWER_MINIONS_WAVE_SIZE_MODIFIER; - public static final ForgeConfigSpec.ConfigValue> MOLTEN_ORE_CONFIG; - public static final ForgeConfigSpec.ConfigValue> NETHER_SULFUR_ORE_CONFIG; - public static final ForgeConfigSpec.ConfigValue> SULFUR_ORE_CONFIG; - public static final ForgeConfigSpec.ConfigValue> DEEPSLATE_SULFUR_ORE_CONFIG; - public static final ForgeConfigSpec.ConfigValue> COBALT_ORE_CONFIG; - public static final ForgeConfigSpec.ConfigValue> DEEPSLATE_COBALT_ORE_CONFIG; - public static final ForgeConfigSpec.ConfigValue MAX_ABANDONED_FACTORY_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_ABANDONED_FACTORY_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_PITFALL_TRAP_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_PITFALL_TRAP_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_BEAR_TRAP_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_BEAR_TRAP_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_LANDMINE_TRAP_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_LANDMINE_TRAP_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_UNDERGROUND_BUNKER_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_UNDERGROUND_BUNKER_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_BATTLEFIELD_CAMP_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_BATTLEFIELD_CAMP_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_BATTLEFIELD_VILLAGE_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_BATTLEFIELD_VILLAGE_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_CLOUD_ISLAND_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_CLOUD_ISLAND_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_CAMPSITE_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_CAMPSITE_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_BATTLEFIELD_HOUSE_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_BATTLEFIELD_HOUSE_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_OUTHOUSE_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_OUTHOUSE_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_WATER_TOWER_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_WATER_TOWER_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MAX_GRAVEYARD_DISTANCE; - public static final ForgeConfigSpec.ConfigValue MIN_GRAVEYARD_DISTANCE; + 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; - /* - * Initialize the server configuration file. - */ - static { - CONFIG_BUILDER.push("Server Configuration"); + CommonConfig(ForgeConfigSpec.Builder builder) { + builder.push("Server Configuration"); - CONFIG_BUILDER.push("Miscellaneous"); - MAX_SMOKE_BOMB_PARTICLES = CONFIG_BUILDER + builder.push("Miscellaneous"); + MAX_SMOKE_BOMB_PARTICLES = builder .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); - BULLETS_BREAK_GLASS = CONFIG_BUILDER + BULLETS_BREAK_GLASS = builder .comment("Enable bullets breaking glass - Default true") .translation("config.immersiveweapons.bullets_break_glass") .define("bullets_break_glass", true); - TILTROS_ENABLED = CONFIG_BUILDER + TILTROS_ENABLED = builder .comment("Enable the Tiltros dimension portal - Default true") .translation("config.immersiveweapons.tiltros_enabled") .define("tiltros_enabled", true); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Entity Spawns"); - DYING_SOLDIER_SPAWN = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Celestial Tower"); - CELESTIAL_TOWER_XZ_SPAWN_CHECK_RADIUS = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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_MINIONS_WAVE_SIZE_MODIFIER = CONFIG_BUILDER + 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"); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Structure Generation"); + builder.push("Structure Generation"); - CONFIG_BUILDER.push("Abandoned Factory"); - MAX_ABANDONED_FACTORY_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Pitfall Trap"); - MAX_PITFALL_TRAP_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Bear Trap"); - MAX_BEAR_TRAP_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Landmine Trap"); - MAX_LANDMINE_TRAP_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Underground Bunker"); - MAX_UNDERGROUND_BUNKER_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Battlefield Camp"); - MAX_BATTLEFIELD_CAMP_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Battlefield Village"); - MAX_BATTLEFIELD_VILLAGE_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Cloud Island"); - MAX_CLOUD_ISLAND_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Campsite"); - MAX_CAMPSITE_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + MIN_CAMPSITE_DISTANCE = builder .comment("Minimum distance in chunks between Campsites - Default 30") .translation("config.immersiveweapons.min_campsite_distance") .define("min_campsite_distance", 30); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Battlefield House"); - MAX_BATTLEFIELD_HOUSE_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Outhouse"); - MAX_OUTHOUSE_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + MIN_OUTHOUSE_DISTANCE = builder .comment("Minimum distance in chunks between Outhouses - Default 20") .translation("config.immersiveweapons.min_outhouse_distance") .define("min_outhouse_distance", 20); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Water Tower"); - MAX_WATER_TOWER_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Graveyard"); - MAX_GRAVEYARD_DISTANCE = CONFIG_BUILDER + 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 = CONFIG_BUILDER + MIN_GRAVEYARD_DISTANCE = builder .comment("Minimum distance in chunks between Graveyards - Default 30") .translation("config.immersiveweapons.min_graveyard_distance") .define("min_graveyard_distance", 30); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.push("Ore Generation"); - List molten_ore_config_list = new ArrayList<>(1); + 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 = CONFIG_BUILDER + 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<>(1); + List nether_sulfur_ore_config_list = new ArrayList<>(2); nether_sulfur_ore_config_list.addAll(Arrays.asList(12, 16)); - NETHER_SULFUR_ORE_CONFIG = CONFIG_BUILDER + 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<>(1); + List sulfur_ore_config_list = new ArrayList<>(2); sulfur_ore_config_list.addAll(Arrays.asList(8, 14)); - SULFUR_ORE_CONFIG = CONFIG_BUILDER + 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<>(1); + List cobalt_ore_config_list = new ArrayList<>(3); cobalt_ore_config_list.addAll(Arrays.asList(6, 12, 24)); - COBALT_ORE_CONFIG = CONFIG_BUILDER + 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<>(1); + List deepslate_sulfur_ore_config_list = new ArrayList<>(2); deepslate_sulfur_ore_config_list.addAll(Arrays.asList(8, 14)); - DEEPSLATE_SULFUR_ORE_CONFIG = CONFIG_BUILDER + 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<>(1); + List deepslate_cobalt_ore_config_list = new ArrayList<>(2); deepslate_cobalt_ore_config_list.addAll(Arrays.asList(8, 16)); - DEEPSLATE_COBALT_ORE_CONFIG = CONFIG_BUILDER + 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); - CONFIG_BUILDER.pop(); + builder.pop(); - CONFIG_BUILDER.pop(); - CONFIG = CONFIG_BUILDER.build(); + builder.pop(); } - /** - * Setup a configuration file. - * - * @param path the Path of the file - */ - public static void setup(Path path) { - CommentedFileConfig configData = CommentedFileConfig.builder(path) - .sync() - .autosave() - .writingMode(WritingMode.REPLACE) - .build(); + static { + Pair commonConfigForgeConfigSpecPair = new Builder().configure(CommonConfig::new); - configData.load(); - CONFIG.setConfig(configData); + COMMON_SPEC = commonConfigForgeConfigSpecPair.getRight(); + COMMON = commonConfigForgeConfigSpecPair.getLeft(); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/container/AbstractTeslaSynthesizerContainer.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/container/AbstractTeslaSynthesizerContainer.java index de49e6145..122ec5899 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/container/AbstractTeslaSynthesizerContainer.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/container/AbstractTeslaSynthesizerContainer.java @@ -9,8 +9,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.*; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; public abstract class AbstractTeslaSynthesizerContainer extends AbstractContainerMenu { @@ -32,41 +30,41 @@ public abstract class AbstractTeslaSynthesizerContainer extends AbstractContaine /** * Constructor for AbstractTeslaSynthesizerContainer. * - * @param containerType the ContainerType of the container - * @param id the ID of the container - * @param playerInventory the PlayerInventory instance - * @param iInventory the IInventory instance - * @param iIntArray the IIntArray instance + * @param containerType the ContainerType of the container + * @param id the ID of the container + * @param inventory the player inventory + * @param container the container + * @param containerData the container data */ - AbstractTeslaSynthesizerContainer(MenuType containerType, int id, Inventory playerInventory, Container iInventory, ContainerData iIntArray) { + AbstractTeslaSynthesizerContainer(MenuType containerType, int id, Inventory inventory, Container container, ContainerData containerData) { super(containerType, id); - checkContainerSize(iInventory, 5); - checkContainerDataCount(iIntArray, 4); - teslaSynthesizerInventory = iInventory; - teslaSynthesizerData = iIntArray; + checkContainerSize(container, 5); + checkContainerDataCount(containerData, 4); + teslaSynthesizerInventory = container; + teslaSynthesizerData = containerData; // First ingredient slot - addSlot(new Slot(iInventory, 0, 6, 17)); + addSlot(new Slot(container, 0, 6, 17)); // Second ingredient slot - addSlot(new Slot(iInventory, 1, 31, 17)); + addSlot(new Slot(container, 1, 31, 17)); // Third ingredient slot - addSlot(new Slot(iInventory, 2, 56, 17)); + addSlot(new Slot(container, 2, 56, 17)); // Fuel slot - addSlot(new TeslaSynthesizerFuelSlot(this, iInventory, 3, 56, 53)); + addSlot(new TeslaSynthesizerFuelSlot(this, container, 3, 56, 53)); // Result slot - addSlot(new TeslaSynthesizerResultSlot(iInventory, 4, 116, 35)); + addSlot(new TeslaSynthesizerResultSlot(container, 4, 116, 35)); // Player inventory slots for (int i = 0; i < 3; ++i) { for (int j = 0; j < 9; ++j) { - addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + addSlot(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } for (int k = 0; k < 9; ++k) { - addSlot(new Slot(playerInventory, k, 8 + k * 18, 142)); + addSlot(new Slot(inventory, k, 8 + k * 18, 142)); } - addDataSlots(iIntArray); + addDataSlots(containerData); } /** @@ -89,48 +87,55 @@ public boolean stillValid(@NotNull Player playerIn) { */ @Override public @NotNull ItemStack quickMoveStack(@NotNull Player playerIn, int index) { - ItemStack itemstack = ItemStack.EMPTY; + ItemStack itemStack = ItemStack.EMPTY; Slot slot = slots.get(index); if (slot.hasItem()) { - ItemStack itemStack1 = slot.getItem(); - itemstack = itemStack1.copy(); - if (index == 4) { - if (!moveItemStackTo(itemStack1, 3, 39, true)) { + ItemStack slotItem = slot.getItem(); + itemStack = slotItem.copy(); + + if (index == 4) { // Result slot + // Try moving the result into any of the player inventory slots + if (!moveItemStackTo(slotItem, 3, 39, true)) { return ItemStack.EMPTY; } - slot.onQuickCraft(itemStack1, itemstack); - } else if (index != 2 && index != 1 && index != 0) { - if (isFuel(itemStack1)) { - if (!moveItemStackTo(itemStack1, 3, 4, false)) { + + slot.onQuickCraft(slotItem, itemStack); + } else if (index != 2 && index != 1 && index != 0) { // Anything but the ingredient slots + + // Check if the item is a fuel + if (isFuel(slotItem)) { + // Try moving the item into the fuel slot + if (!moveItemStackTo(slotItem, 3, 3, false)) { return ItemStack.EMPTY; } - } else if (!moveItemStackTo(itemStack1, 0, 3, false)) { + } else if (!moveItemStackTo(slotItem, 0, 2, false)) { return ItemStack.EMPTY; } else if (index < 30) { - if (!moveItemStackTo(itemStack1, 30, 39, false)) { + + if (!moveItemStackTo(slotItem, 30, 39, false)) { return ItemStack.EMPTY; } - } else if (index < 39 && !moveItemStackTo(itemStack1, 3, 30, false)) { + } else if (index < 39 && !moveItemStackTo(slotItem, 3, 30, false)) { return ItemStack.EMPTY; } - } else if (!moveItemStackTo(itemStack1, 3, 39, false)) { + } else if (!moveItemStackTo(slotItem, 3, 39, false)) { return ItemStack.EMPTY; } - if (itemStack1.isEmpty()) { + if (slotItem.isEmpty()) { slot.set(ItemStack.EMPTY); } else { slot.setChanged(); } - if (itemStack1.getCount() == itemstack.getCount()) { + if (slotItem.getCount() == itemStack.getCount()) { return ItemStack.EMPTY; } - slot.onTake(playerIn, itemStack1); + slot.onTake(playerIn, slotItem); } - return itemstack; + return itemStack; } /** @@ -148,7 +153,6 @@ public boolean isFuel(ItemStack stack) { * * @return int */ - @OnlyIn(Dist.CLIENT) public int getCookProgressionScaled() { int i = teslaSynthesizerData.get(2); int j = teslaSynthesizerData.get(3); @@ -160,7 +164,6 @@ public int getCookProgressionScaled() { * * @return int */ - @OnlyIn(Dist.CLIENT) public int getBurnLeftScaled() { int i = teslaSynthesizerData.get(1); if (i == 0) { @@ -175,7 +178,6 @@ public int getBurnLeftScaled() { * * @return boolean */ - @OnlyIn(Dist.CLIENT) public boolean isBurning() { return teslaSynthesizerData.get(0) > 0; } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/container/SmallPartsContainer.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/container/SmallPartsContainer.java index 2062380b7..7fbff8809 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/container/SmallPartsContainer.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/container/SmallPartsContainer.java @@ -6,9 +6,7 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.ItemCombinerMenu; -import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.*; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -26,7 +24,7 @@ public class SmallPartsContainer extends ItemCombinerMenu { * Constructor for SmallPartsContainer. * * @param id the ID of the container - * @param inv the PlayerInventory instance + * @param inv the Inventory instance */ public SmallPartsContainer(int id, Inventory inv) { this(id, inv, ContainerLevelAccess.NULL); @@ -35,12 +33,12 @@ public SmallPartsContainer(int id, Inventory inv) { /** * Constructor for SmallPartsContainer. * - * @param id the ID of the container - * @param inv the PlayerInventory instance - * @param worldPosCallable the IWorldPosCallable instance + * @param id the ID of the container + * @param inv the Inventory instance + * @param access the ContainerLevelAccess instance */ - public SmallPartsContainer(int id, Inventory inv, ContainerLevelAccess worldPosCallable) { - super(DeferredRegistryHandler.SMALL_PARTS_TABLE_CONTAINER.get(), id, inv, worldPosCallable); + 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); } @@ -59,12 +57,12 @@ protected boolean isValidBlock(BlockState blockState) { /** * Check if the player can pick up a recipe. * - * @param playerEntity the PlayerEntity instance + * @param player the Player instance * @param matchesRecipe set the recipe match * @return boolean */ @Override - protected boolean mayPickup(@NotNull Player playerEntity, boolean matchesRecipe) { + protected boolean mayPickup(@NotNull Player player, boolean matchesRecipe) { return smallPartsRecipe != null && smallPartsRecipe.matches(inputSlots, world); } @@ -78,20 +76,13 @@ protected boolean mayPickup(@NotNull Player playerEntity, boolean matchesRecipe) protected void onTake(@NotNull Player player, ItemStack itemStack) { itemStack.onCraftedBy(player.level, player, itemStack.getCount()); resultSlots.awardUsedRecipes(player); - shrinkStackInSlot(0); // Normally we would destroy both items here. However, we don't want to destroy the blueprint item. - world.playSound(player, player.blockPosition(), DeferredRegistryHandler.SMALL_PARTS_TABLE_USED.get(), SoundSource.NEUTRAL, 1f, 1); - } + ItemStack materialSlotItem = inputSlots.getItem(0); + materialSlotItem.shrink(1); + inputSlots.setItem(0, materialSlotItem); - /** - * Shrink a stack in a slot. - * - * @param index the slot index - */ - private void shrinkStackInSlot(int index) { - ItemStack itemstack = inputSlots.getItem(index); - itemstack.shrink(1); - inputSlots.setItem(index, itemstack); + world.playSound(player, player.blockPosition(), DeferredRegistryHandler.SMALL_PARTS_TABLE_USED.get(), + SoundSource.NEUTRAL, 1f, 1); } /** @@ -99,14 +90,16 @@ private void shrinkStackInSlot(int index) { */ @Override public void createResult() { - List list = world.getRecipeManager().getRecipesFor(ICustomRecipeType.SMALL_PARTS, inputSlots, world); - if (list.isEmpty()) { + List recipes = world.getRecipeManager() + .getRecipesFor(ICustomRecipeType.SMALL_PARTS, inputSlots, world); + + if (recipes.isEmpty()) { resultSlots.setItem(0, ItemStack.EMPTY); } else { - smallPartsRecipe = list.get(0); - ItemStack itemstack = smallPartsRecipe.assemble(inputSlots); + smallPartsRecipe = recipes.get(0); + ItemStack assembledRecipe = smallPartsRecipe.assemble(inputSlots); resultSlots.setRecipeUsed(smallPartsRecipe); - resultSlots.setItem(0, itemstack); + resultSlots.setItem(0, assembledRecipe); } } @@ -133,5 +126,4 @@ protected boolean shouldQuickMoveToAdditionalSlot(@NotNull ItemStack itemStack) public boolean canTakeItemForPickAll(@NotNull ItemStack stack, Slot slotIn) { return slotIn.container != resultSlots && super.canTakeItemForPickAll(stack, slotIn); } - } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/advancements/ImmersiveWeaponsAdvancements.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/advancements/ImmersiveWeaponsAdvancements.java index 18611a628..0216889bf 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/advancements/ImmersiveWeaponsAdvancements.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/advancements/ImmersiveWeaponsAdvancements.java @@ -1,21 +1,19 @@ package com.anonymoushacker1279.immersiveweapons.data.advancements; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; +import com.anonymoushacker1279.immersiveweapons.data.tags.groups.immersiveweapons.ImmersiveWeaponsItemTagGroups; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import net.minecraft.ChatFormatting; -import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.*; import net.minecraft.advancements.Advancement.Builder; -import net.minecraft.advancements.AdvancementRewards; -import net.minecraft.advancements.FrameType; -import net.minecraft.advancements.RequirementsStrategy; import net.minecraft.advancements.critereon.*; -import net.minecraft.core.Registry; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.common.Tags; import java.util.function.Consumer; @@ -31,66 +29,887 @@ public class ImmersiveWeaponsAdvancements implements Consumer consumer) { // Root advancement - Advancement root = Builder.advancement().display(DeferredRegistryHandler.TESLA_SWORD.get(), new TranslatableComponent("advancements.immersiveweapons.root.title").withStyle(ChatFormatting.RED), new TranslatableComponent("advancements.immersiveweapons.root.description"), new ResourceLocation(ImmersiveWeapons.MOD_ID, "textures/block/red_stained_bulletproof_glass.png"), FrameType.TASK, false, false, false).addCriterion("exist", LocationTrigger.TriggerInstance.located(LocationPredicate.inDimension(Level.OVERWORLD))).save(consumer, "immersiveweapons:root"); + Advancement root = Builder.advancement() + .display(DeferredRegistryHandler.TESLA_SWORD.get(), + new TranslatableComponent("advancements.immersiveweapons.root.title") + .withStyle(ChatFormatting.RED), + new TranslatableComponent("advancements.immersiveweapons.root.description"), + new ResourceLocation(ImmersiveWeapons.MOD_ID, "textures/block/red_stained_bulletproof_glass.png"), + FrameType.TASK, false, false, false) + .addCriterion("exist", + LocationTrigger.TriggerInstance.located(LocationPredicate.inDimension(Level.OVERWORLD))) + .rewards(AdvancementRewards.Builder.loot(new ResourceLocation(ImmersiveWeapons.MOD_ID, "grant_encyclopedia_book_on_first_join"))) + .save(consumer, "immersiveweapons:root"); // Molten advancements - Advancement obtain_molten_shard = Builder.advancement().parent(root).display(DeferredRegistryHandler.MOLTEN_SHARD.get(), new TranslatableComponent("advancements.immersiveweapons.molten_shard.title"), new TranslatableComponent("advancements.immersiveweapons.molten_shard.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_SHARD.get())).save(consumer, "immersiveweapons:molten_shard"); - Advancement smelt_molten_ingot = Builder.advancement().parent(obtain_molten_shard).display(DeferredRegistryHandler.MOLTEN_INGOT.get(), new TranslatableComponent("advancements.immersiveweapons.molten_ingot.title"), new TranslatableComponent("advancements.immersiveweapons.molten_ingot.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_INGOT.get())).save(consumer, "immersiveweapons:molten_ingot"); - Builder.advancement().parent(smelt_molten_ingot).display(DeferredRegistryHandler.MOLTEN_SWORD.get(), new TranslatableComponent("advancements.immersiveweapons.molten_sword.title"), new TranslatableComponent("advancements.immersiveweapons.molten_sword.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_SWORD.get())).rewards(AdvancementRewards.Builder.experience(35)).save(consumer, "immersiveweapons:molten_sword"); - Builder.advancement().parent(smelt_molten_ingot).display(DeferredRegistryHandler.MOLTEN_PICKAXE.get(), new TranslatableComponent("advancements.immersiveweapons.play_with_fire.title"), new TranslatableComponent("advancements.immersiveweapons.play_with_fire.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_SWORD.get(), DeferredRegistryHandler.MOLTEN_PICKAXE.get(), DeferredRegistryHandler.MOLTEN_AXE.get(), DeferredRegistryHandler.MOLTEN_SHOVEL.get(), DeferredRegistryHandler.MOLTEN_HOE.get())).rewards(AdvancementRewards.Builder.experience(100)).save(consumer, "immersiveweapons:play_with_fire"); - Advancement craft_molten_plate = Builder.advancement().parent(smelt_molten_ingot).display(DeferredRegistryHandler.MOLTEN_PLATE.get(), new TranslatableComponent("advancements.immersiveweapons.molten_plate.title"), new TranslatableComponent("advancements.immersiveweapons.molten_plate.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_PLATE.get())).save(consumer, "immersiveweapons:molten_plate"); - Advancement warm_and_toasty = Builder.advancement().parent(craft_molten_plate).display(DeferredRegistryHandler.MOLTEN_HELMET.get(), new TranslatableComponent("advancements.immersiveweapons.warm_and_toasty.title"), new TranslatableComponent("advancements.immersiveweapons.warm_and_toasty.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_HELMET.get(), DeferredRegistryHandler.MOLTEN_CHESTPLATE.get(), DeferredRegistryHandler.MOLTEN_LEGGINGS.get(), DeferredRegistryHandler.MOLTEN_BOOTS.get())).rewards(AdvancementRewards.Builder.experience(100)).save(consumer, "immersiveweapons:warm_and_toasty"); - Builder.advancement().parent(warm_and_toasty).display(Items.LAVA_BUCKET, new TranslatableComponent("advancements.immersiveweapons.lava_bath.title"), new TranslatableComponent("advancements.immersiveweapons.lava_bath.description"), null, FrameType.CHALLENGE, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_HELMET.get(), DeferredRegistryHandler.MOLTEN_CHESTPLATE.get(), DeferredRegistryHandler.MOLTEN_LEGGINGS.get(), DeferredRegistryHandler.MOLTEN_BOOTS.get())).addCriterion("swim", EnterBlockTrigger.TriggerInstance.entersBlock(Blocks.LAVA)).rewards(AdvancementRewards.Builder.experience(35)).save(consumer, "immersiveweapons:lava_bath"); + Advancement obtainMoltenShard = Builder.advancement().parent(root) + .display(DeferredRegistryHandler.MOLTEN_SHARD.get(), + new TranslatableComponent("advancements.immersiveweapons.molten_shard.title"), + new TranslatableComponent("advancements.immersiveweapons.molten_shard.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_SHARD.get())) + .save(consumer, "immersiveweapons:molten_shard"); + + Advancement smeltMoltenIngot = Builder.advancement().parent(obtainMoltenShard) + .display(DeferredRegistryHandler.MOLTEN_INGOT.get(), + new TranslatableComponent("advancements.immersiveweapons.molten_ingot.title"), + new TranslatableComponent("advancements.immersiveweapons.molten_ingot.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_INGOT.get())) + .save(consumer, "immersiveweapons:molten_ingot"); + + Builder.advancement().parent(smeltMoltenIngot) + .display(DeferredRegistryHandler.MOLTEN_SWORD.get(), + new TranslatableComponent("advancements.immersiveweapons.molten_sword.title"), + new TranslatableComponent("advancements.immersiveweapons.molten_sword.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_SWORD.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:molten_sword"); + + Builder.advancement().parent(smeltMoltenIngot) + .display(DeferredRegistryHandler.MOLTEN_PICKAXE.get(), + new TranslatableComponent("advancements.immersiveweapons.molten_pickaxe.title"), + new TranslatableComponent("advancements.immersiveweapons.molten_pickaxe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_PICKAXE.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:molten_pickaxe"); + + Builder.advancement().parent(smeltMoltenIngot) + .display(DeferredRegistryHandler.MOLTEN_AXE.get(), + new TranslatableComponent("advancements.immersiveweapons.molten_axe.title"), + new TranslatableComponent("advancements.immersiveweapons.molten_axe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_AXE.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:molten_axe"); + + Builder.advancement().parent(smeltMoltenIngot) + .display(DeferredRegistryHandler.MOLTEN_SHOVEL.get(), + new TranslatableComponent("advancements.immersiveweapons.molten_shovel.title"), + new TranslatableComponent("advancements.immersiveweapons.molten_shovel.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_SHOVEL.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:molten_shovel"); + + Builder.advancement().parent(smeltMoltenIngot) + .display(DeferredRegistryHandler.MOLTEN_HOE.get(), + new TranslatableComponent("advancements.immersiveweapons.molten_hoe.title"), + new TranslatableComponent("advancements.immersiveweapons.molten_hoe.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_HOE.get())) + .rewards(AdvancementRewards.Builder.experience(50)) + .save(consumer, "immersiveweapons:molten_hoe"); + + Builder.advancement().parent(smeltMoltenIngot) // TODO: Tagged for advancement rename + .display(DeferredRegistryHandler.MOLTEN_BLOCK_ITEM.get(), + new TranslatableComponent("advancements.immersiveweapons.play_with_fire.title"), + new TranslatableComponent("advancements.immersiveweapons.play_with_fire.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("have_advancements", + LocationTrigger.TriggerInstance.located( + EntityPredicate.Builder.entity().player( + PlayerPredicate.Builder.player().checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "molten_sword"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "molten_pickaxe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "molten_axe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "molten_shovel"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "molten_hoe"), true + ).build() + ).build() + ) + ) + .rewards(AdvancementRewards.Builder.experience(150)) + .save(consumer, "immersiveweapons:play_with_fire"); + + Advancement warmAndToasty = Builder.advancement().parent(smeltMoltenIngot) // TODO: Tagged for advancement rename + .display(DeferredRegistryHandler.MOLTEN_HELMET.get(), + new TranslatableComponent("advancements.immersiveweapons.warm_and_toasty.title"), + new TranslatableComponent("advancements.immersiveweapons.warm_and_toasty.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_HELMET.get(), + DeferredRegistryHandler.MOLTEN_CHESTPLATE.get(), DeferredRegistryHandler.MOLTEN_LEGGINGS.get(), + DeferredRegistryHandler.MOLTEN_BOOTS.get())) + .rewards(AdvancementRewards.Builder.experience(100)) + .save(consumer, "immersiveweapons:warm_and_toasty"); + + Builder.advancement().parent(warmAndToasty) + .display(Items.LAVA_BUCKET, + new TranslatableComponent("advancements.immersiveweapons.lava_bath.title"), + new TranslatableComponent("advancements.immersiveweapons.lava_bath.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_HELMET.get(), + DeferredRegistryHandler.MOLTEN_CHESTPLATE.get(), DeferredRegistryHandler.MOLTEN_LEGGINGS.get(), + DeferredRegistryHandler.MOLTEN_BOOTS.get())) + .addCriterion("swim", EnterBlockTrigger.TriggerInstance.entersBlock(Blocks.LAVA)) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:lava_bath"); // Tesla Advancements - Advancement craft_conductive_alloy = Builder.advancement().parent(root).display(DeferredRegistryHandler.CONDUCTIVE_ALLOY.get(), new TranslatableComponent("advancements.immersiveweapons.conductive_alloy.title"), new TranslatableComponent("advancements.immersiveweapons.conductive_alloy.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.CONDUCTIVE_ALLOY.get())).save(consumer, "immersiveweapons:conductive_alloy"); - Advancement obtain_electric_ingot = Builder.advancement().parent(craft_conductive_alloy).display(DeferredRegistryHandler.ELECTRIC_INGOT.get(), new TranslatableComponent("advancements.immersiveweapons.electric_ingot.title"), new TranslatableComponent("advancements.immersiveweapons.electric_ingot.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.ELECTRIC_INGOT.get())).save(consumer, "immersiveweapons:electric_ingot"); - Advancement craft_tesla_ingot = Builder.advancement().parent(obtain_electric_ingot).display(DeferredRegistryHandler.TESLA_INGOT.get(), new TranslatableComponent("advancements.immersiveweapons.tesla_ingot.title"), new TranslatableComponent("advancements.immersiveweapons.tesla_ingot.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_INGOT.get())).save(consumer, "immersiveweapons:tesla_ingot"); - Builder.advancement().parent(craft_tesla_ingot).display(DeferredRegistryHandler.TESLA_SWORD.get(), new TranslatableComponent("advancements.immersiveweapons.tesla_sword.title"), new TranslatableComponent("advancements.immersiveweapons.tesla_sword.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_SWORD.get())).rewards(AdvancementRewards.Builder.experience(35)).save(consumer, "immersiveweapons:tesla_sword"); - Builder.advancement().parent(craft_tesla_ingot).display(DeferredRegistryHandler.TESLA_PICKAXE.get(), new TranslatableComponent("advancements.immersiveweapons.energized.title"), new TranslatableComponent("advancements.immersiveweapons.energized.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_SWORD.get(), DeferredRegistryHandler.TESLA_PICKAXE.get(), DeferredRegistryHandler.TESLA_AXE.get(), DeferredRegistryHandler.TESLA_SHOVEL.get(), DeferredRegistryHandler.TESLA_HOE.get())).rewards(AdvancementRewards.Builder.experience(100)).save(consumer, "immersiveweapons:energized"); - Builder.advancement().parent(craft_tesla_ingot).display(DeferredRegistryHandler.TESLA_HOE.get(), new TranslatableComponent("advancements.immersiveweapons.rich_no_more.title"), new TranslatableComponent("advancements.immersiveweapons.rich_no_more.description"), null, FrameType.CHALLENGE, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_HOE.get())).rewards(AdvancementRewards.Builder.experience(65)).save(consumer, "immersiveweapons:rich_no_more"); - Builder.advancement().parent(craft_tesla_ingot).display(DeferredRegistryHandler.TESLA_HELMET.get(), new TranslatableComponent("advancements.immersiveweapons.tesla_coil.title"), new TranslatableComponent("advancements.immersiveweapons.tesla_coil.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_HELMET.get(), DeferredRegistryHandler.TESLA_CHESTPLATE.get(), DeferredRegistryHandler.TESLA_LEGGINGS.get(), DeferredRegistryHandler.TESLA_BOOTS.get())).rewards(AdvancementRewards.Builder.experience(100)).save(consumer, "immersiveweapons:tesla_coil"); - Builder.advancement().parent(craft_tesla_ingot).display(DeferredRegistryHandler.TESLA_SYNTHESIZER.get(), new TranslatableComponent("advancements.immersiveweapons.tesla_synthesizer.title"), new TranslatableComponent("advancements.immersiveweapons.tesla_synthesizer.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_SYNTHESIZER.get())).rewards(AdvancementRewards.Builder.experience(150)).save(consumer, "immersiveweapons:tesla_synthesizer"); + Advancement craftConductiveAlloy = Builder.advancement().parent(root) + .display(DeferredRegistryHandler.CONDUCTIVE_ALLOY.get(), + new TranslatableComponent("advancements.immersiveweapons.conductive_alloy.title"), + new TranslatableComponent("advancements.immersiveweapons.conductive_alloy.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.CONDUCTIVE_ALLOY.get())) + .save(consumer, "immersiveweapons:conductive_alloy"); + + Advancement obtainElectricIngot = Builder.advancement().parent(craftConductiveAlloy) + .display(DeferredRegistryHandler.ELECTRIC_INGOT.get(), + new TranslatableComponent("advancements.immersiveweapons.electric_ingot.title"), + new TranslatableComponent("advancements.immersiveweapons.electric_ingot.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.ELECTRIC_INGOT.get())) + .save(consumer, "immersiveweapons:electric_ingot"); + + Advancement craftTeslaIngot = Builder.advancement().parent(obtainElectricIngot) + .display(DeferredRegistryHandler.TESLA_INGOT.get(), + new TranslatableComponent("advancements.immersiveweapons.tesla_ingot.title"), + new TranslatableComponent("advancements.immersiveweapons.tesla_ingot.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_INGOT.get())) + .save(consumer, "immersiveweapons:tesla_ingot"); + + Builder.advancement().parent(craftTeslaIngot) + .display(DeferredRegistryHandler.TESLA_SWORD.get(), + new TranslatableComponent("advancements.immersiveweapons.tesla_sword.title"), + new TranslatableComponent("advancements.immersiveweapons.tesla_sword.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_SWORD.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:tesla_sword"); + + Builder.advancement().parent(craftTeslaIngot) + .display(DeferredRegistryHandler.TESLA_PICKAXE.get(), + new TranslatableComponent("advancements.immersiveweapons.tesla_pickaxe.title"), + new TranslatableComponent("advancements.immersiveweapons.tesla_pickaxe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_PICKAXE.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:tesla_pickaxe"); + + Builder.advancement().parent(craftTeslaIngot) + .display(DeferredRegistryHandler.TESLA_AXE.get(), + new TranslatableComponent("advancements.immersiveweapons.tesla_axe.title"), + new TranslatableComponent("advancements.immersiveweapons.tesla_axe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_AXE.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:tesla_axe"); + + Builder.advancement().parent(craftTeslaIngot) + .display(DeferredRegistryHandler.TESLA_SHOVEL.get(), + new TranslatableComponent("advancements.immersiveweapons.tesla_shovel.title"), + new TranslatableComponent("advancements.immersiveweapons.tesla_shovel.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_SHOVEL.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:tesla_shovel"); + + Builder.advancement().parent(craftTeslaIngot) + .display(DeferredRegistryHandler.TESLA_HOE.get(), + new TranslatableComponent("advancements.immersiveweapons.tesla_hoe.title"), + new TranslatableComponent("advancements.immersiveweapons.tesla_hoe.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_HOE.get())) + .rewards(AdvancementRewards.Builder.experience(65)) + .save(consumer, "immersiveweapons:tesla_hoe"); + + Builder.advancement().parent(craftTeslaIngot) // TODO: Tagged for advancement rename + .display(DeferredRegistryHandler.TESLA_BLOCK_ITEM.get(), + new TranslatableComponent("advancements.immersiveweapons.energized.title"), + new TranslatableComponent("advancements.immersiveweapons.energized.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("have_advancements", + LocationTrigger.TriggerInstance.located( + EntityPredicate.Builder.entity().player( + PlayerPredicate.Builder.player().checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_sword"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_pickaxe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_axe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_shovel"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_hoe"), true + ).build() + ).build() + ) + ) + .rewards(AdvancementRewards.Builder.experience(150)) + .save(consumer, "immersiveweapons:energized"); + + Builder.advancement().parent(craftTeslaIngot) // TODO: Tagged for advancement rename + .display(DeferredRegistryHandler.TESLA_HELMET.get(), + new TranslatableComponent("advancements.immersiveweapons.tesla_coil.title"), + new TranslatableComponent("advancements.immersiveweapons.tesla_coil.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_HELMET.get(), + DeferredRegistryHandler.TESLA_CHESTPLATE.get(), DeferredRegistryHandler.TESLA_LEGGINGS.get(), + DeferredRegistryHandler.TESLA_BOOTS.get())) + .rewards(AdvancementRewards.Builder.experience(100)) + .save(consumer, "immersiveweapons:tesla_coil"); + + Builder.advancement().parent(craftTeslaIngot) + .display(DeferredRegistryHandler.TESLA_SYNTHESIZER.get(), + new TranslatableComponent("advancements.immersiveweapons.tesla_synthesizer.title"), + new TranslatableComponent("advancements.immersiveweapons.tesla_synthesizer.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.TESLA_SYNTHESIZER.get())) + .rewards(AdvancementRewards.Builder.experience(150)) + .save(consumer, "immersiveweapons:tesla_synthesizer"); // Ventus Advancements - Advancement obtain_ventus_shard = Builder.advancement().parent(root).display(DeferredRegistryHandler.VENTUS_SHARD.get(), new TranslatableComponent("advancements.immersiveweapons.ventus_shard.title"), new TranslatableComponent("advancements.immersiveweapons.ventus_shard.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_SHARD.get())).save(consumer, "immersiveweapons:ventus_shard"); - Builder.advancement().parent(obtain_ventus_shard).display(DeferredRegistryHandler.VENTUS_SWORD.get(), new TranslatableComponent("advancements.immersiveweapons.ventus_sword.title"), new TranslatableComponent("advancements.immersiveweapons.ventus_sword.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_SWORD.get())).rewards(AdvancementRewards.Builder.experience(35)).save(consumer, "immersiveweapons:ventus_sword"); - Builder.advancement().parent(obtain_ventus_shard).display(DeferredRegistryHandler.VENTUS_PICKAXE.get(), new TranslatableComponent("advancements.immersiveweapons.pretty_windy.title"), new TranslatableComponent("advancements.immersiveweapons.pretty_windy.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_SWORD.get(), DeferredRegistryHandler.VENTUS_PICKAXE.get(), DeferredRegistryHandler.VENTUS_AXE.get(), DeferredRegistryHandler.VENTUS_SHOVEL.get(), DeferredRegistryHandler.VENTUS_HOE.get())).rewards(AdvancementRewards.Builder.experience(100)).save(consumer, "immersiveweapons:pretty_windy"); - Builder.advancement().parent(obtain_ventus_shard).display(DeferredRegistryHandler.VENTUS_HELMET.get(), new TranslatableComponent("advancements.immersiveweapons.almost_flying.title"), new TranslatableComponent("advancements.immersiveweapons.almost_flying.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_HELMET.get(), DeferredRegistryHandler.VENTUS_CHESTPLATE.get(), DeferredRegistryHandler.VENTUS_LEGGINGS.get(), DeferredRegistryHandler.VENTUS_BOOTS.get())).rewards(AdvancementRewards.Builder.experience(100)).save(consumer, "immersiveweapons:almost_flying"); - Advancement craft_ventus_staff_core = Builder.advancement().parent(obtain_ventus_shard).display(DeferredRegistryHandler.VENTUS_STAFF_CORE.get(), new TranslatableComponent("advancements.immersiveweapons.ventus_staff_core.title"), new TranslatableComponent("advancements.immersiveweapons.ventus_staff_core.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_STAFF_CORE.get())).save(consumer, "immersiveweapons:ventus_staff_core"); - Builder.advancement().parent(craft_ventus_staff_core).display(DeferredRegistryHandler.VENTUS_STAFF.get(), new TranslatableComponent("advancements.immersiveweapons.ventus_staff.title"), new TranslatableComponent("advancements.immersiveweapons.ventus_staff.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_STAFF.get())).rewards(AdvancementRewards.Builder.experience(35)).save(consumer, "immersiveweapons:ventus_staff"); + Advancement obtainVentusShard = Builder.advancement().parent(root) + .display(DeferredRegistryHandler.VENTUS_SHARD.get(), + new TranslatableComponent("advancements.immersiveweapons.ventus_shard.title"), + new TranslatableComponent("advancements.immersiveweapons.ventus_shard.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_SHARD.get())) + .save(consumer, "immersiveweapons:ventus_shard"); + + Builder.advancement().parent(obtainVentusShard) + .display(DeferredRegistryHandler.VENTUS_SWORD.get(), + new TranslatableComponent("advancements.immersiveweapons.ventus_sword.title"), + new TranslatableComponent("advancements.immersiveweapons.ventus_sword.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_SWORD.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:ventus_sword"); + + Builder.advancement().parent(obtainVentusShard) + .display(DeferredRegistryHandler.VENTUS_PICKAXE.get(), + new TranslatableComponent("advancements.immersiveweapons.ventus_pickaxe.title"), + new TranslatableComponent("advancements.immersiveweapons.ventus_pickaxe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_PICKAXE.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:ventus_pickaxe"); + + Builder.advancement().parent(obtainVentusShard) + .display(DeferredRegistryHandler.VENTUS_AXE.get(), + new TranslatableComponent("advancements.immersiveweapons.ventus_axe.title"), + new TranslatableComponent("advancements.immersiveweapons.ventus_axe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_AXE.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:ventus_axe"); + + Builder.advancement().parent(obtainVentusShard) + .display(DeferredRegistryHandler.VENTUS_SHOVEL.get(), + new TranslatableComponent("advancements.immersiveweapons.ventus_shovel.title"), + new TranslatableComponent("advancements.immersiveweapons.ventus_shovel.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_SHOVEL.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:ventus_shovel"); + + Builder.advancement().parent(obtainVentusShard) + .display(DeferredRegistryHandler.VENTUS_HOE.get(), + new TranslatableComponent("advancements.immersiveweapons.ventus_hoe.title"), + new TranslatableComponent("advancements.immersiveweapons.ventus_hoe.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_HOE.get())) + .rewards(AdvancementRewards.Builder.experience(50)) + .save(consumer, "immersiveweapons:ventus_hoe"); + + Builder.advancement().parent(obtainVentusShard) // TODO: Tagged for advancement rename + .display(DeferredRegistryHandler.VENTUS_ORE_ITEM.get(), + new TranslatableComponent("advancements.immersiveweapons.pretty_windy.title"), + new TranslatableComponent("advancements.immersiveweapons.pretty_windy.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("have_advancements", + LocationTrigger.TriggerInstance.located( + EntityPredicate.Builder.entity().player( + PlayerPredicate.Builder.player().checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "ventus_sword"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "ventus_pickaxe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "ventus_axe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "ventus_shovel"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "ventus_hoe"), true + ).build() + ).build() + ) + ) + .rewards(AdvancementRewards.Builder.experience(150)) + .save(consumer, "immersiveweapons:pretty_windy"); + + Builder.advancement().parent(obtainVentusShard) // TODO: Tagged for advancement rename + .display(DeferredRegistryHandler.VENTUS_HELMET.get(), + new TranslatableComponent("advancements.immersiveweapons.almost_flying.title"), + new TranslatableComponent("advancements.immersiveweapons.almost_flying.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_HELMET.get(), + DeferredRegistryHandler.VENTUS_CHESTPLATE.get(), DeferredRegistryHandler.VENTUS_LEGGINGS.get(), + DeferredRegistryHandler.VENTUS_BOOTS.get())) + .rewards(AdvancementRewards.Builder.experience(100)) + .save(consumer, "immersiveweapons:almost_flying"); + + Advancement craftVentusStaffCore = Builder.advancement().parent(obtainVentusShard) + .display(DeferredRegistryHandler.VENTUS_STAFF_CORE.get(), + new TranslatableComponent("advancements.immersiveweapons.ventus_staff_core.title"), + new TranslatableComponent("advancements.immersiveweapons.ventus_staff_core.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_STAFF_CORE.get())) + .save(consumer, "immersiveweapons:ventus_staff_core"); + + Builder.advancement().parent(craftVentusStaffCore) + .display(DeferredRegistryHandler.VENTUS_STAFF.get(), + new TranslatableComponent("advancements.immersiveweapons.ventus_staff.title"), + new TranslatableComponent("advancements.immersiveweapons.ventus_staff.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_STAFF.get())) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:ventus_staff"); // Tool advancements - Advancement craft_tool_rod = Builder.advancement().parent(root).display(DeferredRegistryHandler.WOOD_TOOL_ROD.get(), new TranslatableComponent("advancements.immersiveweapons.tool_rod.title"), new TranslatableComponent("advancements.immersiveweapons.tool_rod.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_TOOL_ROD.get())).save(consumer, "immersiveweapons:tool_rod"); - Builder.advancement().parent(craft_tool_rod).display(DeferredRegistryHandler.IRON_PIKE.get(), new TranslatableComponent("advancements.immersiveweapons.pike.title"), new TranslatableComponent("advancements.immersiveweapons.pike.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_PIKE.get())).addCriterion("hold1", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.STONE_PIKE.get())).addCriterion("hold2", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.IRON_PIKE.get())).addCriterion("hold3", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_PIKE.get())).addCriterion("hold4", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.GOLD_PIKE.get())).addCriterion("hold5", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.DIAMOND_PIKE.get())).addCriterion("hold6", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.NETHERITE_PIKE.get())).addCriterion("hold7", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_PIKE.get())).requirements(RequirementsStrategy.OR).save(consumer, "immersiveweapons:pike"); + Advancement craftToolRod = Builder.advancement().parent(root) + .display(DeferredRegistryHandler.WOOD_TOOL_ROD.get(), + new TranslatableComponent("advancements.immersiveweapons.tool_rod.title"), + new TranslatableComponent("advancements.immersiveweapons.tool_rod.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_TOOL_ROD.get())) + .save(consumer, "immersiveweapons:tool_rod"); + + Builder.advancement().parent(craftToolRod) + .display(DeferredRegistryHandler.IRON_PIKE.get(), + new TranslatableComponent("advancements.immersiveweapons.pike.title"), + new TranslatableComponent("advancements.immersiveweapons.pike.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_PIKE.get())) + .addCriterion("hold1", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.STONE_PIKE.get())) + .addCriterion("hold2", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.IRON_PIKE.get())) + .addCriterion("hold3", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_PIKE.get())) + .addCriterion("hold4", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.GOLD_PIKE.get())) + .addCriterion("hold5", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.DIAMOND_PIKE.get())) + .addCriterion("hold6", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.NETHERITE_PIKE.get())) + .addCriterion("hold7", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_PIKE.get())) + .requirements(RequirementsStrategy.OR) + .save(consumer, "immersiveweapons:pike"); + + Advancement shards = Builder.advancement().parent(root) + .display(DeferredRegistryHandler.STONE_SHARD.get(), + new TranslatableComponent("advancements.immersiveweapons.shards.title"), + new TranslatableComponent("advancements.immersiveweapons.shards.description"), + null, FrameType.TASK, false, false, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_SHARD.get())) + .addCriterion("hold1", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.OBSIDIAN_SHARD.get())) + .addCriterion("hold2", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.STONE_SHARD.get())) + .addCriterion("hold3", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_SHARD.get())) + .addCriterion("hold4", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.DIAMOND_SHARD.get())) + .addCriterion("hold5", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_SHARD.get())) + .requirements(RequirementsStrategy.OR) + .save(consumer, "immersiveweapons:shards"); + + Builder.advancement().parent(shards) + .display(DeferredRegistryHandler.WOOD_SHARD.get(), + new TranslatableComponent("advancements.immersiveweapons.wood_shard.title"), + new TranslatableComponent("advancements.immersiveweapons.wood_shard.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_SHARD.get())) + .save(consumer, "immersiveweapons:wood_shard"); + + Builder.advancement().parent(shards) + .display(DeferredRegistryHandler.STONE_SHARD.get(), + new TranslatableComponent("advancements.immersiveweapons.stone_shard.title"), + new TranslatableComponent("advancements.immersiveweapons.stone_shard.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.STONE_SHARD.get())) + .save(consumer, "immersiveweapons:stone_shard"); - Builder.advancement().parent(root).display(DeferredRegistryHandler.STONE_SHARD.get(), new TranslatableComponent("advancements.immersiveweapons.shards.title"), new TranslatableComponent("advancements.immersiveweapons.shards.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLTEN_SHARD.get())).addCriterion("hold1", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.OBSIDIAN_SHARD.get())).addCriterion("hold2", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.STONE_SHARD.get())).addCriterion("hold3", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_SHARD.get())).addCriterion("hold4", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.DIAMOND_SHARD.get())).addCriterion("hold5", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.VENTUS_SHARD.get())).requirements(RequirementsStrategy.OR).save(consumer, "immersiveweapons:shards"); - Builder.advancement().parent(root).display(DeferredRegistryHandler.NETHERITE_ARROW.get(), new TranslatableComponent("advancements.immersiveweapons.netherite_projectile.title"), new TranslatableComponent("advancements.immersiveweapons.netherite_projectile.description"), null, FrameType.CHALLENGE, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.NETHERITE_ARROW.get())).addCriterion("hold1", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.NETHERITE_MUSKET_BALL.get())).rewards(AdvancementRewards.Builder.experience(50)).save(consumer, "immersiveweapons:netherite_projectile"); + Builder.advancement().parent(shards) + .display(DeferredRegistryHandler.DIAMOND_SHARD.get(), + new TranslatableComponent("advancements.immersiveweapons.diamond_shard.title"), + new TranslatableComponent("advancements.immersiveweapons.diamond_shard.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.DIAMOND_SHARD.get())) + .save(consumer, "immersiveweapons:diamond_shard"); - Advancement craft_blank_blueprint = Builder.advancement().parent(root).display(DeferredRegistryHandler.BLANK_BLUEPRINT.get(), new TranslatableComponent("advancements.immersiveweapons.blueprint.title"), new TranslatableComponent("advancements.immersiveweapons.blueprint.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BLANK_BLUEPRINT.get())).save(consumer, "immersiveweapons:blueprint"); - Builder.advancement().parent(craft_blank_blueprint).display(DeferredRegistryHandler.FLINTLOCK_PISTOL.get(), new TranslatableComponent("advancements.immersiveweapons.flintlock_pistol.title"), new TranslatableComponent("advancements.immersiveweapons.flintlock_pistol.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.FLINTLOCK_PISTOL.get())).save(consumer, "immersiveweapons:flintlock_pistol"); - Builder.advancement().parent(craft_blank_blueprint).display(DeferredRegistryHandler.BLUNDERBUSS.get(), new TranslatableComponent("advancements.immersiveweapons.blunderbuss.title"), new TranslatableComponent("advancements.immersiveweapons.blunderbuss.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BLUNDERBUSS.get())).save(consumer, "immersiveweapons:blunderbuss"); - Builder.advancement().parent(craft_blank_blueprint).display(DeferredRegistryHandler.SMOKE_BOMB.get(), new TranslatableComponent("advancements.immersiveweapons.smoke_bomb.title"), new TranslatableComponent("advancements.immersiveweapons.smoke_bomb.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.SMOKE_BOMB.get())).save(consumer, "immersiveweapons:smoke_bomb"); + Builder.advancement().parent(shards) + .display(DeferredRegistryHandler.OBSIDIAN_SHARD.get(), + new TranslatableComponent("advancements.immersiveweapons.obsidian_shard.title"), + new TranslatableComponent("advancements.immersiveweapons.obsidian_shard.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.OBSIDIAN_SHARD.get())) + .save(consumer, "immersiveweapons:obsidian_shard"); - Advancement craft_alcohol = Builder.advancement().parent(root).display(DeferredRegistryHandler.BOTTLE_OF_ALCOHOL.get(), new TranslatableComponent("advancements.immersiveweapons.bottle_of_alcohol.title"), new TranslatableComponent("advancements.immersiveweapons.bottle_of_alcohol.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BOTTLE_OF_ALCOHOL.get())).save(consumer, "immersiveweapons:bottle_of_alcohol"); - Builder.advancement().parent(craft_alcohol).display(DeferredRegistryHandler.MOLOTOV_COCKTAIL.get(), new TranslatableComponent("advancements.immersiveweapons.molotov_cocktail.title"), new TranslatableComponent("advancements.immersiveweapons.molotov_cocktail.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLOTOV_COCKTAIL.get())).save(consumer, "immersiveweapons:molotov_cocktail"); + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.NETHERITE_ARROW.get(), + new TranslatableComponent("advancements.immersiveweapons.netherite_projectile.title"), + new TranslatableComponent("advancements.immersiveweapons.netherite_projectile.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.NETHERITE_ARROW.get())) + .addCriterion("hold1", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.NETHERITE_MUSKET_BALL.get())) + .rewards(AdvancementRewards.Builder.experience(50)) + .save(consumer, "immersiveweapons:netherite_projectile"); - Advancement craft_bandage = Builder.advancement().parent(root).display(DeferredRegistryHandler.BANDAGE.get(), new TranslatableComponent("advancements.immersiveweapons.bandage.title"), new TranslatableComponent("advancements.immersiveweapons.bandage.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BANDAGE.get())).save(consumer, "immersiveweapons:bandage"); - Builder.advancement().parent(craft_bandage).display(DeferredRegistryHandler.FIRST_AID_KIT.get(), new TranslatableComponent("advancements.immersiveweapons.first_aid_kit.title"), new TranslatableComponent("advancements.immersiveweapons.first_aid_kit.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.FIRST_AID_KIT.get())).save(consumer, "immersiveweapons:first_aid_kit"); + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.GOLD_MUSKET_BALL.get(), + new TranslatableComponent("advancements.immersiveweapons.musket_ball.title"), + new TranslatableComponent("advancements.immersiveweapons.musket_ball.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ImmersiveWeaponsItemTagGroups.MUSKET_BALLS).build())) + .save(consumer, "immersiveweapons:musket_ball"); - Builder.advancement().parent(root).display(DeferredRegistryHandler.IRON_GAUNTLET.get(), new TranslatableComponent("advancements.immersiveweapons.gauntlet.title"), new TranslatableComponent("advancements.immersiveweapons.gauntlet.description"), null, FrameType.TASK, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_GAUNTLET.get())).addCriterion("hold1", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.STONE_GAUNTLET.get())).addCriterion("hold2", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.GOLD_GAUNTLET.get())).addCriterion("hold3", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_GAUNTLET.get())).addCriterion("hold4", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.IRON_GAUNTLET.get())).addCriterion("hold5", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.DIAMOND_GAUNTLET.get())).addCriterion("hold6", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.NETHERITE_GAUNTLET.get())).addCriterion("hold7", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_GAUNTLET.get())).requirements(RequirementsStrategy.OR).save(consumer, "immersiveweapons:gauntlet"); + Advancement craftBlankBlueprint = Builder.advancement().parent(root) + .display(DeferredRegistryHandler.BLANK_BLUEPRINT.get(), + new TranslatableComponent("advancements.immersiveweapons.blueprint.title"), + new TranslatableComponent("advancements.immersiveweapons.blueprint.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BLANK_BLUEPRINT.get())) + .save(consumer, "immersiveweapons:blueprint"); + + Builder.advancement().parent(craftBlankBlueprint) + .display(DeferredRegistryHandler.FLINTLOCK_PISTOL.get(), + new TranslatableComponent("advancements.immersiveweapons.flintlock_pistol.title"), + new TranslatableComponent("advancements.immersiveweapons.flintlock_pistol.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.FLINTLOCK_PISTOL.get())) + .save(consumer, "immersiveweapons:flintlock_pistol"); + + Builder.advancement().parent(craftBlankBlueprint) + .display(DeferredRegistryHandler.BLUNDERBUSS.get(), + new TranslatableComponent("advancements.immersiveweapons.blunderbuss.title"), + new TranslatableComponent("advancements.immersiveweapons.blunderbuss.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BLUNDERBUSS.get())) + .save(consumer, "immersiveweapons:blunderbuss"); + + Builder.advancement().parent(craftBlankBlueprint) + .display(DeferredRegistryHandler.SMOKE_BOMB.get(), + new TranslatableComponent("advancements.immersiveweapons.smoke_bomb.title"), + new TranslatableComponent("advancements.immersiveweapons.smoke_bomb.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.SMOKE_BOMB.get())) + .save(consumer, "immersiveweapons:smoke_bomb"); + + + Advancement craftAlcohol = Builder.advancement().parent(root) + .display(DeferredRegistryHandler.BOTTLE_OF_ALCOHOL.get(), + new TranslatableComponent("advancements.immersiveweapons.bottle_of_alcohol.title"), + new TranslatableComponent("advancements.immersiveweapons.bottle_of_alcohol.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BOTTLE_OF_ALCOHOL.get())) + .save(consumer, "immersiveweapons:bottle_of_alcohol"); + Builder.advancement().parent(craftAlcohol) + .display(DeferredRegistryHandler.MOLOTOV_COCKTAIL.get(), + new TranslatableComponent("advancements.immersiveweapons.molotov_cocktail.title"), + new TranslatableComponent("advancements.immersiveweapons.molotov_cocktail.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.MOLOTOV_COCKTAIL.get())) + .save(consumer, "immersiveweapons:molotov_cocktail"); + + + Advancement craftBandage = Builder.advancement().parent(root) + .display(DeferredRegistryHandler.BANDAGE.get(), + new TranslatableComponent("advancements.immersiveweapons.bandage.title"), + new TranslatableComponent("advancements.immersiveweapons.bandage.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BANDAGE.get())) + .save(consumer, "immersiveweapons:bandage"); + Builder.advancement().parent(craftBandage) + .display(DeferredRegistryHandler.FIRST_AID_KIT.get(), + new TranslatableComponent("advancements.immersiveweapons.first_aid_kit.title"), + new TranslatableComponent("advancements.immersiveweapons.first_aid_kit.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.FIRST_AID_KIT.get())) + .save(consumer, "immersiveweapons:first_aid_kit"); + + + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.IRON_GAUNTLET.get(), + new TranslatableComponent("advancements.immersiveweapons.gauntlet.title"), + new TranslatableComponent("advancements.immersiveweapons.gauntlet.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOOD_GAUNTLET.get())) + .addCriterion("hold1", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.STONE_GAUNTLET.get())) + .addCriterion("hold2", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.GOLD_GAUNTLET.get())) + .addCriterion("hold3", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_GAUNTLET.get())) + .addCriterion("hold4", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.IRON_GAUNTLET.get())) + .addCriterion("hold5", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.DIAMOND_GAUNTLET.get())) + .addCriterion("hold6", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.NETHERITE_GAUNTLET.get())) + .addCriterion("hold7", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_GAUNTLET.get())) + .requirements(RequirementsStrategy.OR) + .save(consumer, "immersiveweapons:gauntlet"); + + // General ingot advancements + Advancement ingots = Builder.advancement().parent(root) + .display(Items.IRON_INGOT, + new TranslatableComponent("advancements.immersiveweapons.ingots.title"), + new TranslatableComponent("advancements.immersiveweapons.ingots.description"), + null, FrameType.TASK, false, false, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems( + ItemPredicate.Builder.item().of(Tags.Items.INGOTS).build()) + ) + .save(consumer, "immersiveweapons:ingots"); + + Builder.advancement().parent(root) + .display(Items.GOLD_NUGGET, + new TranslatableComponent("advancements.immersiveweapons.nuggets.title"), + new TranslatableComponent("advancements.immersiveweapons.nuggets.description"), + null, FrameType.TASK, false, false, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems( + ItemPredicate.Builder.item().of(Tags.Items.NUGGETS).build()) + ) + .save(consumer, "immersiveweapons:nuggets"); + + // Copper advancements + Advancement copperIngot = Builder.advancement().parent(ingots) + .display(Items.COPPER_INGOT, + new TranslatableComponent("advancements.immersiveweapons.copper_ingot.title"), + new TranslatableComponent("advancements.immersiveweapons.copper_ingot.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(Items.COPPER_INGOT)) + .save(consumer, "immersiveweapons:copper_ingot"); + + Builder.advancement().parent(copperIngot) + .display(DeferredRegistryHandler.COPPER_SWORD.get(), + new TranslatableComponent("advancements.immersiveweapons.copper_sword.title"), + new TranslatableComponent("advancements.immersiveweapons.copper_sword.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_SWORD.get())) + .save(consumer, "immersiveweapons:copper_sword"); + + Builder.advancement().parent(copperIngot) + .display(DeferredRegistryHandler.COPPER_PICKAXE.get(), + new TranslatableComponent("advancements.immersiveweapons.copper_pickaxe.title"), + new TranslatableComponent("advancements.immersiveweapons.copper_pickaxe.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_PICKAXE.get())) + .save(consumer, "immersiveweapons:copper_pickaxe"); + + Builder.advancement().parent(copperIngot) + .display(DeferredRegistryHandler.COPPER_AXE.get(), + new TranslatableComponent("advancements.immersiveweapons.copper_axe.title"), + new TranslatableComponent("advancements.immersiveweapons.copper_axe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_AXE.get())) + .save(consumer, "immersiveweapons:copper_axe"); + + Builder.advancement().parent(copperIngot) + .display(DeferredRegistryHandler.COPPER_SHOVEL.get(), + new TranslatableComponent("advancements.immersiveweapons.copper_shovel.title"), + new TranslatableComponent("advancements.immersiveweapons.copper_shovel.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_SHOVEL.get())) + .save(consumer, "immersiveweapons:copper_shovel"); + + Builder.advancement().parent(copperIngot) + .display(DeferredRegistryHandler.COPPER_HOE.get(), + new TranslatableComponent("advancements.immersiveweapons.copper_hoe.title"), + new TranslatableComponent("advancements.immersiveweapons.copper_hoe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COPPER_HOE.get())) + .save(consumer, "immersiveweapons:copper_hoe"); + + Builder.advancement().parent(copperIngot) + .display(Items.COPPER_BLOCK, + new TranslatableComponent("advancements.immersiveweapons.copper_tools.title"), + new TranslatableComponent("advancements.immersiveweapons.copper_tools.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("have_advancements", + LocationTrigger.TriggerInstance.located( + EntityPredicate.Builder.entity().player( + PlayerPredicate.Builder.player().checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "copper_sword"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "copper_pickaxe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "copper_axe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "copper_shovel"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "copper_hoe"), true + ).build() + ).build() + ) + ) + .rewards(AdvancementRewards.Builder.experience(25)) + .save(consumer, "immersiveweapons:copper_tools"); + + // Cobalt advancements + Advancement cobaltIngot = Builder.advancement().parent(ingots) + .display(DeferredRegistryHandler.COBALT_INGOT.get(), + new TranslatableComponent("advancements.immersiveweapons.cobalt_ingot.title"), + new TranslatableComponent("advancements.immersiveweapons.cobalt_ingot.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_INGOT.get())) + .save(consumer, "immersiveweapons:cobalt_ingot"); + + Builder.advancement().parent(cobaltIngot) + .display(DeferredRegistryHandler.COBALT_SWORD.get(), + new TranslatableComponent("advancements.immersiveweapons.cobalt_sword.title"), + new TranslatableComponent("advancements.immersiveweapons.cobalt_sword.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_SWORD.get())) + .save(consumer, "immersiveweapons:cobalt_sword"); + + Builder.advancement().parent(cobaltIngot) + .display(DeferredRegistryHandler.COBALT_PICKAXE.get(), + new TranslatableComponent("advancements.immersiveweapons.cobalt_pickaxe.title"), + new TranslatableComponent("advancements.immersiveweapons.cobalt_pickaxe.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_PICKAXE.get())) + .save(consumer, "immersiveweapons:cobalt_pickaxe"); + + Builder.advancement().parent(cobaltIngot) + .display(DeferredRegistryHandler.COBALT_AXE.get(), + new TranslatableComponent("advancements.immersiveweapons.cobalt_axe.title"), + new TranslatableComponent("advancements.immersiveweapons.cobalt_axe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_AXE.get())) + .save(consumer, "immersiveweapons:cobalt_axe"); + + Builder.advancement().parent(cobaltIngot) + .display(DeferredRegistryHandler.COBALT_SHOVEL.get(), + new TranslatableComponent("advancements.immersiveweapons.cobalt_shovel.title"), + new TranslatableComponent("advancements.immersiveweapons.cobalt_shovel.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_SHOVEL.get())) + .save(consumer, "immersiveweapons:cobalt_shovel"); + + Builder.advancement().parent(cobaltIngot) + .display(DeferredRegistryHandler.COBALT_HOE.get(), + new TranslatableComponent("advancements.immersiveweapons.cobalt_hoe.title"), + new TranslatableComponent("advancements.immersiveweapons.cobalt_hoe.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.COBALT_HOE.get())) + .save(consumer, "immersiveweapons:cobalt_hoe"); + + Builder.advancement().parent(cobaltIngot) + .display(DeferredRegistryHandler.COBALT_BLOCK_ITEM.get(), + new TranslatableComponent("advancements.immersiveweapons.cobalt_tools.title"), + new TranslatableComponent("advancements.immersiveweapons.cobalt_tools.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("have_advancements", + LocationTrigger.TriggerInstance.located( + EntityPredicate.Builder.entity().player( + PlayerPredicate.Builder.player().checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "cobalt_sword"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "cobalt_pickaxe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "cobalt_axe"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "cobalt_shovel"), true + ).checkAdvancementDone( + new ResourceLocation(ImmersiveWeapons.MOD_ID, "cobalt_hoe"), true + ).build() + ).build() + ) + ) + .rewards(AdvancementRewards.Builder.experience(35)) + .save(consumer, "immersiveweapons:cobalt_tools"); + + // Other ingots, without families + Builder.advancement().parent(ingots) + .display(Items.GOLD_INGOT, + new TranslatableComponent("advancements.immersiveweapons.gold_ingot.title"), + new TranslatableComponent("advancements.immersiveweapons.gold_ingot.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(Items.GOLD_INGOT)) + .save(consumer, "immersiveweapons:gold_ingot"); + + Builder.advancement().parent(ingots) + .display(Items.NETHERITE_INGOT, + new TranslatableComponent("advancements.immersiveweapons.netherite_ingot.title"), + new TranslatableComponent("advancements.immersiveweapons.netherite_ingot.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(Items.NETHERITE_INGOT)) + .save(consumer, "immersiveweapons:netherite_ingot"); // Other advancements - Builder.advancement().parent(root).display(DeferredRegistryHandler.USED_SYRINGE.get(), new TranslatableComponent("advancements.immersiveweapons.used_syringe.title"), new TranslatableComponent("advancements.immersiveweapons.used_syringe.description"), null, FrameType.CHALLENGE, true, true, true).addCriterion("hold", KilledTrigger.TriggerInstance.entityKilledPlayer(EntityPredicate.ANY, DamageSourcePredicate.Builder.damageType().source(EntityPredicate.Builder.entity().equipment(EntityEquipmentPredicate.Builder.equipment().mainhand(ItemPredicate.Builder.item().of(DeferredRegistryHandler.USED_SYRINGE.get()).build()).build())))).save(consumer, "immersiveweapons:used_syringe"); + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.USED_SYRINGE.get(), + new TranslatableComponent("advancements.immersiveweapons.used_syringe.title"), + new TranslatableComponent("advancements.immersiveweapons.used_syringe.description"), + null, FrameType.CHALLENGE, true, true, true) + .addCriterion("hold", + KilledTrigger.TriggerInstance.entityKilledPlayer(EntityPredicate.ANY, + DamageSourcePredicate.Builder.damageType() + .source(EntityPredicate.Builder.entity() + .equipment(EntityEquipmentPredicate.Builder.equipment() + .mainhand(ItemPredicate.Builder.item() + .of(DeferredRegistryHandler.USED_SYRINGE.get()) + .build()) + .build())))) + .save(consumer, "immersiveweapons:used_syringe"); + + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.BEAR_TRAP.get(), + new TranslatableComponent("advancements.immersiveweapons.traps.title"), + new TranslatableComponent("advancements.immersiveweapons.traps.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BEAR_TRAP.get())) + .addCriterion("hold1", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.PUNJI_STICKS.get())) + .addCriterion("hold2", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.LANDMINE.get())) + .addCriterion("hold3", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BEAR_TRAP.get())) + .addCriterion("hold4", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BARBED_WIRE.get())) + .addCriterion("hold5", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.SPIKE_TRAP.get())) + .addCriterion("hold6", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.PITFALL.get())) + .addCriterion("hold7", + InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOODEN_SPIKES.get())) + .requirements(RequirementsStrategy.OR) + .save(consumer, "immersiveweapons:traps"); + + Builder.advancement().parent(root) + .display(Items.OAK_PLANKS, + new TranslatableComponent("advancements.immersiveweapons.planks.title"), + new TranslatableComponent("advancements.immersiveweapons.planks.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item() + .of(ItemTags.PLANKS).build())) + .save(consumer, "immersiveweapons:planks"); + + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.MUD_ITEM.get(), + new TranslatableComponent("advancements.immersiveweapons.mud.title"), + new TranslatableComponent("advancements.immersiveweapons.mud.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item() + .of(DeferredRegistryHandler.MUD_ITEM.get()).build())) + .save(consumer, "immersiveweapons:mud"); + + Builder.advancement().parent(root) + .display(Items.BAMBOO, + new TranslatableComponent("advancements.immersiveweapons.bamboo.title"), + new TranslatableComponent("advancements.immersiveweapons.bamboo.description"), + null, FrameType.TASK, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item() + .of(Items.BAMBOO).build())) + .save(consumer, "immersiveweapons:bamboo"); - Builder.advancement().parent(root).display(DeferredRegistryHandler.BEAR_TRAP.get(), new TranslatableComponent("advancements.immersiveweapons.traps.title"), new TranslatableComponent("advancements.immersiveweapons.traps.description"), null, FrameType.GOAL, true, true, false).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BEAR_TRAP.get())).addCriterion("hold1", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.PUNJI_STICKS.get())).addCriterion("hold2", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.LANDMINE.get())).addCriterion("hold3", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BEAR_TRAP.get())).addCriterion("hold4", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.BARBED_WIRE.get())).addCriterion("hold5", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.SPIKE_TRAP.get())).addCriterion("hold6", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.PITFALL.get())).addCriterion("hold7", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WOODEN_SPIKES.get())).requirements(RequirementsStrategy.OR).save(consumer, "immersiveweapons:traps"); + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.CLOUD_MARBLE_ITEM.get(), + new TranslatableComponent("advancements.immersiveweapons.cloud_marble.title"), + new TranslatableComponent("advancements.immersiveweapons.cloud_marble.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item() + .of(DeferredRegistryHandler.CLOUD_MARBLE_ITEM.get()).build())) + .save(consumer, "immersiveweapons:cloud_marble"); - // Location advancements - Builder.advancement().parent(root).display(Blocks.SKELETON_SKULL, new TranslatableComponent("advancements.immersiveweapons.battlefield.title"), new TranslatableComponent("advancements.immersiveweapons.battlefield.description"), null, FrameType.TASK, true, true, false).addCriterion("visit", LocationTrigger.TriggerInstance.located(LocationPredicate.inBiome(ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(ImmersiveWeapons.MOD_ID, "battlefield"))))).rewards(AdvancementRewards.Builder.experience(50)).save(consumer, "immersiveweapons:battlefield"); + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.BIOHAZARD_BOX_ITEM.get(), + new TranslatableComponent("advancements.immersiveweapons.biohazard_box.title"), + new TranslatableComponent("advancements.immersiveweapons.biohazard_box.description"), + null, FrameType.GOAL, true, true, false) + .addCriterion("hold", + InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item() + .of(DeferredRegistryHandler.BIOHAZARD_BOX_ITEM.get()).build())) + .save(consumer, "immersiveweapons:biohazard_box"); - // Tiltros advancements - Advancement warrior_statue = Builder.advancement().parent(root).display(DeferredRegistryHandler.WARRIOR_STATUE_HEAD.get(), new TranslatableComponent("advancements.immersiveweapons.tiltros.warrior_statue.title"), new TranslatableComponent("advancements.immersiveweapons.tiltros.warrior_statue.description"), null, FrameType.TASK, true, true, true).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.WARRIOR_STATUE_BASE.get(), DeferredRegistryHandler.WARRIOR_STATUE_TORSO.get(), DeferredRegistryHandler.WARRIOR_STATUE_HEAD.get())).requirements(RequirementsStrategy.AND).save(consumer, "immersiveweapons:warrior_statue"); - Advancement azul_keystone = Builder.advancement().parent(warrior_statue).display(DeferredRegistryHandler.AZUL_KEYSTONE.get(), new TranslatableComponent("advancements.immersiveweapons.tiltros.azul_keystone.title"), new TranslatableComponent("advancements.immersiveweapons.tiltros.azul_keystone.description"), null, FrameType.TASK, true, true, true).addCriterion("hold", InventoryChangeTrigger.TriggerInstance.hasItems(DeferredRegistryHandler.AZUL_KEYSTONE.get())).save(consumer, "immersiveweapons:azul_keystone"); - Builder.advancement().parent(azul_keystone).display(DeferredRegistryHandler.AZUL_STAINED_ORCHID.get(), new TranslatableComponent("advancements.immersiveweapons.tiltros.tiltros.title"), new TranslatableComponent("advancements.immersiveweapons.tiltros.tiltros.description"), null, FrameType.GOAL, true, true, true).addCriterion("visit", LocationTrigger.TriggerInstance.located(LocationPredicate.inBiome(ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(ImmersiveWeapons.MOD_ID, "tiltros"))))).save(consumer, "immersiveweapons:tiltros"); + Builder.advancement().parent(root) + .display(DeferredRegistryHandler.CLOUD_ITEM.get(), + new TranslatableComponent("advancements.immersiveweapons.cloud.title"), + new TranslatableComponent("advancements.immersiveweapons.cloud.description"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("hold", + LocationTrigger.TriggerInstance.walkOnBlockWithEquipment(DeferredRegistryHandler.CLOUD.get(), + Items.AIR)) + .save(consumer, "immersiveweapons:cloud"); } } \ 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 381fa539d..dbad33701 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/BlockLootTables.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/BlockLootTables.java @@ -124,7 +124,7 @@ private void addTables() { dropSelf(DeferredRegistryHandler.WARRIOR_STATUE_BASE.get()); dropSelf(DeferredRegistryHandler.WARRIOR_STATUE_HEAD.get()); dropSelf(DeferredRegistryHandler.WOODEN_SPIKES.get()); - dropSelf(DeferredRegistryHandler.WOODEN_TABLE.get()); + dropSelf(DeferredRegistryHandler.OAK_TABLE.get()); // Complex block drops add(DeferredRegistryHandler.BURNED_OAK_BRANCH.get(), (leafLikeDrop) -> createLeafLikeDrop(leafLikeDrop, Items.STICK, NORMAL_LEAVES_SAPLING_CHANCES)); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/EntityLootTables.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/EntityLootTables.java index 87275b3f5..e30f244bf 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/EntityLootTables.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/loot/EntityLootTables.java @@ -31,7 +31,7 @@ public class EntityLootTables implements Consumer map = Maps.newHashMap(); protected void addTables() { - this.add(DeferredRegistryHandler.ROCK_SPIDER_ENTITY.get(), LootTable.lootTable() + add(DeferredRegistryHandler.ROCK_SPIDER_ENTITY.get(), LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(Items.STRING) @@ -49,7 +49,7 @@ protected void addTables() { .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))) .when(LootItemKilledByPlayerCondition.killedByPlayer()))); - this.add(DeferredRegistryHandler.DYING_SOLDIER_ENTITY.get(), LootTable.lootTable() + add(DeferredRegistryHandler.DYING_SOLDIER_ENTITY.get(), LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(Items.ROTTEN_FLESH) @@ -69,12 +69,12 @@ protected void addTables() { .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))) .add(LootItem.lootTableItem(Items.POTATO) .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))) - .apply(SmeltItemFunction.smelted() - .when(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, ENTITY_ON_FIRE))) + .apply(SmeltItemFunction.smelted() + .when(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, ENTITY_ON_FIRE))) .when(LootItemKilledByPlayerCondition.killedByPlayer()) .when(LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.035F, 0.02F)))); - this.add(DeferredRegistryHandler.WANDERING_WARRIOR_ENTITY.get(), LootTable.lootTable() + add(DeferredRegistryHandler.WANDERING_WARRIOR_ENTITY.get(), LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(Items.LEATHER) @@ -82,7 +82,7 @@ protected void addTables() { .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 2.0F)))) .when(LootItemKilledByPlayerCondition.killedByPlayer()))); - this.add(DeferredRegistryHandler.HANS_ENTITY.get(), LootTable.lootTable() + add(DeferredRegistryHandler.HANS_ENTITY.get(), LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(Items.LEATHER) @@ -95,7 +95,7 @@ protected void addTables() { .when(LootItemKilledByPlayerCondition.killedByPlayer()) .when(LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.025F, 0.01F)))); - this.add(DeferredRegistryHandler.MINUTEMAN_ENTITY.get(), LootTable.lootTable() + add(DeferredRegistryHandler.MINUTEMAN_ENTITY.get(), LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(Items.GUNPOWDER) @@ -107,6 +107,11 @@ protected void addTables() { .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 4.0F))) .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))) .when(LootItemKilledByPlayerCondition.killedByPlayer())) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(DeferredRegistryHandler.BLUNDERBUSS.get())) + .when(LootItemKilledByPlayerCondition.killedByPlayer()) + .when(LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.017F, 0.05F))) .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(DeferredRegistryHandler.CHOCOLATE_BAR.get()) @@ -120,14 +125,21 @@ protected void addTables() { .when(LootItemKilledByPlayerCondition.killedByPlayer()) .when(LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.035F, 0.02F)))); - this.add(DeferredRegistryHandler.FIELD_MEDIC_ENTITY.get(), LootTable.lootTable() + add(DeferredRegistryHandler.FIELD_MEDIC_ENTITY.get(), LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(DeferredRegistryHandler.USED_SYRINGE.get())) .when(LootItemKilledByPlayerCondition.killedByPlayer()) .when(LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.015F, 0.03F)))); - this.add(DeferredRegistryHandler.CELESTIAL_TOWER_ENTITY.get(), LootTable.lootTable() + add(DeferredRegistryHandler.DYING_SOLDIER_ENTITY.get(), LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(DeferredRegistryHandler.FLINTLOCK_PISTOL.get())) + .when(LootItemKilledByPlayerCondition.killedByPlayer()) + .when(LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.020F, 0.05F)))); + + add(DeferredRegistryHandler.CELESTIAL_TOWER_ENTITY.get(), LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(DeferredRegistryHandler.CELESTIAL_FRAGMENT.get()) @@ -136,8 +148,9 @@ protected void addTables() { .when(LootItemKilledByPlayerCondition.killedByPlayer()))); } + @Override public void accept(BiConsumer biConsumer) { - this.addTables(); + addTables(); Set set = Sets.newHashSet(); List>> knownEntities = getKnownEntities(); @@ -146,23 +159,23 @@ public void accept(BiConsumer biConsumer) { EntityType entityType = registryEntityType.get(); ResourceLocation lootTable = entityType.getDefaultLootTable(); if (isNonLiving(entityType)) { - if (lootTable != BuiltInLootTables.EMPTY && this.map.remove(lootTable) != null) { + if (lootTable != BuiltInLootTables.EMPTY && map.remove(lootTable) != null) { throw new IllegalStateException(String.format("Strange loot table '%s' for '%s', a LivingEntity should not have loot", lootTable, ForgeRegistries.ENTITIES.getKey(entityType))); } } else if (lootTable != BuiltInLootTables.EMPTY && set.add(lootTable)) { - LootTable.Builder builder = this.map.remove(lootTable); + LootTable.Builder builder = map.remove(lootTable); if (builder != null) { biConsumer.accept(lootTable, builder); } } } - this.map.forEach(biConsumer); + map.forEach(biConsumer); } protected List>> getKnownEntities() { return StreamSupport.stream(Spliterators.spliteratorUnknownSize(DeferredRegistryHandler.ENTITY_TYPES.getEntries().stream().iterator(), 0), - false).collect(Collectors.toList()); + false).collect(Collectors.toList()); } protected boolean isNonLiving(EntityType entityType) { @@ -170,10 +183,10 @@ protected boolean isNonLiving(EntityType entityType) { } protected void add(EntityType pEntityType, LootTable.Builder pLootTableBuilder) { - this.add(pEntityType.getDefaultLootTable(), pLootTableBuilder); + add(pEntityType.getDefaultLootTable(), pLootTableBuilder); } protected void add(ResourceLocation pLootTableId, LootTable.Builder pLootTableBuilder) { - this.map.put(pLootTableId, pLootTableBuilder); + map.put(pLootTableId, pLootTableBuilder); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/BlockModelGenerator.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/BlockModelGenerator.java index dc477930f..3f1b8f067 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/BlockModelGenerator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/BlockModelGenerator.java @@ -24,11 +24,19 @@ public class BlockModelGenerator { final Consumer blockStateOutput; final BiConsumer> modelOutput; private final Consumer skippedAutoModelsOutput; - final List nonOrientableTrapdoor = ImmutableList.of(Blocks.OAK_TRAPDOOR, Blocks.DARK_OAK_TRAPDOOR, Blocks.IRON_TRAPDOOR); - final Map fullBlockModelCustomGenerators = ImmutableMap. builder().put(Blocks.STONE, BlockModelGenerator::createMirroredCubeGenerator).put(Blocks.DEEPSLATE, BlockModelGenerator::createMirroredColumnGenerator).build(); + + final List nonOrientableTrapdoor = ImmutableList.of(Blocks.OAK_TRAPDOOR, Blocks.DARK_OAK_TRAPDOOR, + Blocks.IRON_TRAPDOOR); + + final Map fullBlockModelCustomGenerators = ImmutableMap. builder() + .put(Blocks.STONE, BlockModelGenerator::createMirroredCubeGenerator) + .put(Blocks.DEEPSLATE, BlockModelGenerator::createMirroredColumnGenerator).build(); + final Map texturedModels = ImmutableMap. builder().build(); - public BlockModelGenerator(Consumer pBlockStateOutput, BiConsumer> pModelOutput, Consumer pSkippedAutoModelsOutput) { + public BlockModelGenerator(Consumer pBlockStateOutput, BiConsumer> pModelOutput, Consumer pSkippedAutoModelsOutput) { + blockStateOutput = pBlockStateOutput; modelOutput = pModelOutput; skippedAutoModelsOutput = pSkippedAutoModelsOutput; @@ -70,13 +78,16 @@ public void run() { // Cloud Marble blocks createTrivialCube(DeferredRegistryHandler.CLOUD_MARBLE.get()); - createRotatedPillarWithHorizontalVariant(DeferredRegistryHandler.CLOUD_MARBLE_PILLAR.get(), TexturedModel.COLUMN_ALT, TexturedModel.COLUMN_HORIZONTAL_ALT); + createRotatedPillarWithHorizontalVariant(DeferredRegistryHandler.CLOUD_MARBLE_PILLAR.get(), + TexturedModel.COLUMN_ALT, TexturedModel.COLUMN_HORIZONTAL_ALT); + family(DeferredRegistryHandler.CLOUD_MARBLE_BRICKS.get()) .slab(DeferredRegistryHandler.CLOUD_MARBLE_BRICK_SLAB.get()) .stairs(DeferredRegistryHandler.CLOUD_MARBLE_BRICK_STAIRS.get()); // Multi textured blocks - createCraftingTableLike(DeferredRegistryHandler.SMALL_PARTS_TABLE.get(), Blocks.OAK_PLANKS, TextureMapping::fletchingTable); + createCraftingTableLike(DeferredRegistryHandler.SMALL_PARTS_TABLE.get(), Blocks.OAK_PLANKS, + TextureMapping::fletchingTable); // Horizontally-oriented blocks createHorizontallyRotatedBlock(DeferredRegistryHandler.TESLA_BLOCK.get(), TexturedModel.CUBE); @@ -87,6 +98,7 @@ public void run() { createTrivialCube(DeferredRegistryHandler.MOLTEN_BLOCK.get()); createTrivialCube(DeferredRegistryHandler.VENTUS_ORE.get()); createTrivialCube(DeferredRegistryHandler.CLOUD.get()); + createTrivialCube(DeferredRegistryHandler.RAW_SULFUR_BLOCK.get()); // Blockstates createSimpleCubeBlockstate(DeferredRegistryHandler.COBALT_ORE.get()); @@ -96,6 +108,10 @@ public void run() { createSimpleCubeBlockstate(DeferredRegistryHandler.MOLTEN_ORE.get()); createSimpleCubeBlockstate(DeferredRegistryHandler.DEEPSLATE_COBALT_ORE.get()); createSimpleCubeBlockstate(DeferredRegistryHandler.DEEPSLATE_SULFUR_ORE.get()); + + for (Block block : BlockTagLists.TABLES) { + createSimpleCubeBlockstate(block); + } } private List combineBlockLists(List blockList1, List blockList2) { @@ -105,28 +121,35 @@ private List combineBlockLists(List blockList1, List blockL } private void createSimpleCubeBlockstate(Block block) { - blockStateOutput.accept(MultiVariantGenerator.multiVariant(block, Variant.variant().with(VariantProperties.MODEL, getModelLocationForBlockstateIW(block)))); + blockStateOutput.accept(MultiVariantGenerator.multiVariant(block, Variant.variant().with(VariantProperties.MODEL, + getModelLocationForBlockstateIW(block)))); } private ResourceLocation getModelLocationForBlockstateIW(Block block) { - return new ResourceLocation(ImmersiveWeapons.MOD_ID, "block/" + Objects.requireNonNull(block.getRegistryName()).getPath()); + return new ResourceLocation(ImmersiveWeapons.MOD_ID, "block/" + + Objects.requireNonNull(block.getRegistryName()).getPath()); } - private void createRotatedPillarWithHorizontalVariant(Block pRotatedPillarBlock, TexturedModel.Provider pModelProvider, TexturedModel.Provider pHorizontalModelProvider) { + private void createRotatedPillarWithHorizontalVariant(Block pRotatedPillarBlock, TexturedModel.Provider pModelProvider, + TexturedModel.Provider pHorizontalModelProvider) { + ResourceLocation resourceLocation = pModelProvider.create(pRotatedPillarBlock, modelOutput); ResourceLocation resourceLocation1 = pHorizontalModelProvider.create(pRotatedPillarBlock, modelOutput); blockStateOutput.accept(createRotatedPillarWithHorizontalVariant(pRotatedPillarBlock, resourceLocation, resourceLocation1)); } - private void createCraftingTableLike(Block pCraftingTableBlock, Block pCraftingTableMaterialBlock, BiFunction pTextureMappingGetter) { - TextureMapping texturemapping = pTextureMappingGetter.apply(pCraftingTableBlock, pCraftingTableMaterialBlock); - blockStateOutput.accept(createSimpleBlock(pCraftingTableBlock, ModelTemplates.CUBE.create(pCraftingTableBlock, texturemapping, modelOutput))); + private void createCraftingTableLike(Block pCraftingTableBlock, Block pCraftingTableMaterialBlock, + BiFunction pTextureMappingGetter) { + + TextureMapping textureMapping = pTextureMappingGetter.apply(pCraftingTableBlock, pCraftingTableMaterialBlock); + blockStateOutput.accept(createSimpleBlock(pCraftingTableBlock, ModelTemplates.CUBE + .create(pCraftingTableBlock, textureMapping, modelOutput))); } private void createHorizontallyRotatedBlock(Block pHorizontallyRotatedBlock, TexturedModel.Provider pProvider) { - ResourceLocation resourcelocation = pProvider.create(pHorizontallyRotatedBlock, modelOutput); + ResourceLocation resourceLocation = pProvider.create(pHorizontallyRotatedBlock, modelOutput); blockStateOutput.accept(MultiVariantGenerator.multiVariant(pHorizontallyRotatedBlock, Variant.variant() - .with(VariantProperties.MODEL, resourcelocation)) + .with(VariantProperties.MODEL, resourceLocation)) .with(createHorizontalFacingDispatch())); } @@ -142,8 +165,8 @@ private static PropertyDispatch createHorizontalFacingDispatch() { } private BlockFamilyProvider family(Block pBlock) { - TexturedModel texturedmodel = texturedModels.getOrDefault(pBlock, TexturedModel.CUBE.get(pBlock)); - return (new BlockFamilyProvider(texturedmodel.getMapping(), pBlock)).fullBlock(pBlock, texturedmodel.getTemplate()); + TexturedModel model = texturedModels.getOrDefault(pBlock, TexturedModel.CUBE.get(pBlock)); + return (new BlockFamilyProvider(model.getMapping(), pBlock)).fullBlock(pBlock, model.getTemplate()); } private void createTrivialCube(Block pBlock) { @@ -168,30 +191,122 @@ void createDoor(Block pDoorBlock) { blockStateOutput.accept(createDoor(pDoorBlock, resourceLocation, resourceLocation1, resourceLocation2, resourceLocation3)); } - private static BlockStateGenerator createMirroredCubeGenerator(Block block, ResourceLocation resourceLocation1, TextureMapping textureMapping, BiConsumer> supplierBiConsumer) { + private static BlockStateGenerator createMirroredCubeGenerator(Block block, ResourceLocation resourceLocation1, + TextureMapping textureMapping, + BiConsumer> supplierBiConsumer) { + ResourceLocation resourceLocation = ModelTemplates.CUBE_MIRRORED_ALL.create(block, textureMapping, supplierBiConsumer); return createRotatedVariant(block, resourceLocation1, resourceLocation); } - private static BlockStateGenerator createMirroredColumnGenerator(Block block, ResourceLocation resourceLocation, TextureMapping textureMapping, BiConsumer> locationSupplierBiConsumer) { + private static BlockStateGenerator createMirroredColumnGenerator(Block block, ResourceLocation resourceLocation, + TextureMapping textureMapping, + BiConsumer> locationSupplierBiConsumer) { + ResourceLocation resourcelocation = ModelTemplates.CUBE_COLUMN_MIRRORED.create(block, textureMapping, locationSupplierBiConsumer); return createRotatedVariant(block, resourceLocation, resourcelocation).with(createRotatedPillar()); } - private static MultiVariantGenerator createRotatedVariant(Block pBlock, ResourceLocation pNormalModelLocation, ResourceLocation pMirroredModelLocation) { - return MultiVariantGenerator.multiVariant(pBlock, Variant.variant().with(VariantProperties.MODEL, pNormalModelLocation), Variant.variant().with(VariantProperties.MODEL, pMirroredModelLocation), Variant.variant().with(VariantProperties.MODEL, pNormalModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180), Variant.variant().with(VariantProperties.MODEL, pMirroredModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)); + private static MultiVariantGenerator createRotatedVariant(Block pBlock, ResourceLocation pNormalModelLocation, + ResourceLocation pMirroredModelLocation) { + + return MultiVariantGenerator.multiVariant(pBlock, + Variant.variant() + .with(VariantProperties.MODEL, pNormalModelLocation), + Variant.variant() + .with(VariantProperties.MODEL, pMirroredModelLocation), + Variant.variant() + .with(VariantProperties.MODEL, pNormalModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180), + Variant.variant() + .with(VariantProperties.MODEL, pMirroredModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)); } - private static BlockStateGenerator createDoor(Block pDoorBlock, ResourceLocation pBottomHalfModelLocation, ResourceLocation pBottomHalfRightHingeModelLocation, ResourceLocation pTopHalfModelLocation, ResourceLocation pTopHalfRightHingeModelLocation) { - return MultiVariantGenerator.multiVariant(pDoorBlock).with(configureDoorHalf(configureDoorHalf(PropertyDispatch.properties(BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.DOUBLE_BLOCK_HALF, BlockStateProperties.DOOR_HINGE, BlockStateProperties.OPEN), DoubleBlockHalf.LOWER, pBottomHalfModelLocation, pBottomHalfRightHingeModelLocation), DoubleBlockHalf.UPPER, pTopHalfModelLocation, pTopHalfRightHingeModelLocation)); + private static BlockStateGenerator createDoor(Block pDoorBlock, ResourceLocation pBottomHalfModelLocation, + ResourceLocation pBottomHalfRightHingeModelLocation, + ResourceLocation pTopHalfModelLocation, + ResourceLocation pTopHalfRightHingeModelLocation) { + + return MultiVariantGenerator.multiVariant(pDoorBlock) + .with(configureDoorHalf(configureDoorHalf(PropertyDispatch + .properties(BlockStateProperties.HORIZONTAL_FACING, + BlockStateProperties.DOUBLE_BLOCK_HALF, + BlockStateProperties.DOOR_HINGE, + BlockStateProperties.OPEN) + , DoubleBlockHalf.LOWER, pBottomHalfModelLocation, pBottomHalfRightHingeModelLocation), + DoubleBlockHalf.UPPER, pTopHalfModelLocation, pTopHalfRightHingeModelLocation)); } void createSimpleFlatItemModel(Item pFlatItem) { - ModelTemplates.FLAT_ITEM.create(ModelLocationUtils.getModelLocation(pFlatItem), TextureMapping.layer0(pFlatItem), modelOutput); + ModelTemplates.FLAT_ITEM.create(ModelLocationUtils.getModelLocation(pFlatItem), TextureMapping.layer0(pFlatItem), + modelOutput); } - private static PropertyDispatch.C4 configureDoorHalf(PropertyDispatch.C4 pDoorProperties, DoubleBlockHalf pDoorHalf, ResourceLocation pDoorModelLocation, ResourceLocation pDoorRightHingeModelLocation) { - return pDoorProperties.select(Direction.EAST, pDoorHalf, DoorHingeSide.LEFT, false, Variant.variant().with(VariantProperties.MODEL, pDoorModelLocation)).select(Direction.SOUTH, pDoorHalf, DoorHingeSide.LEFT, false, Variant.variant().with(VariantProperties.MODEL, pDoorModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, pDoorHalf, DoorHingeSide.LEFT, false, Variant.variant().with(VariantProperties.MODEL, pDoorModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.NORTH, pDoorHalf, DoorHingeSide.LEFT, false, Variant.variant().with(VariantProperties.MODEL, pDoorModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.EAST, pDoorHalf, DoorHingeSide.RIGHT, false, Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation)).select(Direction.SOUTH, pDoorHalf, DoorHingeSide.RIGHT, false, Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, pDoorHalf, DoorHingeSide.RIGHT, false, Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.NORTH, pDoorHalf, DoorHingeSide.RIGHT, false, Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.EAST, pDoorHalf, DoorHingeSide.LEFT, true, Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.SOUTH, pDoorHalf, DoorHingeSide.LEFT, true, Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.WEST, pDoorHalf, DoorHingeSide.LEFT, true, Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, pDoorHalf, DoorHingeSide.LEFT, true, Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation)).select(Direction.EAST, pDoorHalf, DoorHingeSide.RIGHT, true, Variant.variant().with(VariantProperties.MODEL, pDoorModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.SOUTH, pDoorHalf, DoorHingeSide.RIGHT, true, Variant.variant().with(VariantProperties.MODEL, pDoorModelLocation)).select(Direction.WEST, pDoorHalf, DoorHingeSide.RIGHT, true, Variant.variant().with(VariantProperties.MODEL, pDoorModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.NORTH, pDoorHalf, DoorHingeSide.RIGHT, true, Variant.variant().with(VariantProperties.MODEL, pDoorModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)); + private static PropertyDispatch.C4 + configureDoorHalf(PropertyDispatch.C4 pDoorProperties, + DoubleBlockHalf pDoorHalf, ResourceLocation pDoorModelLocation, + ResourceLocation pDoorRightHingeModelLocation) { + + return pDoorProperties.select(Direction.EAST, pDoorHalf, DoorHingeSide.LEFT, false, + Variant.variant() + .with(VariantProperties.MODEL, pDoorModelLocation)) + .select(Direction.SOUTH, pDoorHalf, DoorHingeSide.LEFT, false, + Variant.variant() + .with(VariantProperties.MODEL, pDoorModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.WEST, pDoorHalf, DoorHingeSide.LEFT, false, + Variant.variant() + .with(VariantProperties.MODEL, pDoorModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.NORTH, pDoorHalf, DoorHingeSide.LEFT, false, + Variant.variant() + .with(VariantProperties.MODEL, pDoorModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.EAST, pDoorHalf, DoorHingeSide.RIGHT, false, + Variant.variant() + .with(VariantProperties.MODEL, pDoorRightHingeModelLocation)) + .select(Direction.SOUTH, pDoorHalf, DoorHingeSide.RIGHT, false, + Variant.variant() + .with(VariantProperties.MODEL, pDoorRightHingeModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.WEST, pDoorHalf, DoorHingeSide.RIGHT, false, + Variant.variant() + .with(VariantProperties.MODEL, pDoorRightHingeModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.NORTH, pDoorHalf, DoorHingeSide.RIGHT, false, + Variant.variant() + .with(VariantProperties.MODEL, pDoorRightHingeModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.EAST, pDoorHalf, DoorHingeSide.LEFT, true, + Variant.variant() + .with(VariantProperties.MODEL, pDoorRightHingeModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.SOUTH, pDoorHalf, DoorHingeSide.LEFT, true, + Variant.variant() + .with(VariantProperties.MODEL, pDoorRightHingeModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.WEST, pDoorHalf, DoorHingeSide.LEFT, true, + Variant.variant().with(VariantProperties.MODEL, pDoorRightHingeModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.NORTH, pDoorHalf, DoorHingeSide.LEFT, true, + Variant.variant() + .with(VariantProperties.MODEL, pDoorRightHingeModelLocation)) + .select(Direction.EAST, pDoorHalf, DoorHingeSide.RIGHT, true, + Variant.variant() + .with(VariantProperties.MODEL, pDoorModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.SOUTH, pDoorHalf, DoorHingeSide.RIGHT, true, + Variant.variant() + .with(VariantProperties.MODEL, pDoorModelLocation)) + .select(Direction.WEST, pDoorHalf, DoorHingeSide.RIGHT, true, + Variant.variant() + .with(VariantProperties.MODEL, pDoorModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.NORTH, pDoorHalf, DoorHingeSide.RIGHT, true, + Variant.variant() + .with(VariantProperties.MODEL, pDoorModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)); } static BlockStateGenerator createAxisAlignedPillarBlock(Block pAxisAlignedPillarBlock, ResourceLocation pModelLocation) { @@ -227,90 +342,608 @@ void delegateItemModel(Block pBlock, ResourceLocation pDelegateModelLocation) { modelOutput.accept(ModelLocationUtils.getModelLocation(pBlock.asItem()), new DelegatedModel(pDelegateModelLocation)); } - static BlockStateGenerator createButton(Block pButtonBlock, ResourceLocation pUnpoweredModelLocation, ResourceLocation pPoweredModelLocation) { - return MultiVariantGenerator.multiVariant(pButtonBlock).with(PropertyDispatch.property(BlockStateProperties.POWERED).select(false, Variant.variant().with(VariantProperties.MODEL, pUnpoweredModelLocation)).select(true, Variant.variant().with(VariantProperties.MODEL, pPoweredModelLocation))).with(PropertyDispatch.properties(BlockStateProperties.ATTACH_FACE, BlockStateProperties.HORIZONTAL_FACING).select(AttachFace.FLOOR, Direction.EAST, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(AttachFace.FLOOR, Direction.WEST, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(AttachFace.FLOOR, Direction.SOUTH, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(AttachFace.FLOOR, Direction.NORTH, Variant.variant()).select(AttachFace.WALL, Direction.EAST, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(AttachFace.WALL, Direction.WEST, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(AttachFace.WALL, Direction.SOUTH, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(AttachFace.WALL, Direction.NORTH, Variant.variant().with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(AttachFace.CEILING, Direction.EAST, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.WEST, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.SOUTH, Variant.variant().with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.NORTH, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180))); + static BlockStateGenerator createButton(Block pButtonBlock, ResourceLocation pUnpoweredModelLocation, + ResourceLocation pPoweredModelLocation) { + + return MultiVariantGenerator.multiVariant(pButtonBlock) + .with(PropertyDispatch.property(BlockStateProperties.POWERED) + .select(false, + Variant.variant() + .with(VariantProperties.MODEL, pUnpoweredModelLocation)) + .select(true, + Variant.variant() + .with(VariantProperties.MODEL, pPoweredModelLocation))) + .with(PropertyDispatch.properties(BlockStateProperties.ATTACH_FACE, BlockStateProperties.HORIZONTAL_FACING) + .select(AttachFace.FLOOR, Direction.EAST, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(AttachFace.FLOOR, Direction.WEST, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(AttachFace.FLOOR, Direction.SOUTH, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(AttachFace.FLOOR, Direction.NORTH, + Variant.variant()) + .select(AttachFace.WALL, Direction.EAST, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(AttachFace.WALL, Direction.WEST, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(AttachFace.WALL, Direction.SOUTH, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(AttachFace.WALL, Direction.NORTH, + Variant.variant() + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(AttachFace.CEILING, Direction.EAST, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)) + .select(AttachFace.CEILING, Direction.WEST, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)) + .select(AttachFace.CEILING, Direction.SOUTH, + Variant.variant() + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)) + .select(AttachFace.CEILING, Direction.NORTH, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180))); } - static BlockStateGenerator createWall(Block pWallBlock, ResourceLocation pPostModelLocation, ResourceLocation pLowSideModelLocation, ResourceLocation pTallSideModelLocation) { - return MultiPartGenerator.multiPart(pWallBlock).with(Condition.condition().term(BlockStateProperties.UP, true), Variant.variant().with(VariantProperties.MODEL, pPostModelLocation)).with(Condition.condition().term(BlockStateProperties.NORTH_WALL, WallSide.LOW), Variant.variant().with(VariantProperties.MODEL, pLowSideModelLocation).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.EAST_WALL, WallSide.LOW), Variant.variant().with(VariantProperties.MODEL, pLowSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.SOUTH_WALL, WallSide.LOW), Variant.variant().with(VariantProperties.MODEL, pLowSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.WEST_WALL, WallSide.LOW), Variant.variant().with(VariantProperties.MODEL, pLowSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.NORTH_WALL, WallSide.TALL), Variant.variant().with(VariantProperties.MODEL, pTallSideModelLocation).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.EAST_WALL, WallSide.TALL), Variant.variant().with(VariantProperties.MODEL, pTallSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.SOUTH_WALL, WallSide.TALL), Variant.variant().with(VariantProperties.MODEL, pTallSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.WEST_WALL, WallSide.TALL), Variant.variant().with(VariantProperties.MODEL, pTallSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)); + static BlockStateGenerator createWall(Block pWallBlock, ResourceLocation pPostModelLocation, + ResourceLocation pLowSideModelLocation, ResourceLocation pTallSideModelLocation) { + + return MultiPartGenerator.multiPart(pWallBlock) + .with(Condition.condition().term(BlockStateProperties.UP, true), + Variant.variant() + .with(VariantProperties.MODEL, pPostModelLocation)) + .with(Condition.condition().term(BlockStateProperties.NORTH_WALL, WallSide.LOW), + Variant.variant() + .with(VariantProperties.MODEL, pLowSideModelLocation) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.EAST_WALL, WallSide.LOW), + Variant.variant() + .with(VariantProperties.MODEL, pLowSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.SOUTH_WALL, WallSide.LOW), + Variant.variant() + .with(VariantProperties.MODEL, pLowSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.WEST_WALL, WallSide.LOW), + Variant.variant() + .with(VariantProperties.MODEL, pLowSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.NORTH_WALL, WallSide.TALL), + Variant.variant() + .with(VariantProperties.MODEL, pTallSideModelLocation) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.EAST_WALL, WallSide.TALL), + Variant.variant() + .with(VariantProperties.MODEL, pTallSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.SOUTH_WALL, WallSide.TALL), + Variant.variant() + .with(VariantProperties.MODEL, pTallSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.WEST_WALL, WallSide.TALL), + Variant.variant() + .with(VariantProperties.MODEL, pTallSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)); } - static BlockStateGenerator createFence(Block pFenceBlock, ResourceLocation pFencePostModelLocation, ResourceLocation pFenceSideModelLocation) { - return MultiPartGenerator.multiPart(pFenceBlock).with(Variant.variant().with(VariantProperties.MODEL, pFencePostModelLocation)).with(Condition.condition().term(BlockStateProperties.NORTH, true), Variant.variant().with(VariantProperties.MODEL, pFenceSideModelLocation).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.EAST, true), Variant.variant().with(VariantProperties.MODEL, pFenceSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.SOUTH, true), Variant.variant().with(VariantProperties.MODEL, pFenceSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).with(Condition.condition().term(BlockStateProperties.WEST, true), Variant.variant().with(VariantProperties.MODEL, pFenceSideModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)); + static BlockStateGenerator createFence(Block pFenceBlock, ResourceLocation pFencePostModelLocation, + ResourceLocation pFenceSideModelLocation) { + + return MultiPartGenerator.multiPart(pFenceBlock) + .with(Variant.variant() + .with(VariantProperties.MODEL, pFencePostModelLocation)) + .with(Condition.condition().term(BlockStateProperties.NORTH, true), + Variant.variant().with(VariantProperties.MODEL, pFenceSideModelLocation) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.EAST, true), + Variant.variant() + .with(VariantProperties.MODEL, pFenceSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.SOUTH, true), + Variant.variant() + .with(VariantProperties.MODEL, pFenceSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .with(Condition.condition().term(BlockStateProperties.WEST, true), + Variant.variant() + .with(VariantProperties.MODEL, pFenceSideModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)); } - static BlockStateGenerator createFenceGate(Block pFenceGateBlock, ResourceLocation pOpenModelLocation, ResourceLocation pClosedModelLocation, ResourceLocation pWallOpenModelLocation, ResourceLocation pWallClosedModelLocation) { - return MultiVariantGenerator.multiVariant(pFenceGateBlock, Variant.variant().with(VariantProperties.UV_LOCK, true)).with(createHorizontalFacingDispatchAlt()).with(PropertyDispatch.properties(BlockStateProperties.IN_WALL, BlockStateProperties.OPEN).select(false, false, Variant.variant().with(VariantProperties.MODEL, pClosedModelLocation)).select(true, false, Variant.variant().with(VariantProperties.MODEL, pWallClosedModelLocation)).select(false, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation)).select(true, true, Variant.variant().with(VariantProperties.MODEL, pWallOpenModelLocation))); + static BlockStateGenerator createFenceGate(Block pFenceGateBlock, ResourceLocation pOpenModelLocation, + ResourceLocation pClosedModelLocation, + ResourceLocation pWallOpenModelLocation, + ResourceLocation pWallClosedModelLocation) { + + return MultiVariantGenerator.multiVariant(pFenceGateBlock, + Variant.variant() + .with(VariantProperties.UV_LOCK, true)) + .with(createHorizontalFacingDispatchAlt()) + .with(PropertyDispatch.properties(BlockStateProperties.IN_WALL, BlockStateProperties.OPEN) + .select(false, false, + Variant.variant() + .with(VariantProperties.MODEL, pClosedModelLocation)) + .select(true, false, + Variant.variant() + .with(VariantProperties.MODEL, pWallClosedModelLocation)) + .select(false, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation)) + .select(true, true, + Variant.variant() + .with(VariantProperties.MODEL, pWallOpenModelLocation))); } private static PropertyDispatch createHorizontalFacingDispatchAlt() { - return PropertyDispatch.property(BlockStateProperties.HORIZONTAL_FACING).select(Direction.SOUTH, Variant.variant()).select(Direction.WEST, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.NORTH, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)); + return PropertyDispatch.property(BlockStateProperties.HORIZONTAL_FACING) + .select(Direction.SOUTH, Variant.variant()) + .select(Direction.WEST, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.NORTH, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.EAST, + Variant.variant() + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)); } - static BlockStateGenerator createPressurePlate(Block pPressurePlateBlock, ResourceLocation pUnpoweredModelLocation, ResourceLocation pPoweredModelLocation) { - return MultiVariantGenerator.multiVariant(pPressurePlateBlock).with(createBooleanModelDispatch(BlockStateProperties.POWERED, pPoweredModelLocation, pUnpoweredModelLocation)); + static BlockStateGenerator createPressurePlate(Block pPressurePlateBlock, ResourceLocation pUnpoweredModelLocation, + ResourceLocation pPoweredModelLocation) { + + return MultiVariantGenerator.multiVariant(pPressurePlateBlock) + .with(createBooleanModelDispatch(BlockStateProperties.POWERED, pPoweredModelLocation, + pUnpoweredModelLocation)); } - private static PropertyDispatch createBooleanModelDispatch(BooleanProperty pProperty, ResourceLocation pTrueModelLocation, ResourceLocation pFalseModelLocation) { - return PropertyDispatch.property(pProperty).select(true, Variant.variant().with(VariantProperties.MODEL, pTrueModelLocation)).select(false, Variant.variant().with(VariantProperties.MODEL, pFalseModelLocation)); + private static PropertyDispatch createBooleanModelDispatch(BooleanProperty pProperty, + ResourceLocation pTrueModelLocation, + ResourceLocation pFalseModelLocation) { + + return PropertyDispatch.property(pProperty).select(true, + Variant.variant() + .with(VariantProperties.MODEL, pTrueModelLocation)) + .select(false, Variant.variant().with(VariantProperties.MODEL, pFalseModelLocation)); } void skipAutoItemBlock(Block pBlock) { skippedAutoModelsOutput.accept(pBlock.asItem()); } - static BlockStateGenerator createSlab(Block pSlabBlock, ResourceLocation pBottomHalfModelLocation, ResourceLocation pTopHalfModelLocation, ResourceLocation pDoubleModelLocation) { - return MultiVariantGenerator.multiVariant(pSlabBlock).with(PropertyDispatch.property(BlockStateProperties.SLAB_TYPE).select(SlabType.BOTTOM, Variant.variant().with(VariantProperties.MODEL, pBottomHalfModelLocation)).select(SlabType.TOP, Variant.variant().with(VariantProperties.MODEL, pTopHalfModelLocation)).select(SlabType.DOUBLE, Variant.variant().with(VariantProperties.MODEL, pDoubleModelLocation))); + static BlockStateGenerator createSlab(Block pSlabBlock, ResourceLocation pBottomHalfModelLocation, + ResourceLocation pTopHalfModelLocation, ResourceLocation pDoubleModelLocation) { + + return MultiVariantGenerator.multiVariant(pSlabBlock) + .with(PropertyDispatch.property(BlockStateProperties.SLAB_TYPE) + .select(SlabType.BOTTOM, + Variant.variant() + .with(VariantProperties.MODEL, pBottomHalfModelLocation)) + .select(SlabType.TOP, + Variant.variant() + .with(VariantProperties.MODEL, pTopHalfModelLocation)) + .select(SlabType.DOUBLE, + Variant.variant() + .with(VariantProperties.MODEL, pDoubleModelLocation))); } - static BlockStateGenerator createStairs(Block pStairsBlock, ResourceLocation pInnerModelLocation, ResourceLocation pStraightModelLocation, ResourceLocation pOuterModelLocation) { - return MultiVariantGenerator.multiVariant(pStairsBlock).with(PropertyDispatch.properties(BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, BlockStateProperties.STAIRS_SHAPE).select(Direction.EAST, Half.BOTTOM, StairsShape.STRAIGHT, Variant.variant().with(VariantProperties.MODEL, pStraightModelLocation)).select(Direction.WEST, Half.BOTTOM, StairsShape.STRAIGHT, Variant.variant().with(VariantProperties.MODEL, pStraightModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.STRAIGHT, Variant.variant().with(VariantProperties.MODEL, pStraightModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.BOTTOM, StairsShape.STRAIGHT, Variant.variant().with(VariantProperties.MODEL, pStraightModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.BOTTOM, StairsShape.OUTER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation)).select(Direction.WEST, Half.BOTTOM, StairsShape.OUTER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.OUTER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.BOTTOM, StairsShape.OUTER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.BOTTOM, StairsShape.OUTER_LEFT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.BOTTOM, StairsShape.OUTER_LEFT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.OUTER_LEFT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation)).select(Direction.NORTH, Half.BOTTOM, StairsShape.OUTER_LEFT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.BOTTOM, StairsShape.INNER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation)).select(Direction.WEST, Half.BOTTOM, StairsShape.INNER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.INNER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.BOTTOM, StairsShape.INNER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.BOTTOM, StairsShape.INNER_LEFT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.BOTTOM, StairsShape.INNER_LEFT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.INNER_LEFT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation)).select(Direction.NORTH, Half.BOTTOM, StairsShape.INNER_LEFT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.STRAIGHT, Variant.variant().with(VariantProperties.MODEL, pStraightModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.STRAIGHT, Variant.variant().with(VariantProperties.MODEL, pStraightModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.STRAIGHT, Variant.variant().with(VariantProperties.MODEL, pStraightModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.STRAIGHT, Variant.variant().with(VariantProperties.MODEL, pStraightModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.OUTER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.OUTER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.OUTER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.OUTER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.OUTER_LEFT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.OUTER_LEFT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.OUTER_LEFT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.OUTER_LEFT, Variant.variant().with(VariantProperties.MODEL, pOuterModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.INNER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.INNER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.INNER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.INNER_RIGHT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.INNER_LEFT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.INNER_LEFT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.INNER_LEFT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.INNER_LEFT, Variant.variant().with(VariantProperties.MODEL, pInnerModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).with(VariantProperties.UV_LOCK, true))); + static BlockStateGenerator createStairs(Block pStairsBlock, ResourceLocation pInnerModelLocation, + ResourceLocation pStraightModelLocation, + ResourceLocation pOuterModelLocation) { + + return MultiVariantGenerator.multiVariant(pStairsBlock) + .with(PropertyDispatch + .properties(BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, + BlockStateProperties.STAIRS_SHAPE) + .select(Direction.EAST, Half.BOTTOM, StairsShape.STRAIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pStraightModelLocation)) + .select(Direction.WEST, Half.BOTTOM, StairsShape.STRAIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pStraightModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.BOTTOM, StairsShape.STRAIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pStraightModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.NORTH, Half.BOTTOM, StairsShape.STRAIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pStraightModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.BOTTOM, StairsShape.OUTER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation)) + .select(Direction.WEST, Half.BOTTOM, StairsShape.OUTER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.BOTTOM, StairsShape.OUTER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.NORTH, Half.BOTTOM, StairsShape.OUTER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.BOTTOM, StairsShape.OUTER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.WEST, Half.BOTTOM, StairsShape.OUTER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.BOTTOM, StairsShape.OUTER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation)) + .select(Direction.NORTH, Half.BOTTOM, StairsShape.OUTER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.BOTTOM, StairsShape.INNER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation)) + .select(Direction.WEST, Half.BOTTOM, StairsShape.INNER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.BOTTOM, StairsShape.INNER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.NORTH, Half.BOTTOM, StairsShape.INNER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.BOTTOM, StairsShape.INNER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.WEST, Half.BOTTOM, StairsShape.INNER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.BOTTOM, StairsShape.INNER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation)) + .select(Direction.NORTH, Half.BOTTOM, StairsShape.INNER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.TOP, StairsShape.STRAIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pStraightModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.WEST, Half.TOP, StairsShape.STRAIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pStraightModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.TOP, StairsShape.STRAIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pStraightModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.NORTH, Half.TOP, StairsShape.STRAIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pStraightModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.TOP, StairsShape.OUTER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.WEST, Half.TOP, StairsShape.OUTER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.TOP, StairsShape.OUTER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.NORTH, Half.TOP, StairsShape.OUTER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.TOP, StairsShape.OUTER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.WEST, Half.TOP, StairsShape.OUTER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.TOP, StairsShape.OUTER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.NORTH, Half.TOP, StairsShape.OUTER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pOuterModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.TOP, StairsShape.INNER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.WEST, Half.TOP, StairsShape.INNER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.TOP, StairsShape.INNER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.NORTH, Half.TOP, StairsShape.INNER_RIGHT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.EAST, Half.TOP, StairsShape.INNER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.WEST, Half.TOP, StairsShape.INNER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.SOUTH, Half.TOP, StairsShape.INNER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90) + .with(VariantProperties.UV_LOCK, true)) + .select(Direction.NORTH, Half.TOP, StairsShape.INNER_LEFT, + Variant.variant() + .with(VariantProperties.MODEL, pInnerModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) + .with(VariantProperties.UV_LOCK, true))); } void createTrapdoor(Block pTrapdoorBlock) { - TextureMapping texturemapping = TextureMapping.defaultTexture(pTrapdoorBlock); - ResourceLocation resourceLocation = ModelTemplates.TRAPDOOR_TOP.create(pTrapdoorBlock, texturemapping, modelOutput); - ResourceLocation resourceLocation1 = ModelTemplates.TRAPDOOR_BOTTOM.create(pTrapdoorBlock, texturemapping, modelOutput); - ResourceLocation resourceLocation2 = ModelTemplates.TRAPDOOR_OPEN.create(pTrapdoorBlock, texturemapping, modelOutput); + TextureMapping textureMapping = TextureMapping.defaultTexture(pTrapdoorBlock); + ResourceLocation resourceLocation = ModelTemplates.TRAPDOOR_TOP.create(pTrapdoorBlock, textureMapping, modelOutput); + ResourceLocation resourceLocation1 = ModelTemplates.TRAPDOOR_BOTTOM.create(pTrapdoorBlock, textureMapping, modelOutput); + ResourceLocation resourceLocation2 = ModelTemplates.TRAPDOOR_OPEN.create(pTrapdoorBlock, textureMapping, modelOutput); blockStateOutput.accept(createTrapdoor(pTrapdoorBlock, resourceLocation, resourceLocation1, resourceLocation2)); delegateItemModel(pTrapdoorBlock, resourceLocation1); } - private static BlockStateGenerator createTrapdoor(Block pTrapdoorBlock, ResourceLocation pTopModelLocation, ResourceLocation pBottomModelLocation, ResourceLocation pOpenModelLocation) { - return MultiVariantGenerator.multiVariant(pTrapdoorBlock).with(PropertyDispatch.properties(BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, BlockStateProperties.OPEN).select(Direction.NORTH, Half.BOTTOM, false, Variant.variant().with(VariantProperties.MODEL, pBottomModelLocation)).select(Direction.SOUTH, Half.BOTTOM, false, Variant.variant().with(VariantProperties.MODEL, pBottomModelLocation)).select(Direction.EAST, Half.BOTTOM, false, Variant.variant().with(VariantProperties.MODEL, pBottomModelLocation)).select(Direction.WEST, Half.BOTTOM, false, Variant.variant().with(VariantProperties.MODEL, pBottomModelLocation)).select(Direction.NORTH, Half.TOP, false, Variant.variant().with(VariantProperties.MODEL, pTopModelLocation)).select(Direction.SOUTH, Half.TOP, false, Variant.variant().with(VariantProperties.MODEL, pTopModelLocation)).select(Direction.EAST, Half.TOP, false, Variant.variant().with(VariantProperties.MODEL, pTopModelLocation)).select(Direction.WEST, Half.TOP, false, Variant.variant().with(VariantProperties.MODEL, pTopModelLocation)).select(Direction.NORTH, Half.BOTTOM, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation)).select(Direction.SOUTH, Half.BOTTOM, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.BOTTOM, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.BOTTOM, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Half.TOP, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation)).select(Direction.SOUTH, Half.TOP, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.TOP, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.TOP, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))); + private static BlockStateGenerator createTrapdoor(Block pTrapdoorBlock, ResourceLocation pTopModelLocation, + ResourceLocation pBottomModelLocation, + ResourceLocation pOpenModelLocation) { + + return MultiVariantGenerator.multiVariant(pTrapdoorBlock) + .with(PropertyDispatch + .properties(BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, BlockStateProperties.OPEN) + .select(Direction.NORTH, Half.BOTTOM, false, + Variant.variant() + .with(VariantProperties.MODEL, pBottomModelLocation)) + .select(Direction.SOUTH, Half.BOTTOM, false, + Variant.variant() + .with(VariantProperties.MODEL, pBottomModelLocation)) + .select(Direction.EAST, Half.BOTTOM, false, + Variant.variant() + .with(VariantProperties.MODEL, pBottomModelLocation)) + .select(Direction.WEST, Half.BOTTOM, false, + Variant.variant() + .with(VariantProperties.MODEL, pBottomModelLocation)) + .select(Direction.NORTH, Half.TOP, false, + Variant.variant() + .with(VariantProperties.MODEL, pTopModelLocation)) + .select(Direction.SOUTH, Half.TOP, false, + Variant.variant() + .with(VariantProperties.MODEL, pTopModelLocation)) + .select(Direction.EAST, Half.TOP, false, + Variant.variant() + .with(VariantProperties.MODEL, pTopModelLocation)) + .select(Direction.WEST, Half.TOP, false, + Variant.variant() + .with(VariantProperties.MODEL, pTopModelLocation)) + .select(Direction.NORTH, Half.BOTTOM, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation)) + .select(Direction.SOUTH, Half.BOTTOM, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.EAST, Half.BOTTOM, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.WEST, Half.BOTTOM, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.NORTH, Half.TOP, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation)) + .select(Direction.SOUTH, Half.TOP, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.EAST, Half.TOP, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.WEST, Half.TOP, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))); } void createOrientableTrapdoor(Block pOrientableTrapdoorBlock) { - TextureMapping texturemapping = TextureMapping.defaultTexture(pOrientableTrapdoorBlock); - ResourceLocation resourceLocation = ModelTemplates.ORIENTABLE_TRAPDOOR_TOP.create(pOrientableTrapdoorBlock, texturemapping, modelOutput); - ResourceLocation resourceLocation1 = ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM.create(pOrientableTrapdoorBlock, texturemapping, modelOutput); - ResourceLocation resourceLocation2 = ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN.create(pOrientableTrapdoorBlock, texturemapping, modelOutput); - blockStateOutput.accept(createOrientableTrapdoor(pOrientableTrapdoorBlock, resourceLocation, resourceLocation1, resourceLocation2)); + TextureMapping textureMapping = TextureMapping.defaultTexture(pOrientableTrapdoorBlock); + ResourceLocation resourceLocation = ModelTemplates.ORIENTABLE_TRAPDOOR_TOP + .create(pOrientableTrapdoorBlock, textureMapping, modelOutput); + + ResourceLocation resourceLocation1 = ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM + .create(pOrientableTrapdoorBlock, textureMapping, modelOutput); + + ResourceLocation resourceLocation2 = ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN + .create(pOrientableTrapdoorBlock, textureMapping, modelOutput); + + blockStateOutput.accept(createOrientableTrapdoor(pOrientableTrapdoorBlock, resourceLocation, resourceLocation1, + resourceLocation2)); + delegateItemModel(pOrientableTrapdoorBlock, resourceLocation1); } - private static BlockStateGenerator createOrientableTrapdoor(Block pOrientableTrapdoorBlock, ResourceLocation pTopModelLocation, ResourceLocation pBottomModelLocation, ResourceLocation pOpenModelLocation) { - return MultiVariantGenerator.multiVariant(pOrientableTrapdoorBlock).with(PropertyDispatch.properties(BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, BlockStateProperties.OPEN).select(Direction.NORTH, Half.BOTTOM, false, Variant.variant().with(VariantProperties.MODEL, pBottomModelLocation)).select(Direction.SOUTH, Half.BOTTOM, false, Variant.variant().with(VariantProperties.MODEL, pBottomModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.BOTTOM, false, Variant.variant().with(VariantProperties.MODEL, pBottomModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.BOTTOM, false, Variant.variant().with(VariantProperties.MODEL, pBottomModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Half.TOP, false, Variant.variant().with(VariantProperties.MODEL, pTopModelLocation)).select(Direction.SOUTH, Half.TOP, false, Variant.variant().with(VariantProperties.MODEL, pTopModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.TOP, false, Variant.variant().with(VariantProperties.MODEL, pTopModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.TOP, false, Variant.variant().with(VariantProperties.MODEL, pTopModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Half.BOTTOM, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation)).select(Direction.SOUTH, Half.BOTTOM, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.BOTTOM, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.BOTTOM, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Half.TOP, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.SOUTH, Half.TOP, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R0)).select(Direction.EAST, Half.TOP, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.WEST, Half.TOP, true, Variant.variant().with(VariantProperties.MODEL, pOpenModelLocation).with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90))); + private static BlockStateGenerator createOrientableTrapdoor(Block pOrientableTrapdoorBlock, + ResourceLocation pTopModelLocation, + ResourceLocation pBottomModelLocation, + ResourceLocation pOpenModelLocation) { + + return MultiVariantGenerator.multiVariant(pOrientableTrapdoorBlock) + .with(PropertyDispatch + .properties(BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, BlockStateProperties.OPEN) + .select(Direction.NORTH, Half.BOTTOM, false, + Variant.variant() + .with(VariantProperties.MODEL, pBottomModelLocation)) + .select(Direction.SOUTH, Half.BOTTOM, false, + Variant.variant() + .with(VariantProperties.MODEL, pBottomModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.EAST, Half.BOTTOM, false, + Variant.variant() + .with(VariantProperties.MODEL, pBottomModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.WEST, Half.BOTTOM, false, + Variant.variant() + .with(VariantProperties.MODEL, pBottomModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.NORTH, Half.TOP, false, + Variant.variant() + .with(VariantProperties.MODEL, pTopModelLocation)) + .select(Direction.SOUTH, Half.TOP, false, + Variant.variant() + .with(VariantProperties.MODEL, pTopModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.EAST, Half.TOP, false, + Variant.variant() + .with(VariantProperties.MODEL, pTopModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.WEST, Half.TOP, false, + Variant.variant() + .with(VariantProperties.MODEL, pTopModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.NORTH, Half.BOTTOM, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation)) + .select(Direction.SOUTH, Half.BOTTOM, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.EAST, Half.BOTTOM, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.WEST, Half.BOTTOM, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.NORTH, Half.TOP, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)) + .select(Direction.SOUTH, Half.TOP, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R0)) + .select(Direction.EAST, Half.TOP, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.WEST, Half.TOP, true, + Variant.variant() + .with(VariantProperties.MODEL, pOpenModelLocation) + .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180) + .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90))); } @FunctionalInterface interface BlockStateGeneratorSupplier { - BlockStateGenerator create(Block pBlock, ResourceLocation pModelLocation, TextureMapping pTextureMapping, BiConsumer> pModelOutput); + BlockStateGenerator create(Block pBlock, ResourceLocation pModelLocation, TextureMapping pTextureMapping, + BiConsumer> pModelOutput); } class BlockFamilyProvider { private final TextureMapping mapping; private final Map models = Maps.newHashMap(); @Nullable - private BlockFamily family; + private final BlockFamily family; @Nullable private ResourceLocation fullBlock; - public BlockFamilyProvider(TextureMapping textureMapping) { - mapping = textureMapping; - } - public BlockFamilyProvider(TextureMapping textureMapping, Block block) { mapping = textureMapping; family = new BlockFamily.Builder(block).getFamily(); @@ -327,19 +960,6 @@ public BlockFamilyProvider fullBlock(Block pBlock, ModelTemplate pModelTemplate) return this; } - public BlockFamilyProvider fullBlockCopies(Block... pBlocks) { - if (fullBlock == null) { - throw new IllegalStateException("Full block not generated yet"); - } else { - for (Block block : pBlocks) { - blockStateOutput.accept(createSimpleBlock(block, fullBlock)); - delegateItemModel(block, fullBlock); - } - - return this; - } - } - public BlockFamilyProvider button(Block pButtonBlock) { ResourceLocation resourceLocation = ModelTemplates.BUTTON.create(pButtonBlock, mapping, modelOutput); ResourceLocation resourceLocation1 = ModelTemplates.BUTTON_PRESSED.create(pButtonBlock, mapping, modelOutput); @@ -432,7 +1052,8 @@ private void trapdoor(Block pTrapdoorBlock) { } private ResourceLocation getOrCreateModel(ModelTemplate pModelTemplate, Block pBlock) { - return models.computeIfAbsent(pModelTemplate, (resourceLocation) -> resourceLocation.create(pBlock, mapping, modelOutput)); + return models.computeIfAbsent(pModelTemplate, (resourceLocation) -> resourceLocation.create(pBlock, mapping, + modelOutput)); } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/ItemModelGenerator.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/ItemModelGenerator.java index 5ec2b3bcd..13028d062 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/ItemModelGenerator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/ItemModelGenerator.java @@ -10,12 +10,8 @@ import net.minecraft.world.item.Item; import net.minecraftforge.registries.RegistryObject; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.function.BiConsumer; -import java.util.function.Predicate; -import java.util.function.Supplier; +import java.util.*; +import java.util.function.*; public class ItemModelGenerator { @@ -44,7 +40,6 @@ private void generateFlatItem(Item item, ModelTemplate modelTemplate) { /** * Generate a spawn egg item. - * */ private void generateSpawnEggItem(Item item) { ItemModelGenerator.FLAT_SPAWN_EGG_ITEM.createItem(ModelLocationUtils.getModelLocation(item), output); @@ -52,7 +47,6 @@ private void generateSpawnEggItem(Item item) { /** * Generate a basic block item. - * */ private void generateBlockItem(Item item) { AdvancedModelTemplate BASIC_BLOCK_ITEM = new AdvancedModelTemplate(Optional.of(new ResourceLocation(ImmersiveWeapons.MOD_ID, "block/" + item.toString())), Optional.empty(), TextureSlot.LAYER0); @@ -65,7 +59,7 @@ private void generateBlockItem(Item item) { */ public void run() { ItemModelLists.init(); - List items = new ArrayList<>(1); + List items = new ArrayList<>(250); List ignoredItems = ItemModelLists.ignoredItems; DeferredRegistryHandler.ITEMS.getEntries().stream().map(RegistryObject::get).filter(Predicate.not(ignoredItems::contains)).forEach(items::add); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/ModelProvider.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/ModelProvider.java index c7ff5e2c3..a536930ab 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/ModelProvider.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/ModelProvider.java @@ -3,27 +3,18 @@ import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import net.minecraft.core.Registry; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.DataProvider; -import net.minecraft.data.HashCache; +import com.google.gson.*; +import net.minecraft.data.*; import net.minecraft.data.models.blockstates.BlockStateGenerator; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Supplier; +import java.util.*; +import java.util.function.*; public class ModelProvider implements DataProvider { @@ -92,7 +83,9 @@ public void run(@NotNull HashCache hashCache) { * @param biFunction the BiFunction path * @param the provider */ - private void saveCollection(HashCache hashCache, Path path, Map> map, BiFunction biFunction) { + private void saveCollection(HashCache hashCache, Path path, Map> map, + BiFunction biFunction) { + map.forEach((t, supplier) -> { Path save = biFunction.apply(path, t); @@ -106,8 +99,9 @@ private void saveCollection(HashCache hashCache, Path path, Map ignoredItems = new ArrayList<>(1); + public static final List ignoredItems = new ArrayList<>(75); /** * Initialize the lists. 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 de0757f5a..e6b7f5461 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/recipes/RecipeGenerator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/recipes/RecipeGenerator.java @@ -14,12 +14,14 @@ import net.minecraft.data.recipes.*; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag.Named; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; +import net.minecraft.world.item.*; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.common.Tags; +import net.minecraftforge.common.crafting.NBTIngredient; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; @@ -248,7 +250,6 @@ private void createMoltenItems() { createMoltenBoots(DeferredRegistryHandler.MOLTEN_BOOTS.get()); createMoltenIngot(DeferredRegistryHandler.MOLTEN_INGOT.get(), DeferredRegistryHandler.MOLTEN_BLOCK_ITEM.get()); createMoltenBlock(DeferredRegistryHandler.MOLTEN_BLOCK_ITEM.get()); - createMoltenPlate(DeferredRegistryHandler.MOLTEN_PLATE.get()); } private void createVentusItems() { @@ -277,7 +278,6 @@ private void createTeslaItems() { createTeslaBoots(DeferredRegistryHandler.TESLA_BOOTS.get()); createTeslaIngot(DeferredRegistryHandler.TESLA_INGOT.get(), DeferredRegistryHandler.TESLA_BLOCK_ITEM.get()); createTeslaBlock(DeferredRegistryHandler.TESLA_BLOCK_ITEM.get()); - createTeslaPlate(DeferredRegistryHandler.TESLA_PLATE.get()); createTeslaSynthesizer(DeferredRegistryHandler.TESLA_SYNTHESIZER_ITEM.get()); teslaSynthesizing(Items.STONE, Items.LAPIS_LAZULI, DeferredRegistryHandler.CONDUCTIVE_ALLOY.get(), 24000, DeferredRegistryHandler.ELECTRIC_INGOT.get()); @@ -481,11 +481,11 @@ private void createUtilityItems() { ShapedRecipeBuilder.shaped(DeferredRegistryHandler.LANDMINE_ITEM.get()) .define('a', ForgeItemTagGroups.METAL_INGOTS) .define('b', Items.HEAVY_WEIGHTED_PRESSURE_PLATE) - .define('c', Tags.Items.GUNPOWDER) + .define('c', Items.TNT) .pattern(" b ") .pattern("aca") .group("traps") - .unlockedBy("gunpowder", has(Tags.Items.GUNPOWDER)) + .unlockedBy("gunpowder", has(Items.TNT)) .save(finishedRecipeConsumer); // Mortar and shell ShapedRecipeBuilder.shaped(DeferredRegistryHandler.MORTAR_ITEM.get()) @@ -514,11 +514,11 @@ private void createUtilityItems() { .unlockedBy("note_block", has(Items.NOTE_BLOCK)) .save(finishedRecipeConsumer); // Sandbag - ShapedRecipeBuilder.shaped(DeferredRegistryHandler.SANDBAG_ITEM.get(), 2) + ShapedRecipeBuilder.shaped(DeferredRegistryHandler.SANDBAG_ITEM.get(), 6) .define('a', Tags.Items.SAND) .define('b', DeferredRegistryHandler.CLOTH_SCRAP.get()) .pattern("bbb") - .pattern("bab") + .pattern("aaa") .pattern("bbb") .group("sandbags") .unlockedBy("cloth_scrap", has(DeferredRegistryHandler.CLOTH_SCRAP.get())) @@ -548,7 +548,8 @@ private void createUtilityItems() { ShapedRecipeBuilder.shaped(DeferredRegistryHandler.PUNJI_STICKS_ITEM.get(), 3) .define('a', Items.DIRT) .define('b', Items.BAMBOO) - .define('c', Items.SPIDER_EYE) + .define('c', new NBTIngredient(PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.POISON)) { + }) .pattern("bbb") .pattern("bcb") .pattern("aaa") @@ -642,7 +643,7 @@ private void createFoodItems() { // Explosive chocolate bar ShapelessRecipeBuilder.shapeless(DeferredRegistryHandler.EXPLOSIVE_CHOCOLATE_BAR.get()) .requires(DeferredRegistryHandler.CHOCOLATE_BAR.get()) - .requires(Items.GUNPOWDER, 3) + .requires(Items.TNT) .group("food") .unlockedBy("chocolate_bar", has(DeferredRegistryHandler.CHOCOLATE_BAR.get())) .save(finishedRecipeConsumer); @@ -729,15 +730,19 @@ private void createDecorations() { .group("shelves") .unlockedBy("wooden_slabs", has(ItemTags.WOODEN_SLABS)) .save(finishedRecipeConsumer); - // Wooden table - ShapedRecipeBuilder.shaped(DeferredRegistryHandler.WOODEN_TABLE_ITEM.get()) - .define('a', Items.OAK_SLAB) - .define('b', Items.OAK_FENCE) - .pattern(" a ") - .pattern(" b ") - .group("tables") - .unlockedBy("oak_slab", has(Items.OAK_SLAB)) - .save(finishedRecipeConsumer); + + // Tables + createTable(DeferredRegistryHandler.OAK_TABLE_ITEM.get(), Items.OAK_SLAB, Items.OAK_FENCE); + createTable(DeferredRegistryHandler.SPRUCE_TABLE_ITEM.get(), Items.SPRUCE_SLAB, Items.SPRUCE_FENCE); + createTable(DeferredRegistryHandler.BIRCH_TABLE_ITEM.get(), Items.BIRCH_SLAB, Items.BIRCH_FENCE); + createTable(DeferredRegistryHandler.JUNGLE_TABLE_ITEM.get(), Items.JUNGLE_SLAB, Items.JUNGLE_FENCE); + createTable(DeferredRegistryHandler.ACACIA_TABLE_ITEM.get(), Items.ACACIA_SLAB, Items.ACACIA_FENCE); + createTable(DeferredRegistryHandler.DARK_OAK_TABLE_ITEM.get(), Items.DARK_OAK_SLAB, Items.DARK_OAK_FENCE); + createTable(DeferredRegistryHandler.CRIMSON_TABLE_ITEM.get(), Items.CRIMSON_SLAB, Items.CRIMSON_FENCE); + createTable(DeferredRegistryHandler.WARPED_TABLE_ITEM.get(), Items.WARPED_SLAB, Items.WARPED_FENCE); + createTable(DeferredRegistryHandler.BURNED_OAK_TABLE_ITEM.get(), DeferredRegistryHandler.BURNED_OAK_SLAB_ITEM.get(), + DeferredRegistryHandler.BURNED_OAK_FENCE_ITEM.get()); + } private void createMiscellaneousItems() { @@ -752,7 +757,7 @@ private void createMiscellaneousItems() { .unlockedBy("azul_keystone_fragment", has(DeferredRegistryHandler.AZUL_KEYSTONE_FRAGMENT.get())) .save(finishedRecipeConsumer); // Cloth scrap - ShapedRecipeBuilder.shaped(DeferredRegistryHandler.CLOTH_SCRAP.get()) + ShapedRecipeBuilder.shaped(DeferredRegistryHandler.CLOTH_SCRAP.get(), 4) .define('a', Tags.Items.STRING) .define('b', Items.GRASS) .pattern("bbb") @@ -812,6 +817,10 @@ private void createMiscellaneousItems() { .group("rods") .unlockedBy("planks", has(ItemTags.PLANKS)) .save(finishedRecipeConsumer); + + // Sulfur stuff + createRawSulfurBlock(DeferredRegistryHandler.RAW_SULFUR_BLOCK_ITEM.get(), DeferredRegistryHandler.SULFUR.get()); + createSulfur(DeferredRegistryHandler.SULFUR.get(), DeferredRegistryHandler.RAW_SULFUR_BLOCK_ITEM.get()); } private static void createCobaltArrow(ItemLike arrowItem) { @@ -825,7 +834,7 @@ private static void createCobaltSword(ItemLike swordItem) { ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(swordItem) .group("cobalt") .unlockedBy("cobalt_ingot", has(ForgeItemTagGroups.COBALT_INGOTS)); - createSword(builder, ForgeItemTagGroups.COBALT_INGOTS); + createSword(builder, ForgeItemTagGroups.COBALT_INGOTS, Items.STICK); } private static void createCobaltPickaxe(ItemLike pickaxeItem) { @@ -967,7 +976,7 @@ private static void createCopperSword(ItemLike swordItem) { ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(swordItem) .group("copper") .unlockedBy("copper_ingot", has(ForgeItemTagGroups.COPPER_INGOTS)); - createSword(builder, ForgeItemTagGroups.COPPER_INGOTS); + createSword(builder, ForgeItemTagGroups.COPPER_INGOTS, Items.STICK); } private static void createCopperPickaxe(ItemLike pickaxeItem) { @@ -1065,7 +1074,7 @@ private static void createMoltenSword(ItemLike swordItem) { ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(swordItem) .group("molten") .unlockedBy("molten_ingot", has(DeferredRegistryHandler.MOLTEN_INGOT.get())); - createSword(builder, ImmersiveWeaponsItemTagGroups.MOLTEN_INGOTS); + createSword(builder, ImmersiveWeaponsItemTagGroups.MOLTEN_INGOTS, DeferredRegistryHandler.OBSIDIAN_ROD.get()); } private static void createMoltenPickaxe(ItemLike pickaxeItem) { @@ -1162,7 +1171,7 @@ private static void createVentusSword(ItemLike swordItem) { ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(swordItem) .group("ventus") .unlockedBy("ventus_shard", has(DeferredRegistryHandler.VENTUS_SHARD.get())); - createSword(builder, ImmersiveWeaponsItemTagGroups.VENTUS_SHARDS); + createSword(builder, ImmersiveWeaponsItemTagGroups.VENTUS_SHARDS, DeferredRegistryHandler.OBSIDIAN_ROD.get()); } private static void createVentusPickaxe(ItemLike pickaxeItem) { @@ -1249,7 +1258,7 @@ private static void createTeslaSword(ItemLike swordItem) { ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(swordItem) .group("tesla") .unlockedBy("tesla_ingot", has(ImmersiveWeaponsItemTagGroups.TESLA_INGOTS)); - createSword(builder, ImmersiveWeaponsItemTagGroups.TESLA_INGOTS); + createSword(builder, ImmersiveWeaponsItemTagGroups.TESLA_INGOTS, DeferredRegistryHandler.OBSIDIAN_ROD.get()); } private static void createTeslaPickaxe(ItemLike pickaxeItem) { @@ -1454,7 +1463,7 @@ private static void createWoodGauntlet(ItemLike gauntletItem) { ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(gauntletItem) .group("wood") .unlockedBy("planks", has(ItemTags.PLANKS)); - createGauntlet(builder, ImmersiveWeaponsItemTagGroups.WOOD_SHARDS); + createGauntlet(builder, ItemTags.PLANKS); } private static void createStoneGauntlet(ItemLike gauntletItem) { @@ -1902,6 +1911,21 @@ private static void createHardenedMudStairs(ItemLike stairsItem, ItemLike materi .save(finishedRecipeConsumer, ImmersiveWeapons.MOD_ID + ":" + getConversionRecipeName(stairsItem, material) + "_stonecutting"); } + private static void createRawSulfurBlock(ItemLike blockItem, ItemLike material) { + ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(blockItem) + .group("sulfur") + .unlockedBy("sulfur", has(DeferredRegistryHandler.SULFUR.get())); + create3x3Object(builder, material); + } + + private static void createSulfur(ItemLike rawItem, ItemLike material) { + ShapelessRecipeBuilder.shapeless(rawItem, 9) + .requires(material) + .group("sulfur") + .unlockedBy("raw_sulfur_block", has(DeferredRegistryHandler.RAW_SULFUR_BLOCK_ITEM.get())) + .save(finishedRecipeConsumer); + } + private static void createArrow(ShapedRecipeBuilder builder, Named material) { builder.define('a', material) .define('b', Items.STICK) @@ -1912,9 +1936,9 @@ private static void createArrow(ShapedRecipeBuilder builder, Named materia .save(finishedRecipeConsumer); } - private static void createSword(ShapedRecipeBuilder builder, Named material) { + private static void createSword(ShapedRecipeBuilder builder, Named material, Item stick) { builder.define('a', material) - .define('b', Items.STICK) + .define('b', stick) .pattern(" a ") .pattern(" a ") .pattern(" b ") @@ -2158,6 +2182,17 @@ private static void createCorrugatedIronPanelBars(ItemLike panelItem, ItemLike f .save(finishedRecipeConsumer); } + private static void createTable(ItemLike tableItem, ItemLike slabItem, ItemLike fenceItem) { + ShapedRecipeBuilder.shaped(tableItem) + .define('a', slabItem) + .define('b', fenceItem) + .pattern("a") + .pattern("b") + .group("tables") + .unlockedBy("planks", has(ItemTags.PLANKS)) + .save(finishedRecipeConsumer); + } + private static void createShard(ShapelessRecipeBuilder builder, ItemLike material) { builder.requires(material) .group("shard") 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 157e2472e..7b2a2cb8e 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BlockTagsGenerator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/BlockTagsGenerator.java @@ -60,7 +60,8 @@ private void addForgeTags() { } // Ore tags - tag(ForgeBlockTagGroups.COBALT_ORES).add(DeferredRegistryHandler.COBALT_ORE.get()).add(DeferredRegistryHandler.DEEPSLATE_COBALT_ORE.get()); + tag(ForgeBlockTagGroups.COBALT_ORES).add(DeferredRegistryHandler.COBALT_ORE.get()) + .add(DeferredRegistryHandler.DEEPSLATE_COBALT_ORE.get()); tag(Blocks.ORES).addTag(ForgeBlockTagGroups.COBALT_ORES); } @@ -119,13 +120,17 @@ private void addMinecraftTags() { // Wooden trapdoors tag tag(MinecraftBlockTagGroups.WOODEN_TRAPDOORS).add(DeferredRegistryHandler.BURNED_OAK_TRAPDOOR.get()); + + // Non-flammable wood tag + tag(MinecraftBlockTagGroups.NON_FLAMMABLE_WOOD).add(DeferredRegistryHandler.WARPED_TABLE.get(), + DeferredRegistryHandler.CRIMSON_TABLE.get()); } /** * Add block tags for mining with tools */ private void addMiningBlockTags() { - List blocks = new ArrayList<>(1); + List blocks = new ArrayList<>(250); DeferredRegistryHandler.BLOCKS.getEntries().stream().map(RegistryObject::get).forEach(blocks::add); int tagStage = 0; @@ -139,9 +144,15 @@ private void addMiningBlockTags() { tagStage = 3; } - if (block == DeferredRegistryHandler.BULLETPROOF_GLASS.get() || block == DeferredRegistryHandler.SMALL_PARTS_TABLE.get() || block == DeferredRegistryHandler.SANDBAG.get()) { + if (block == DeferredRegistryHandler.BULLETPROOF_GLASS.get() + || block == DeferredRegistryHandler.SMALL_PARTS_TABLE.get() + || block == DeferredRegistryHandler.SANDBAG.get()) { + tier = 0; - } else if (block == DeferredRegistryHandler.SPOTLIGHT.get() || block == DeferredRegistryHandler.WOODEN_SPIKES.get() || block == DeferredRegistryHandler.PUNJI_STICKS.get()) { + } 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; 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 445d587a6..0ea847a0f 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 @@ -20,4 +20,5 @@ public class MinecraftBlockTagGroups { 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"); } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/lists/BlockTagLists.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/lists/BlockTagLists.java index 1178c6dfd..9df15a5c9 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/lists/BlockTagLists.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/lists/BlockTagLists.java @@ -8,9 +8,10 @@ public class BlockTagLists { - public static final List BULLETPROOF_GLASS = new ArrayList<>(1); - public static final List STAINED_GLASS = new ArrayList<>(1); - public static final List BURNED_OAK_LOGS = new ArrayList<>(1); + public static final List BULLETPROOF_GLASS = new ArrayList<>(15); + public static final List STAINED_GLASS = new ArrayList<>(15); + public static final List BURNED_OAK_LOGS = new ArrayList<>(5); + public static final List TABLES = new ArrayList<>(9); /** * Initialize the lists. @@ -19,6 +20,7 @@ public static void init() { addBulletproofGlass(); addStainedGlass(); addBurnedOakLogs(); + addTables(); } private static void addBulletproofGlass() { @@ -66,4 +68,16 @@ private static void addBurnedOakLogs() { BURNED_OAK_LOGS.add(DeferredRegistryHandler.STRIPPED_BURNED_OAK_LOG.get()); BURNED_OAK_LOGS.add(DeferredRegistryHandler.STRIPPED_BURNED_OAK_WOOD.get()); } + + private static void addTables() { + TABLES.add(DeferredRegistryHandler.OAK_TABLE.get()); + TABLES.add(DeferredRegistryHandler.SPRUCE_TABLE.get()); + TABLES.add(DeferredRegistryHandler.BIRCH_TABLE.get()); + TABLES.add(DeferredRegistryHandler.JUNGLE_TABLE.get()); + TABLES.add(DeferredRegistryHandler.ACACIA_TABLE.get()); + TABLES.add(DeferredRegistryHandler.DARK_OAK_TABLE.get()); + TABLES.add(DeferredRegistryHandler.CRIMSON_TABLE.get()); + TABLES.add(DeferredRegistryHandler.WARPED_TABLE.get()); + TABLES.add(DeferredRegistryHandler.BURNED_OAK_TABLE.get()); + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/lists/ItemTagLists.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/lists/ItemTagLists.java index c0ad81cbc..460cef206 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/lists/ItemTagLists.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/tags/lists/ItemTagLists.java @@ -8,8 +8,8 @@ public class ItemTagLists { - public static final List MUSKET_BALLS = new ArrayList<>(1); - public static final List ARROWS = new ArrayList<>(1); + public static final List MUSKET_BALLS = new ArrayList<>(10); + public static final List ARROWS = new ArrayList<>(20); /** * Initialize the lists. 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 b63628e54..eba25f4dd 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 @@ -1,6 +1,6 @@ package com.anonymoushacker1279.immersiveweapons.entity.ai.goal; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.entity.monster.CelestialTowerEntity; import com.anonymoushacker1279.immersiveweapons.entity.monster.RockSpiderEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; @@ -30,7 +30,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(ServerConfig.CELESTIAL_TOWER_MINIONS_WAVE_SIZE_MODIFIER.get()); + private static final float MINION_WAVE_SIZE_MODIFIER = Float.parseFloat(CommonConfig.CELESTIAL_TOWER_MINIONS_WAVE_SIZE_MODIFIER.get()); public CelestialTowerSummonGoal(CelestialTowerEntity pMob) { mob = pMob; 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 2acb1e993..f1b2fec9c 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractDyingSoldierEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractDyingSoldierEntity.java @@ -1,8 +1,8 @@ package com.anonymoushacker1279.immersiveweapons.entity.monster; import com.anonymoushacker1279.immersiveweapons.entity.ai.goal.RangedGunAttackGoal; -import com.anonymoushacker1279.immersiveweapons.entity.passive.FieldMedicEntity; -import com.anonymoushacker1279.immersiveweapons.entity.passive.MinutemanEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.FieldMedicEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.MinutemanEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.item.projectile.arrow.AbstractArrowItem; import net.minecraft.core.BlockPos; @@ -24,7 +24,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.item.BowItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ProjectileWeaponItem; import net.minecraft.world.level.Level; @@ -40,7 +39,8 @@ public abstract class AbstractDyingSoldierEntity extends Monster implements RangedAttackMob { - private final RangedGunAttackGoal aiPistolAttack = new RangedGunAttackGoal<>(this, 1.0D, 20, 15.0F); + private final RangedGunAttackGoal aiPistolAttack = + new RangedGunAttackGoal<>(this, 1.0D, 20, 15.0F); private final MeleeAttackGoal aiAttackOnCollide = new MeleeAttackGoal(this, 1.2D, false) { /** * Reset the task's internal state. Called when this task is interrupted by another one @@ -92,7 +92,8 @@ protected void registerGoals() { goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 1.0D)); goalSelector.addGoal(4, new LookAtPlayerGoal(this, Player.class, 8.0F)); goalSelector.addGoal(100, new RandomLookAroundGoal(this)); - goalSelector.addGoal(6, new MoveThroughVillageGoal(this, 1.0D, false, 6, () -> true)); + goalSelector.addGoal(6, new MoveThroughVillageGoal(this, 1.0D, false, + 6, () -> true)); goalSelector.addGoal(6, new OpenDoorGoal(this, false)); targetSelector.addGoal(1, new HurtByTargetGoal(this)); targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Villager.class, false)); @@ -166,9 +167,9 @@ public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldIn, @NotNu setCanPickUpLoot(random.nextFloat() < 0.55F * difficultyIn.getSpecialMultiplier()); if (getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { LocalDate localdate = LocalDate.now(); - int i = localdate.get(ChronoField.DAY_OF_MONTH); - int j = localdate.get(ChronoField.MONTH_OF_YEAR); - if (j == 10 && i == 31 && random.nextFloat() < 0.25F) { + int day = localdate.get(ChronoField.DAY_OF_MONTH); + int month = localdate.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)); armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } @@ -184,14 +185,16 @@ private void setCombatTask() { if (!level.isClientSide) { goalSelector.removeGoal(aiAttackOnCollide); goalSelector.removeGoal(aiPistolAttack); - ItemStack itemstack = getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, Predicate.isEqual(DeferredRegistryHandler.FLINTLOCK_PISTOL.get()))); - if (itemstack.getItem() == DeferredRegistryHandler.FLINTLOCK_PISTOL.get()) { - int i = 20; + ItemStack itemInHand = getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, + Predicate.isEqual(DeferredRegistryHandler.FLINTLOCK_PISTOL.get()))); + + if (itemInHand.getItem() == DeferredRegistryHandler.FLINTLOCK_PISTOL.get()) { + int cooldown = 20; if (level.getDifficulty() != Difficulty.HARD) { - i = 40; + cooldown = 40; } - aiPistolAttack.setAttackCooldown(i); + aiPistolAttack.setAttackCooldown(cooldown); goalSelector.addGoal(1, aiPistolAttack); } else { goalSelector.addGoal(4, aiAttackOnCollide); @@ -208,28 +211,36 @@ private void setCombatTask() { */ @Override public void performRangedAttack(@NotNull LivingEntity target, float distanceFactor) { - ItemStack itemstack = getProjectile(getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, Predicate.isEqual(DeferredRegistryHandler.FLINTLOCK_PISTOL.get())))); - AbstractArrow abstractArrow = fireArrow(itemstack, distanceFactor); - if (getMainHandItem().getItem() instanceof BowItem) - abstractArrow = ((BowItem) getMainHandItem().getItem()).customArrow(abstractArrow); - double d0 = target.getX() - getX(); - double d1 = target.getY(0.1D) - abstractArrow.getY(); - double d2 = target.getZ() - getZ(); - double d3 = Mth.sqrt((float) (d0 * d0 + d2 * d2)); - abstractArrow.shoot(d0, d1 + d3 * (double) 0.2F, d2, 1.6F, (float) (14 - level.getDifficulty().getId() * 4)); - playSound(DeferredRegistryHandler.FLINTLOCK_PISTOL_FIRE.get(), 1.0F, 1.0F / (getRandom().nextFloat() * 0.4F + 0.8F)); - level.addFreshEntity(abstractArrow); + AbstractArrow abstractBulletEntity = fireArrow(new ItemStack(DeferredRegistryHandler.IRON_MUSKET_BALL.get()), + distanceFactor); + + double deltaX = target.getX() - getX(); + double deltaY = target.getY(0.1D) - abstractBulletEntity.getY(); + double deltaZ = target.getZ() - getZ(); + double sqrtXZ = Mth.sqrt((float) (deltaX * deltaX + deltaZ * deltaZ)); + + abstractBulletEntity.setKnockback(3); + abstractBulletEntity.setOwner(this); + + abstractBulletEntity.shoot(deltaX, deltaY + sqrtXZ * 0.2D, deltaZ, 1.6F, + (float) (14 - level.getDifficulty().getId() * 4)); + playSound(DeferredRegistryHandler.FLINTLOCK_PISTOL_FIRE.get(), 1.0F, + 1.0F / (getRandom().nextFloat() * 0.4F + 0.8F)); + level.addFreshEntity(abstractBulletEntity); } /** - * Fires an arrow. + * Fires an arrow. Technically, all projectiles coming from this entity will be bullets, + * though they use a modified arrow entity for this. * * @param arrowStack the ItemStack of the arrow * @param distanceFactor the distance factor for firing * @return AbstractArrowEntity */ private AbstractArrow fireArrow(ItemStack arrowStack, float distanceFactor) { - AbstractArrowItem arrowItem = (AbstractArrowItem) (arrowStack.getItem() instanceof AbstractArrowItem ? arrowStack.getItem() : DeferredRegistryHandler.IRON_MUSKET_BALL.get()); + AbstractArrowItem arrowItem = (AbstractArrowItem) (arrowStack.getItem() instanceof AbstractArrowItem + ? arrowStack.getItem() : DeferredRegistryHandler.IRON_MUSKET_BALL.get()); + AbstractArrow abstractArrowEntity = arrowItem.createArrow(level, arrowStack, this); abstractArrowEntity.setEnchantmentEffectsFromEntity(this, distanceFactor); 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 8576f7af7..87204f59d 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractWanderingWarriorEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/AbstractWanderingWarriorEntity.java @@ -4,9 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.Difficulty; -import net.minecraft.world.DifficultyInstance; -import net.minecraft.world.InteractionHand; +import net.minecraft.world.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -16,9 +14,7 @@ import net.minecraft.world.entity.monster.Creeper; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; +import net.minecraft.world.item.*; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; @@ -77,7 +73,8 @@ protected void registerGoals() { goalSelector.addGoal(100, new RandomLookAroundGoal(this)); goalSelector.addGoal(4, new OpenDoorGoal(this, false)); goalSelector.addGoal(1, new FloatGoal(this)); - targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Monster.class, 1, true, true, (targetPredicate) -> !(targetPredicate instanceof Creeper))); + targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Monster.class, 1, + true, true, (targetPredicate) -> !(targetPredicate instanceof Creeper))); targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); targetSelector.addGoal(2, new HurtByTargetGoal(this)); } @@ -124,24 +121,19 @@ protected void populateDefaultEquipmentSlots(@NotNull DifficultyInstance difficu setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(DeferredRegistryHandler.COPPER_SWORD.get())); } // Populate armor - boolean flag = true; int armorTier = 0; - if (this.random.nextFloat() < 0.1F) { - armorTier++; - } - if (this.random.nextFloat() < 0.1F) { + if (this.random.nextFloat() < 0.2F) { armorTier++; } float difficultyModifier = level.getDifficulty() == Difficulty.HARD ? 0.3F : 0.75F; for (EquipmentSlot equipmentSlot : EquipmentSlot.values()) { if (equipmentSlot.getType() == EquipmentSlot.Type.ARMOR) { - ItemStack itemstack = getItemBySlot(equipmentSlot); - if (!flag && this.random.nextFloat() < difficultyModifier) { + ItemStack itemBySlot = getItemBySlot(equipmentSlot); + if (this.random.nextFloat() < difficultyModifier) { break; } - flag = false; - if (itemstack.isEmpty()) { + if (itemBySlot.isEmpty()) { Item item = getEquipmentForSlot(equipmentSlot, armorTier); if (item != null) { setItemSlot(equipmentSlot, new ItemStack(item)); @@ -169,10 +161,10 @@ public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldIn, @NotNu setCombatTask(); setCanPickUpLoot(random.nextFloat() < 0.55F * difficultyIn.getSpecialMultiplier()); if (getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { - LocalDate localdate = LocalDate.now(); - int i = localdate.get(ChronoField.DAY_OF_MONTH); - int j = localdate.get(ChronoField.MONTH_OF_YEAR); - if (j == 10 && i == 31 && random.nextFloat() < 0.25F) { + 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)); armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } 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 eb2e79a90..3733a4d12 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/CelestialTowerEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/CelestialTowerEntity.java @@ -1,6 +1,6 @@ package com.anonymoushacker1279.immersiveweapons.entity.monster; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +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; @@ -36,15 +36,16 @@ public class CelestialTowerEntity extends Monster { - public final ServerBossEvent bossEvent = (ServerBossEvent) (new ServerBossEvent(getDisplayName(), BossBarColor.RED, BossBarOverlay.PROGRESS)).setDarkenScreen(true); + public final ServerBossEvent bossEvent = (ServerBossEvent) (new ServerBossEvent(getDisplayName(), BossBarColor.RED, + BossBarOverlay.PROGRESS)).setDarkenScreen(true); private int totalWavesToSpawn = 3; 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 = ServerConfig.CELESTIAL_TOWER_XZ_SPAWN_CHECK_RADIUS.get(); - private static final int Y_SPAWN_CHECK_RADIUS = ServerConfig.CELESTIAL_TOWER_Y_SPAWN_CHECK_RADIUS.get(); + 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(); public CelestialTowerEntity(EntityType type, Level level) { super(type, level); @@ -96,7 +97,10 @@ protected float getStandingEyeHeight(@NotNull Pose pPose, @NotNull EntityDimensi @Nullable @Override - public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNull DifficultyInstance pDifficulty, @NotNull MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNull DifficultyInstance pDifficulty, + @NotNull MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, + @Nullable CompoundTag pDataTag) { + pSpawnData = super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); teleportTo(getX(), getY() + 2, getZ()); @@ -118,7 +122,8 @@ public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNul xpReward = 75; } - Objects.requireNonNull(getAttribute(Attributes.ARMOR)).setBaseValue(getAttributeBaseValue(Attributes.ARMOR) + (totalWavesToSpawn * 5)); + Objects.requireNonNull(getAttribute(Attributes.ARMOR)).setBaseValue(getAttributeBaseValue(Attributes.ARMOR) + + (totalWavesToSpawn * 5)); return pSpawnData; } @@ -126,7 +131,11 @@ public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNul @Override public void tick() { super.tick(); - level.addParticle(ParticleTypes.LAVA, getX() + GeneralUtilities.getRandomNumber(-1d, 1.01d), getY(), getZ() + GeneralUtilities.getRandomNumber(-1d, 1.01d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d), GeneralUtilities.getRandomNumber(-0.1d, -0.08d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d)); + level.addParticle(ParticleTypes.LAVA, getX() + GeneralUtilities.getRandomNumber(-1d, 1.01d), getY(), + getZ() + GeneralUtilities.getRandomNumber(-1d, 1.01d), + GeneralUtilities.getRandomNumber(-0.03d, 0.03d), + GeneralUtilities.getRandomNumber(-0.1d, -0.08d), + GeneralUtilities.getRandomNumber(-0.03d, 0.03d)); } @Override @@ -161,7 +170,8 @@ public void readAdditionalSaveData(@NotNull CompoundTag pCompound) { doneSpawningWaves = pCompound.getBoolean("doneSpawningWaves"); if (wavesSpawned > 0) { - bossEvent.setName(new TranslatableComponent("immersiveweapons.boss.celestial_tower.waves", wavesSpawned, totalWavesToSpawn)); + bossEvent.setName(new TranslatableComponent("immersiveweapons.boss.celestial_tower.waves", wavesSpawned, + totalWavesToSpawn)); bossEvent.setProgress((float) wavesSpawned / totalWavesToSpawn); } } @@ -201,7 +211,10 @@ public boolean checkSpawnRules(@NotNull LevelAccessor pLevel, @NotNull MobSpawnT 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)) + 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(); @@ -223,7 +236,9 @@ public boolean checkSpawnRules(@NotNull LevelAccessor pLevel, @NotNull MobSpawnT 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)) + 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; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/DyingSoldierEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/DyingSoldierEntity.java index c71a8377e..a996fd920 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/DyingSoldierEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/DyingSoldierEntity.java @@ -70,25 +70,4 @@ protected SoundEvent getDeathSound() { protected SoundEvent getStepSound() { return DeferredRegistryHandler.DYING_SOLDIER_STEP.get(); } - - /** - * Set custom loot parameters. - * - * @param source the DamageSource instance - * @param looting the level of looting enchantment on an item - * @param recentlyHitIn if the entity was recently hit - */ - @Override - protected void dropCustomDeathLoot(@NotNull DamageSource source, int looting, boolean recentlyHitIn) { - super.dropCustomDeathLoot(source, looting, recentlyHitIn); - int lootingModifier = looting * 2; - if (lootingModifier >= 75) { - spawnAtLocation(DeferredRegistryHandler.FLINTLOCK_PISTOL.get()); - } else { - int i = GeneralUtilities.getRandomNumber(1, 75 - lootingModifier); - if (i == 1) { - spawnAtLocation(DeferredRegistryHandler.FLINTLOCK_PISTOL.get()); - } - } - } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/HansEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/HansEntity.java index fb4c3bf2a..f5473cd7f 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/HansEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/HansEntity.java @@ -111,7 +111,9 @@ public void populateDefaultEquipmentSlots(@NotNull DifficultyInstance difficulty */ @Override public boolean hurt(@NotNull DamageSource source, float amount) { - if (amount > 0 && source.getEntity() instanceof Player || source.getEntity() instanceof Mob || source.getEntity() instanceof PathfinderMob) { + if (amount > 0 && source.getEntity() instanceof Player || source.getEntity() instanceof Mob + || source.getEntity() instanceof PathfinderMob) { + if (source.isCreativePlayer()) { super.hurt(source, amount); return false; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/LavaRevenantEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/LavaRevenantEntity.java index dc1b2df3a..00d5c9dea 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/LavaRevenantEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/LavaRevenantEntity.java @@ -1,16 +1,14 @@ package com.anonymoushacker1279.immersiveweapons.entity.monster; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.EntityDataSerializers; -import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.network.syncher.*; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; @@ -19,9 +17,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.control.BodyRotationControl; -import net.minecraft.world.entity.ai.control.LookControl; -import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.control.*; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.targeting.TargetingConditions; import net.minecraft.world.entity.monster.Enemy; @@ -32,7 +28,6 @@ import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent.Context; @@ -40,16 +35,14 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.function.Supplier; public class LavaRevenantEntity extends FlyingMob implements Enemy { public static final int TICKS_PER_FLAP = Mth.ceil(24.166098F); - private static final EntityDataAccessor ID_SIZE = SynchedEntityData.defineId(LavaRevenantEntity.class, EntityDataSerializers.INT); + 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; @@ -145,24 +138,34 @@ protected boolean shouldDespawnInPeaceful() { public void tick() { super.tick(); if (level.isClientSide) { - float f = Mth.cos((float) (getUniqueFlapTickOffset() + tickCount) * 7.448451F * ((float) Math.PI / 180F) + (float) Math.PI); - float f1 = Mth.cos((float) (getUniqueFlapTickOffset() + tickCount + 1) * 7.448451F * ((float) Math.PI / 180F) + (float) Math.PI); - if (f > 0.0F && f1 <= 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); + 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) Math.PI / 180F) + (float) Math.PI); + + if (flapTick > 0.0F && flapTick1 <= 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); } int size = getSize(); float xSizeModifier = Mth.cos(getYRot() * ((float) Math.PI / 180F)) * (7.0F * (float) size); float zSizeModifier = Mth.sin(getYRot() * ((float) Math.PI / 180F)) * (7.0f * (float) size); - float ySizeModifier = (0.3F + f * 0.45F) * ((float) size * 0.2F + 1.5F); - level.addParticle(ParticleTypes.LAVA, getX() + (double) xSizeModifier, getY() + (double) ySizeModifier, 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); + float ySizeModifier = (0.3F + flapTick * 0.45F) * ((float) size * 0.2F + 1.5F); + + level.addParticle(ParticleTypes.LAVA, getX() + (double) xSizeModifier, getY() + (double) ySizeModifier, + 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); } } @Override - public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNull DifficultyInstance pDifficulty, @NotNull MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + 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)); setHealth(getMaxHealth()); @@ -170,7 +173,7 @@ public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNul } /** - * (abstract) Protected helper method to read subclass entity data from NBT. + * Helper method to read subclass entity data from NBT. */ @Override public void readAdditionalSaveData(@NotNull CompoundTag pCompound) { @@ -239,10 +242,10 @@ public boolean canAttackType(@NotNull EntityType pType) { @Override public @NotNull EntityDimensions getDimensions(@NotNull Pose pPose) { - int i = getSize(); + int size = getSize(); EntityDimensions dimensions = super.getDimensions(pPose); - float f = (dimensions.width + 0.2F * (float) i) / dimensions.width; - return dimensions.scale(f); + float scaleFactor = (dimensions.width + 0.2F * (float) size) / dimensions.width; + return dimensions.scale(scaleFactor); } enum AttackPhase { @@ -310,11 +313,12 @@ public static void handle(LavaRevenantEntityPacketHandler msg, Supplier * * @param msg the LavaRevenantEntityPacketHandler message being sent */ - @OnlyIn(Dist.CLIENT) private static void handleOnClient(LavaRevenantEntityPacketHandler msg) { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.level != null) { - minecraft.level.playLocalSound(msg.blockPos.getX(), msg.blockPos.getY(), msg.blockPos.getZ(), DeferredRegistryHandler.LAVA_REVENANT_BITE.get(), SoundSource.HOSTILE, 0.3F, GeneralUtilities.getRandomNumber(0.0f, 1.0f) * 0.1F + 0.9F, false); + minecraft.level.playLocalSound(msg.blockPos.getX(), msg.blockPos.getY(), msg.blockPos.getZ(), + DeferredRegistryHandler.LAVA_REVENANT_BITE.get(), SoundSource.HOSTILE, 0.3F, + GeneralUtilities.getRandomNumber(0.0f, 1.0f) * 0.1F + 0.9F, false); } } } @@ -333,11 +337,12 @@ public boolean canUse() { --nextScanTick; } else { nextScanTick = 60; - List list = level.getNearbyPlayers(attackTargeting, LavaRevenantEntity.this, getBoundingBox().inflate(128.0D, 96.0D, 128.0D)); - if (!list.isEmpty()) { - list.sort(Comparator. comparing(Entity::getY).reversed()); + List nearbyPlayers = level.getNearbyPlayers(attackTargeting, LavaRevenantEntity.this, + getBoundingBox().inflate(128.0D, 96.0D, 128.0D)); + if (!nearbyPlayers.isEmpty()) { + nearbyPlayers.sort(Comparator. comparing(Entity::getY).reversed()); - for (Player player : list) { + for (Player player : nearbyPlayers) { if (canAttack(player, TargetingConditions.DEFAULT)) { setTarget(player); return true; @@ -354,8 +359,8 @@ public boolean canUse() { */ @Override public boolean canContinueToUse() { - LivingEntity livingentity = getTarget(); - return livingentity != null && canAttack(livingentity, TargetingConditions.DEFAULT); + LivingEntity target = getTarget(); + return target != null && canAttack(target, TargetingConditions.DEFAULT); } } @@ -368,8 +373,8 @@ class AttackStrategyGoal extends Goal { */ @Override public boolean canUse() { - LivingEntity livingentity = getTarget(); - return livingentity != null && canAttack(getTarget(), TargetingConditions.DEFAULT); + LivingEntity target = getTarget(); + return target != null && canAttack(getTarget(), TargetingConditions.DEFAULT); } /** @@ -387,7 +392,8 @@ public void start() { */ @Override public void stop() { - anchorPoint = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, anchorPoint).above(30 + random.nextInt(20)); + anchorPoint = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, anchorPoint) + .above(30 + random.nextInt(20)); } /** @@ -401,7 +407,8 @@ public void tick() { attackPhase = LavaRevenantEntity.AttackPhase.SWOOP; setAnchorAboveTarget(); nextSweepTick = (8 + random.nextInt(4)) * 20; - playSound(DeferredRegistryHandler.LAVA_REVENANT_SWOOP.get(), 10.0F, 0.95F + random.nextFloat() * 0.1F); + playSound(DeferredRegistryHandler.LAVA_REVENANT_SWOOP.get(), 10.0F, + 0.95F + random.nextFloat() * 0.1F); } } @@ -501,7 +508,8 @@ private void selectNext() { } angle += clockwise * 15.0F * ((float) Math.PI / 180F); - moveTargetPoint = Vec3.atLowerCornerOf(anchorPoint).add(distance * Mth.cos(angle), -4.0F + height, distance * Mth.sin(angle)); + moveTargetPoint = Vec3.atLowerCornerOf(anchorPoint).add(distance * Mth.cos(angle), -4.0F + height, + distance * Mth.sin(angle)); } } @@ -519,36 +527,36 @@ public void tick() { speed = 0.1F; } - float f = (float) (moveTargetPoint.x - getX()); - float f1 = (float) (moveTargetPoint.y - getY()); - float f2 = (float) (moveTargetPoint.z - getZ()); - double d0 = Mth.sqrt(f * f + f2 * f2); - if (Math.abs(d0) > (double) 1.0E-5F) { - double d1 = 1.0D - (double) Mth.abs(f1 * 0.7F) / d0; - f = (float) ((double) f * d1); - f2 = (float) ((double) f2 * d1); - d0 = Mth.sqrt(f * f + f2 * f2); - double d2 = Mth.sqrt(f * f + f2 * f2 + f1 * f1); - float f3 = getYRot(); - float f4 = (float) Mth.atan2(f2, f); - float f5 = Mth.wrapDegrees(getYRot() + 90.0F); - float f6 = Mth.wrapDegrees(f4 * (180F / (float) Math.PI)); - setYRot(Mth.approachDegrees(f5, f6, 4.0F) - 90.0F); + float deltaTargetX = (float) (moveTargetPoint.x - getX()); + float deltaTargetY = (float) (moveTargetPoint.y - getY()); + 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); + sqrtXZ = Mth.sqrt(deltaTargetX * deltaTargetX + deltaTargetZ * deltaTargetZ); + 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(f3, getYRot()) < 3.0F) { + if (Mth.degreesDifferenceAbs(yRotation, getYRot()) < 3.0F) { speed = Mth.approach(speed, 1.8F, 0.005F * (1.8F / speed)); } else { speed = Mth.approach(speed, 0.2F, 0.025F); } - float f7 = (float) (-(Mth.atan2(-f1, d0) * (double) (180F / (float) Math.PI))); - setXRot(f7); - float f8 = getYRot() + 90.0F; - double d3 = (double) (speed * Mth.cos(f8 * ((float) Math.PI / 180F))) * Math.abs((double) f / d2); - double d4 = (double) (speed * Mth.sin(f8 * ((float) Math.PI / 180F))) * Math.abs((double) f2 / d2); - double d5 = (double) (speed * Mth.sin(f7 * ((float) Math.PI / 180F))) * Math.abs((double) f1 / d2); - Vec3 vec3 = getDeltaMovement(); - setDeltaMovement(vec3.add((new Vec3(d3, d5, d4)).subtract(vec3).scale(0.2D))); + 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); + Vec3 deltaMovement = getDeltaMovement(); + setDeltaMovement(deltaMovement.add((new Vec3(x, z, y)).subtract(deltaMovement).scale(0.2D))); } } @@ -579,12 +587,12 @@ public boolean canUse() { */ @Override public boolean canContinueToUse() { - LivingEntity livingentity = getTarget(); - if (livingentity == null) { + LivingEntity target = getTarget(); + if (target == null) { return false; - } else if (!livingentity.isAlive()) { + } else if (!target.isAlive()) { return false; - } else if (!(livingentity instanceof Player) || !livingentity.isSpectator() && !((Player) livingentity).isCreative()) { + } else if (!(target instanceof Player) || !target.isSpectator() && !((Player) target).isCreative()) { return canUse(); } else { return false; @@ -612,14 +620,15 @@ public void stop() { */ @Override public void tick() { - LivingEntity livingentity = getTarget(); - if (livingentity != null) { - moveTargetPoint = new Vec3(livingentity.getX(), livingentity.getY(0.5D), livingentity.getZ()); - if (getBoundingBox().inflate(0.2F).intersects(livingentity.getBoundingBox())) { - doHurtTarget(livingentity); + LivingEntity target = getTarget(); + if (target != null) { + moveTargetPoint = new Vec3(target.getX(), target.getY(0.5D), target.getZ()); + if (getBoundingBox().inflate(0.2F).intersects(target.getBoundingBox())) { + doHurtTarget(target); attackPhase = LavaRevenantEntity.AttackPhase.CIRCLE; if (!isSilent()) { - PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(blockPosition())), new LavaRevenantEntityPacketHandler(blockPosition())); + PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> + level.getChunkAt(blockPosition())), new LavaRevenantEntityPacketHandler(blockPosition())); } } else if (horizontalCollision || hurtTime > 0) { attackPhase = LavaRevenantEntity.AttackPhase.CIRCLE; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/RockSpiderEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/RockSpiderEntity.java index 23cc3a6ca..570baf760 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/RockSpiderEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/monster/RockSpiderEntity.java @@ -2,17 +2,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.EntityDataSerializers; -import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.network.syncher.*; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.Difficulty; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -39,7 +35,8 @@ public class RockSpiderEntity extends Monster { - private static final EntityDataAccessor DATA_FLAGS_ID = SynchedEntityData.defineId(RockSpiderEntity.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor DATA_FLAGS_ID = SynchedEntityData.defineId(RockSpiderEntity.class, + EntityDataSerializers.BYTE); public RockSpiderEntity(EntityType entityType, Level level) { super(entityType, level); @@ -173,11 +170,16 @@ public void setClimbing(boolean pClimbing) { @Override @Nullable - public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNull DifficultyInstance pDifficulty, @NotNull MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNull DifficultyInstance pDifficulty, + @NotNull MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, + @Nullable CompoundTag pDataTag) { + pSpawnData = super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); if (pSpawnData == null) { pSpawnData = new RockSpiderEffectsGroupData(); - if (pLevel.getDifficulty() == Difficulty.HARD && pLevel.getRandom().nextFloat() < 0.1F * pDifficulty.getSpecialMultiplier()) { + if (pLevel.getDifficulty() == Difficulty.HARD + && pLevel.getRandom().nextFloat() < 0.1F * pDifficulty.getSpecialMultiplier()) { + ((RockSpiderEffectsGroupData) pSpawnData).setRandomEffect(pLevel.getRandom()); } } @@ -190,7 +192,9 @@ public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor pLevel, @NotNul } // To keep the entity from dying of falls upon spawn in Tiltros - if (pReason == MobSpawnType.NATURAL && pLevel.getBlockState(blockPosition().below()) == Blocks.AIR.defaultBlockState()) { + if (pReason == MobSpawnType.NATURAL + && pLevel.getBlockState(blockPosition().below()) == Blocks.AIR.defaultBlockState()) { + addEffect(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, 50, 255, true, true)); } @@ -240,12 +244,12 @@ public static class RockSpiderEffectsGroupData implements SpawnGroupData { public MobEffect effect; public void setRandomEffect(Random pRand) { - int i = pRand.nextInt(5); - if (i <= 1) { + int random = pRand.nextInt(5); + if (random <= 1) { effect = MobEffects.MOVEMENT_SPEED; - } else if (i <= 2) { + } else if (random <= 2) { effect = MobEffects.DAMAGE_BOOST; - } else if (i <= 3) { + } else if (random <= 3) { effect = MobEffects.REGENERATION; } else { effect = MobEffects.INVISIBILITY; @@ -265,8 +269,8 @@ public RockSpiderTargetGoal(RockSpiderEntity entity, Class tClass) { */ @Override public boolean canUse() { - float f = mob.getBrightness(); - return !(f >= 0.5F) && super.canUse(); + float brightness = mob.getBrightness(); + return !(brightness >= 0.5F) && super.canUse(); } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/AbstractFieldMedicEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractFieldMedicEntity.java similarity index 73% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/AbstractFieldMedicEntity.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractFieldMedicEntity.java index e9e8ac53d..5da8af7ab 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/AbstractFieldMedicEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractFieldMedicEntity.java @@ -1,10 +1,13 @@ -package com.anonymoushacker1279.immersiveweapons.entity.passive; +package com.anonymoushacker1279.immersiveweapons.entity.neutral; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import com.anonymoushacker1279.immersiveweapons.item.misc.UsedSyringeItem; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.world.DifficultyInstance; @@ -27,6 +30,11 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.NetworkEvent.Context; +import net.minecraftforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -34,10 +42,12 @@ import java.time.temporal.ChronoField; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; public abstract class AbstractFieldMedicEntity extends PathfinderMob { - private final MeleeAttackGoal aiAttackOnCollide = new MeleeAttackGoal(this, 1.2D, false) { + private final MeleeAttackGoal aiAttackOnCollide = new MeleeAttackGoal(this, 1.2D, + false) { @Override public void stop() { super.stop(); @@ -50,6 +60,7 @@ public void start() { setAggressive(true); } }; + private final List> checkedEntities = new ArrayList<>(4); private int checkForHurtEntitiesCooldown; private LivingEntity currentlyTargetedEntity = null; @@ -171,17 +182,21 @@ protected void populateDefaultEquipmentSlots(@NotNull DifficultyInstance difficu * @return ILivingEntityData */ @Override - public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldIn, @NotNull DifficultyInstance difficultyIn, @NotNull MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + 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); setCombatTask(); setCanPickUpLoot(random.nextFloat() < 0.55F * difficultyIn.getSpecialMultiplier()); + if (getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { LocalDate localdate = LocalDate.now(); - int i = localdate.get(ChronoField.DAY_OF_MONTH); - int j = localdate.get(ChronoField.MONTH_OF_YEAR); - if (j == 10 && i == 31 && random.nextFloat() < 0.25F) { + int day = localdate.get(ChronoField.DAY_OF_MONTH); + int month = localdate.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)); armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } @@ -211,7 +226,10 @@ private void setCombatTask() { @Override public boolean hurt(@NotNull DamageSource source, float amount) { super.hurt(source, amount); - if (amount > 0 && !(source.getEntity() instanceof AbstractMinutemanEntity) && !(source.getEntity() instanceof IronGolem) && source.getEntity() instanceof Player || source.getEntity() instanceof Mob) { + if (amount > 0 && !(source.getEntity() instanceof AbstractMinutemanEntity) + && !(source.getEntity() instanceof IronGolem) + && source.getEntity() instanceof Player || source.getEntity() instanceof Mob) { + if (source.getEntity() instanceof Player) { if (((Player) source.getEntity()).isCreative()) { return true; @@ -224,8 +242,10 @@ public boolean hurt(@NotNull DamageSource source, float amount) { setTarget((LivingEntity) source.getEntity()); setCombatTask(); // Aggro all other minutemen in the area - List list = level.getEntitiesOfClass(MinutemanEntity.class, (new AABB(blockPosition())).inflate(48.0D, 8.0D, 48.0D)); - for (MinutemanEntity minutemanEntity : list) { + List nearbyMinutemen = level.getEntitiesOfClass(MinutemanEntity.class, + (new AABB(blockPosition())).inflate(48.0D, 8.0D, 48.0D)); + + for (MinutemanEntity minutemanEntity : nearbyMinutemen) { minutemanEntity.setTarget((LivingEntity) source.getEntity()); minutemanEntity.setPersistentAngerTarget(source.getEntity().getUUID()); } @@ -257,22 +277,29 @@ private void heal() { */ @Override public boolean doHurtTarget(@NotNull Entity entityIn) { - boolean flag = super.doHurtTarget(entityIn); - if (flag) { + boolean canHurtTarget = super.doHurtTarget(entityIn); + if (canHurtTarget) { if (getMainHandItem().getItem() == DeferredRegistryHandler.USED_SYRINGE.get()) { - int randomNumber = GeneralUtilities.getRandomNumber(0, 100); - if (randomNumber <= 80) { - ((LivingEntity) entityIn).addEffect(new MobEffectInstance(MobEffects.POISON, 500, 0, false, true)); - if (randomNumber <= 30) { + float randomNumber = GeneralUtilities.getRandomNumber(0f, 1f); + // Poison chance + if (randomNumber <= 0.8f) { + ((LivingEntity) entityIn).addEffect(new MobEffectInstance(MobEffects.POISON, 500, + 0, false, true)); + + // Hepatitis chance + if (randomNumber <= 0.3f) { entityIn.hurt(UsedSyringeItem.damageSource, 8.0F); - if (randomNumber <= 5) { - entityIn.level.playLocalSound(entityIn.getX(), entityIn.getY(), entityIn.getZ(), DeferredRegistryHandler.FIELD_MEDIC_ATTACK.get(), SoundSource.HOSTILE, 1.0f, 1.0f, false); + // :) + if (randomNumber <= 0.05f) { + PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> + level.getChunkAt(blockPosition())), + new AbstractFieldMedicEntityPacketHandler(blockPosition())); } } } } } - return flag; + return canHurtTarget; } /** @@ -336,4 +363,62 @@ private void checkForHurtEntities(List> checkedEn public void readAdditionalSaveData(@NotNull CompoundTag compound) { super.readAdditionalSaveData(compound); } + + + public record AbstractFieldMedicEntityPacketHandler(BlockPos blockPos) { + + /** + * Constructor for AbstractFieldMedicEntityPacketHandler. + * + * @param blockPos the BlockPos the packet came from + */ + public AbstractFieldMedicEntityPacketHandler { + } + + /** + * Encodes a packet + * + * @param msg the AbstractFieldMedicEntityPacketHandler message being sent + * @param packetBuffer the PacketBuffer containing packet data + */ + public static void encode(AbstractFieldMedicEntityPacketHandler msg, FriendlyByteBuf packetBuffer) { + packetBuffer.writeBlockPos(msg.blockPos); + } + + /** + * Decodes a packet + * + * @param packetBuffer the PacketBuffer containing packet data + * @return AbstractFieldMedicEntityPacketHandler + */ + public static AbstractFieldMedicEntityPacketHandler decode(FriendlyByteBuf packetBuffer) { + return new AbstractFieldMedicEntityPacketHandler(packetBuffer.readBlockPos()); + } + + /** + * Handles an incoming packet, by sending it to the client/server + * + * @param msg the AbstractFieldMedicEntityPacketHandler message being sent + * @param contextSupplier the Supplier providing context + */ + public static void handle(AbstractFieldMedicEntityPacketHandler msg, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> handleOnClient(msg))); + context.setPacketHandled(true); + } + + /** + * Runs specifically on the client, when a packet is received + * + * @param msg the AbstractFieldMedicEntityPacketHandler message being sent + */ + private static void handleOnClient(AbstractFieldMedicEntityPacketHandler msg) { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.level != null) { + minecraft.level.playLocalSound(msg.blockPos.getX(), msg.blockPos.getY(), msg.blockPos.getZ(), + DeferredRegistryHandler.FIELD_MEDIC_ATTACK.get(), SoundSource.HOSTILE, + 1.0f, 1.0f, false); + } + } + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/AbstractMinutemanEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractMinutemanEntity.java similarity index 75% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/AbstractMinutemanEntity.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractMinutemanEntity.java index b165ce764..3e3edf4bc 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/AbstractMinutemanEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/AbstractMinutemanEntity.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.entity.passive; +package com.anonymoushacker1279.immersiveweapons.entity.neutral; import com.anonymoushacker1279.immersiveweapons.entity.ai.goal.DefendVillageTargetGoal; import com.anonymoushacker1279.immersiveweapons.entity.ai.goal.RangedShotgunAttackGoal; @@ -20,20 +20,13 @@ import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.*; -import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; -import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; -import net.minecraft.world.entity.ai.goal.target.ResetUniversalAngerTargetGoal; +import net.minecraft.world.entity.ai.goal.target.*; import net.minecraft.world.entity.animal.IronGolem; -import net.minecraft.world.entity.monster.Creeper; -import net.minecraft.world.entity.monster.Enemy; -import net.minecraft.world.entity.monster.Monster; -import net.minecraft.world.entity.monster.RangedAttackMob; +import net.minecraft.world.entity.monster.*; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.item.BowItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.item.ProjectileWeaponItem; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; @@ -52,7 +45,9 @@ public abstract class AbstractMinutemanEntity extends PathfinderMob implements RangedAttackMob, NeutralMob { private static final UniformInt tickRange = TimeUtil.rangeOfSeconds(20, 39); - private final RangedShotgunAttackGoal aiShotgunAttack = new RangedShotgunAttackGoal<>(this, 1.0D, 25, 14.0F); + private final RangedShotgunAttackGoal aiShotgunAttack = + new RangedShotgunAttackGoal<>(this, 1.0D, 25, 14.0F); + private final MeleeAttackGoal aiAttackOnCollide = new MeleeAttackGoal(this, 1.2D, false) { /** * Reset the task's internal state. Called when this task is interrupted by another one @@ -72,6 +67,7 @@ public void start() { setAggressive(true); } }; + private int angerTime; private UUID targetUUID; @@ -105,15 +101,19 @@ protected void registerGoals() { goalSelector.addGoal(1, new FloatGoal(this)); goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 1.0D)); goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6D, false)); - goalSelector.addGoal(4, new MoveThroughVillageGoal(this, 1.0D, false, 6, () -> true)); + goalSelector.addGoal(4, new MoveThroughVillageGoal(this, 1.0D, false, + 6, () -> true)); goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); goalSelector.addGoal(100, new RandomLookAroundGoal(this)); goalSelector.addGoal(4, new OpenDoorGoal(this, true)); 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)); - 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))); + targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AbstractDyingSoldierEntity.class, + false)); + 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))); targetSelector.addGoal(5, new ResetUniversalAngerTargetGoal<>(this, false)); } @@ -174,18 +174,25 @@ protected void populateDefaultEquipmentSlots(@NotNull DifficultyInstance difficu * @return ILivingEntityData */ @Override - public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldIn, @NotNull DifficultyInstance difficultyIn, @NotNull MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + 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); setCombatTask(); setCanPickUpLoot(random.nextFloat() < 0.55F * difficultyIn.getSpecialMultiplier()); + + // Put pumpkins in the head slot on Halloween if (getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { LocalDate localdate = LocalDate.now(); - int i = localdate.get(ChronoField.DAY_OF_MONTH); - int j = localdate.get(ChronoField.MONTH_OF_YEAR); - if (j == 10 && i == 31 && random.nextFloat() < 0.25F) { - setItemSlot(EquipmentSlot.HEAD, new ItemStack(random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); + int day = localdate.get(ChronoField.DAY_OF_MONTH); + int month = localdate.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)); armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } } @@ -200,14 +207,16 @@ private void setCombatTask() { if (!level.isClientSide) { goalSelector.removeGoal(aiAttackOnCollide); goalSelector.removeGoal(aiShotgunAttack); - ItemStack itemstack = getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, Predicate.isEqual(DeferredRegistryHandler.BLUNDERBUSS.get()))); - if (itemstack.getItem() == DeferredRegistryHandler.BLUNDERBUSS.get()) { - int i = 25; + ItemStack itemInHand = getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, + Predicate.isEqual(DeferredRegistryHandler.BLUNDERBUSS.get()))); + + if (itemInHand.getItem() == DeferredRegistryHandler.BLUNDERBUSS.get()) { + int cooldown = 25; if (level.getDifficulty() != Difficulty.HARD) { - i = 45; + cooldown = 45; } - aiShotgunAttack.setAttackCooldown(i); + aiShotgunAttack.setAttackCooldown(cooldown); goalSelector.addGoal(16, aiShotgunAttack); } else { populateDefaultEquipmentSlots(level.getCurrentDifficultyAt(blockPosition())); @@ -223,7 +232,9 @@ private void setCombatTask() { */ @Override protected void doPush(@NotNull Entity entityIn) { - if (entityIn instanceof Enemy && !(entityIn instanceof MinutemanEntity) && !(entityIn instanceof IronGolem) && getRandom().nextInt(20) == 0) { + if (entityIn instanceof Enemy && !(entityIn instanceof MinutemanEntity) && !(entityIn instanceof IronGolem) + && getRandom().nextInt(20) == 0) { + setTarget((LivingEntity) entityIn); } super.doPush(entityIn); @@ -248,20 +259,26 @@ public boolean canAttackType(@NotNull EntityType typeIn) { */ @Override public void performRangedAttack(@NotNull LivingEntity target, float distanceFactor) { - ItemStack itemstack = getProjectile(getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, Predicate.isEqual(DeferredRegistryHandler.BLUNDERBUSS.get())))); - AbstractArrow abstractBulletEntity = fireArrow(itemstack, distanceFactor); - if (getMainHandItem().getItem() instanceof BowItem) - abstractBulletEntity = ((BowItem) getMainHandItem().getItem()).customArrow(abstractBulletEntity); - double d0 = target.getX() - getX(); - double d1 = target.getY(0.12D) - abstractBulletEntity.getY(); - double d2 = target.getZ() - getZ(); - double d3 = Mth.sqrt((float) (d0 * d0 + d2 * d2)); + // Fire four bullets for the blunderbuss for (int i = 0; i <= 4; i++) { + AbstractArrow abstractBulletEntity = fireArrow(new ItemStack(DeferredRegistryHandler.COPPER_MUSKET_BALL.get()), + distanceFactor); + + double deltaX = target.getX() - getX(); + double deltaY = target.getY(0.1D) - abstractBulletEntity.getY(); + double deltaZ = target.getZ() - getZ(); + double sqrtXZ = Mth.sqrt((float) (deltaX * deltaX + deltaZ * deltaZ)); + abstractBulletEntity.setKnockback(3); - abstractBulletEntity.shoot(d0, d1 + d3 * (double) 0.2F, d2, 1.6F, 18 - level.getDifficulty().getId() * 4 + GeneralUtilities.getRandomNumber(0.2f, 0.8f)); + abstractBulletEntity.setOwner(this); + + abstractBulletEntity.shoot(deltaX + GeneralUtilities.getRandomNumber(-1.0f, 1.0f), + deltaY + sqrtXZ * 0.2D + GeneralUtilities.getRandomNumber(-0.375f, 0.375f), deltaZ, 1.6F, + 18 - level.getDifficulty().getId() * 4 + GeneralUtilities.getRandomNumber(0.2f, 0.8f)); + level.addFreshEntity(abstractBulletEntity); } - playSound(DeferredRegistryHandler.BLUNDERBUSS_FIRE.get(), 1.0F, 1.0F / (getRandom().nextFloat() * 0.4F + 0.8F)); - level.addFreshEntity(abstractBulletEntity); + playSound(DeferredRegistryHandler.BLUNDERBUSS_FIRE.get(), 1.0F, + 1.0F / (getRandom().nextFloat() * 0.4F + 0.8F)); } /** @@ -274,22 +291,25 @@ public void performRangedAttack(@NotNull LivingEntity target, float distanceFact public @NotNull ItemStack getProjectile(ItemStack weapon) { if (weapon.getItem() instanceof ProjectileWeaponItem) { Predicate predicate = ((ProjectileWeaponItem) weapon.getItem()).getSupportedHeldProjectiles(); - ItemStack itemstack = ProjectileWeaponItem.getHeldProjectile(this, predicate); - return itemstack.isEmpty() ? new ItemStack(Items.ARROW) : itemstack; + ItemStack heldProjectile = ProjectileWeaponItem.getHeldProjectile(this, predicate); + return heldProjectile.isEmpty() ? new ItemStack(DeferredRegistryHandler.COPPER_MUSKET_BALL.get()) : heldProjectile; } else { return ItemStack.EMPTY; } } /** - * Fires an arrow. + * Fires an arrow. Technically, all projectiles coming from this entity will be bullets, + * though they use a modified arrow entity for this. * * @param arrowStack the ItemStack of the arrow * @param distanceFactor the distance factor for firing * @return AbstractArrowEntity */ private AbstractArrow fireArrow(ItemStack arrowStack, float distanceFactor) { - AbstractArrowItem arrowItem = (AbstractArrowItem) (arrowStack.getItem() instanceof AbstractArrowItem ? arrowStack.getItem() : DeferredRegistryHandler.COPPER_MUSKET_BALL.get()); + AbstractArrowItem arrowItem = (AbstractArrowItem) (arrowStack.getItem() instanceof AbstractArrowItem + ? arrowStack.getItem() : DeferredRegistryHandler.COPPER_MUSKET_BALL.get()); + AbstractArrow abstractArrowEntity = arrowItem.createArrow(level, arrowStack, this); abstractArrowEntity.setEnchantmentEffectsFromEntity(this, distanceFactor); @@ -305,28 +325,37 @@ private AbstractArrow fireArrow(ItemStack arrowStack, float distanceFactor) { */ @Override public boolean hurt(@NotNull DamageSource source, float amount) { - super.hurt(source, amount); - if (amount > 0 && source.getEntity() != null && !(source.getEntity() instanceof MinutemanEntity) && !(source.getEntity() instanceof IronGolem) && source.getEntity() instanceof Player || source.getEntity() instanceof Mob) { - if (source.getEntity() instanceof Player) { - if (((Player) source.getEntity()).isCreative()) { + if (amount > 0 && !(source.getEntity() instanceof MinutemanEntity) && !(source.getEntity() instanceof IronGolem)) { + + super.hurt(source, amount); + + if (source.getEntity() instanceof Player || source.getEntity() instanceof Mob) { + if (source.getEntity() instanceof Player) { + if (((Player) source.getEntity()).isCreative()) { + return false; + } + } + + setCombatTask(); + setTarget((LivingEntity) source.getEntity()); + setPersistentAngerTarget(source.getEntity().getUUID()); + + if (getTarget() != null && getTarget().getType() == DeferredRegistryHandler.MINUTEMAN_ENTITY.get()) { + setTarget(null); return false; } - } - setCombatTask(); - setTarget((LivingEntity) source.getEntity()); - setPersistentAngerTarget(source.getEntity().getUUID()); - if (getTarget() != null && getTarget().getType() == DeferredRegistryHandler.MINUTEMAN_ENTITY.get()) { - setTarget(null); - return true; - } + // Aggro all other minutemen in the area + List list = level.getEntitiesOfClass(MinutemanEntity.class, + (new AABB(blockPosition())).inflate(24.0D, 8.0D, 24.0D)); - // Aggro all other minutemen in the area - List list = level.getEntitiesOfClass(MinutemanEntity.class, (new AABB(blockPosition())).inflate(24.0D, 8.0D, 24.0D)); - for (MinutemanEntity minutemanEntity : list) { - minutemanEntity.setTarget((LivingEntity) source.getEntity()); - minutemanEntity.setPersistentAngerTarget(source.getEntity().getUUID()); + for (MinutemanEntity minutemanEntity : list) { + minutemanEntity.setTarget((LivingEntity) source.getEntity()); + minutemanEntity.setPersistentAngerTarget(source.getEntity().getUUID()); + } + return true; } + return false; } return false; } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/FieldMedicEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/FieldMedicEntity.java similarity index 96% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/FieldMedicEntity.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/FieldMedicEntity.java index 077c94ef3..f759094fc 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/FieldMedicEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/FieldMedicEntity.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.entity.passive; +package com.anonymoushacker1279.immersiveweapons.entity.neutral; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/MinutemanEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/MinutemanEntity.java similarity index 68% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/MinutemanEntity.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/MinutemanEntity.java index 637437d16..01253aab5 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/passive/MinutemanEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/neutral/MinutemanEntity.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.entity.passive; +package com.anonymoushacker1279.immersiveweapons.entity.neutral; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; @@ -70,25 +70,4 @@ protected SoundEvent getDeathSound() { protected SoundEvent getStepSound() { return DeferredRegistryHandler.DYING_SOLDIER_STEP.get(); } - - /** - * Set custom loot parameters. - * - * @param source the DamageSource instance - * @param looting the level of looting enchantment on an item - * @param recentlyHitIn if the entity was recently hit - */ - @Override - protected void dropCustomDeathLoot(@NotNull DamageSource source, int looting, boolean recentlyHitIn) { - super.dropCustomDeathLoot(source, looting, recentlyHitIn); - int lootingModifier = looting * 2; - if (lootingModifier >= 85) { - spawnAtLocation(DeferredRegistryHandler.BLUNDERBUSS.get()); - } else { - int i = GeneralUtilities.getRandomNumber(1, 85 - lootingModifier); - if (i == 1) { - spawnAtLocation(DeferredRegistryHandler.BLUNDERBUSS.get()); - } - } - } } \ No newline at end of file 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 ea8887f6f..46b2ac465 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/AbstractBulletEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/AbstractBulletEntity.java @@ -1,13 +1,11 @@ package com.anonymoushacker1279.immersiveweapons.entity.projectile; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundGameEventPacket; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; @@ -32,7 +30,7 @@ public abstract class AbstractBulletEntity extends AbstractArrow { - private static final boolean canBreakGlass = ServerConfig.BULLETS_BREAK_GLASS.get(); + private static final boolean canBreakGlass = CommonConfig.BULLETS_BREAK_GLASS.get(); private final SoundEvent hitSound = getDefaultHitGroundSoundEvent(); Item referenceItem; int knockbackStrength; @@ -88,28 +86,39 @@ public abstract class AbstractBulletEntity extends AbstractArrow { @Override public void tick() { super.tick(); + + // Run extra stuff while ticking, useful for classes extending this class + // but not needing to overwrite the entire tick function. doWhileTicking(); - boolean flag = isNoPhysics(); - Vec3 vector3d = getDeltaMovement(); - double yRot; - double xRot; + + boolean isNoPhysics = isNoPhysics(); + Vec3 deltaMovement = getDeltaMovement(); + + double yRotation; + double xRotation; + // Make the bullet rotate if (xRotO == 0.0F && yRotO == 0.0F) { - double d = vector3d.horizontalDistanceSqr(); - yRot = (Mth.atan2(vector3d.x, vector3d.z) * (180F / (float) Math.PI)); - xRot = (Mth.atan2(vector3d.y, d) * (180F / (float) Math.PI)); - yRotO = (float) yRot; - xRotO = (float) xRot; + double horizontalDistanceSquareRoot = deltaMovement.horizontalDistanceSqr(); + yRotation = (Mth.atan2(deltaMovement.x, deltaMovement.z) * (180F / (float) Math.PI)); + xRotation = (Mth.atan2(deltaMovement.y, horizontalDistanceSquareRoot) * (180F / (float) Math.PI)); + yRotO = (float) yRotation; + xRotO = (float) xRotation; } - BlockPos blockpos = blockPosition(); - BlockState blockstate = level.getBlockState(blockpos); - if (!blockstate.isAir() && !flag) { - VoxelShape voxelshape = blockstate.getBlockSupportShape(level, blockpos); - if (!voxelshape.isEmpty()) { - Vec3 vector3d1 = position(); + BlockPos currentBlockPosition = blockPosition(); + BlockState blockStateAtCurrentPosition = level.getBlockState(currentBlockPosition); + // Check if the block at the current position is air, and that it has physics enabled + if (!blockStateAtCurrentPosition.isAir() && !isNoPhysics) { + VoxelShape currentPositionBlockSupportShape = blockStateAtCurrentPosition.getBlockSupportShape(level, + currentBlockPosition); - for (AABB aabb : voxelshape.toAabbs()) { - if (aabb.move(blockpos).contains(vector3d1)) { + // Check the hitboxes first, if this isn't an air block + if (!currentPositionBlockSupportShape.isEmpty()) { + Vec3 position = position(); + + for (AABB aabb : currentPositionBlockSupportShape.toAabbs()) { + // Check if the bullet reached the hitbox of the non-air block + if (aabb.move(currentBlockPosition).contains(position)) { inGround = true; break; } @@ -117,54 +126,78 @@ public void tick() { } } + // If the shake time is above zero, tick it down if (shakeTime > 0) { - --shakeTime; + shakeTime--; } + // If the bullet is in water or rain, clear any fire if (isInWaterOrRain()) { clearFire(); } - if (inGround && !flag) { - if (inBlockState != blockstate && shouldFall()) { + // Check if the bullet is in the ground, and if it has physics enabled + if (inGround && !isNoPhysics) { + /* If the current blockstate is not the same as the previous one, and it should start falling, + begin the fall process. This runs when the block the bullet is under is broken. Otherwise, + tick for despawn. */ + if (inBlockState != blockStateAtCurrentPosition && shouldFall()) { startFalling(); } else if (!level.isClientSide) { tickDespawn(); } - ++inGroundTime; + inGroundTime++; } else { + // At this point, the bullet is still in the air + inGroundTime = 0; - Vec3 vector3d2 = position(); - Vec3 vector3d3 = vector3d2.add(vector3d); - HitResult hitResult = level.clip(new ClipContext(vector3d2, vector3d3, Block.COLLIDER, Fluid.NONE, this)); + Vec3 currentPosition = position(); + Vec3 newPosition = currentPosition.add(deltaMovement); + HitResult hitResult = level.clip(new ClipContext(currentPosition, newPosition, Block.COLLIDER, Fluid.NONE, + this)); + + // If there's a block between the current position and the new one, set the + // location to the hit location of the clip (includes hitboxes). if (hitResult.getType() != Type.MISS) { - vector3d3 = hitResult.getLocation(); + newPosition = hitResult.getLocation(); } + // Loop while the entity is alive while (isAlive()) { - EntityHitResult entityHitResult = findHitEntity(vector3d2, vector3d3); + // Check for hit entities + EntityHitResult entityHitResult = findHitEntity(currentPosition, newPosition); if (entityHitResult != null) { hitResult = entityHitResult; } if (hitResult != null && hitResult.getType() == Type.ENTITY) { Entity entity = null; + // Get the entity being hit if (hitResult instanceof EntityHitResult) { entity = ((EntityHitResult) hitResult).getEntity(); } - Entity entity1 = getOwner(); - if (entity instanceof Player && entity1 instanceof Player && !((Player) entity1).canHarmPlayer((Player) entity)) { + // Get the owner of the bullet + Entity owner = getOwner(); + // Check if the entity is a player, and if so, if they are allowed + // to be harmed by the owner + if (entity instanceof Player && owner instanceof Player + && !((Player) owner).canHarmPlayer((Player) entity)) { + hitResult = null; entityHitResult = null; } } - if (hitResult != null && hitResult.getType() != Type.MISS && !flag && !ForgeEventFactory.onProjectileImpact(this, hitResult)) { + // If something was hit, and physics are enabled, execute necessary code + if (hitResult != null && hitResult.getType() != Type.MISS && !isNoPhysics + && !ForgeEventFactory.onProjectileImpact(this, hitResult)) { + onHit(hitResult); hasImpulse = true; } + // If an entity wasn't hit, and the piercing level is below or equal to zero, break if (entityHitResult == null || getPierceLevel() <= 0) { break; } @@ -172,40 +205,55 @@ public void tick() { hitResult = null; } - vector3d = getDeltaMovement(); - double d3 = vector3d.x; - double d4 = vector3d.y; - double d0 = vector3d.z; + // Get the current delta movement values + deltaMovement = getDeltaMovement(); + double deltaMovementX = deltaMovement.x; + double deltaMovementY = deltaMovement.y; + double deltaMovementZ = deltaMovement.z; + // Add particles behind the bullet if it is a "critical" one if (isCritArrow()) { for (int i = 0; i < 4; ++i) { - level.addParticle(ParticleTypes.CRIT, getX() + d3 * i / 4.0D, getY() + d4 * i / 4.0D, getZ() + d0 * i / 4.0D, -d3, -d4 + 0.2D, -d0); + level.addParticle(ParticleTypes.CRIT, + getX() + deltaMovementX * i / 4.0D, + getY() + deltaMovementY * i / 4.0D, + getZ() + deltaMovementZ * i / 4.0D, + -deltaMovementX, + -deltaMovementY + 0.2D, + -deltaMovementZ); } } - double d5 = getX() + d3; - double d1 = getY() + d4; - double d2 = getZ() + d0; + double newPositionX = getX() + deltaMovementX; + double newPositionY = getY() + deltaMovementY; + double newPositionZ = getZ() + deltaMovementZ; - float f2 = 0.99F; + float inertia = 0.99F; + // Check if the bullet is in water if (isInWater()) { for (int j = 0; j < 4; ++j) { - level.addParticle(ParticleTypes.BUBBLE, d5 - d3 * 0.25D, d1 - d4 * 0.25D, d2 - d0 * 0.25D, d3, d4, d0); + level.addParticle(ParticleTypes.BUBBLE, + newPositionX - deltaMovementX * 0.25D, + newPositionY - deltaMovementY * 0.25D, + newPositionZ - deltaMovementZ * 0.25D, + deltaMovementX, deltaMovementY, deltaMovementZ); } - f2 = getWaterInertia(); + inertia = getWaterInertia(); } - setDeltaMovement(vector3d.scale(f2)); - if (!isNoGravity() && !flag) { - Vec3 vector3d4 = getDeltaMovement(); + setDeltaMovement(deltaMovement.scale(inertia)); + + // Set movement and position + if (!isNoGravity() && !isNoPhysics) { + Vec3 deltaMovement1 = getDeltaMovement(); if (shouldStopMoving) { setDeltaMovement(0, 0, 0); } else { - setDeltaMovement(vector3d4.x, vector3d4.y + getMovementModifier(), vector3d4.z); + setDeltaMovement(deltaMovement1.x, deltaMovement1.y + getGravityModifier(), deltaMovement1.z); } } - setPos(d5, d1, d2); + setPos(newPositionX, newPositionY, newPositionZ); checkInsideBlocks(); } } @@ -215,7 +263,7 @@ public void tick() { * * @return double */ - public double getMovementModifier() { + public double getGravityModifier() { return 0.0d; } @@ -227,14 +275,21 @@ public double getMovementModifier() { @Override protected void onHitEntity(@NotNull EntityHitResult entityRayTraceResult) { super.onHitEntity(entityRayTraceResult); + Entity entity = entityRayTraceResult.getEntity(); - float f = (float) getDeltaMovement().length(); - int i = Mth.ceil(Mth.clamp(f * baseDamage, 0.0D, 2.147483647E9D)); + float velocityModifier = (float) getDeltaMovement().length(); + // Determine the damage to be dealt, which is calculated by multiplying the velocity modifier + // and the base damage. It's clamped if the velocity is extremely high. + int damage = Mth.ceil(Mth.clamp(velocityModifier * baseDamage, 0.0D, 2.147483647E9D)); + + // Check the piercing level, if its above zero then start piercing entities if (getPierceLevel() > 0) { if (piercedEntities == null) { piercedEntities = new IntOpenHashSet(5); } + // If we've pierced the maximum number of entities, + // destroy the bullet if (piercedEntities.size() >= getPierceLevel() + 1) { kill(); return; @@ -243,42 +298,59 @@ protected void onHitEntity(@NotNull EntityHitResult entityRayTraceResult) { piercedEntities.add(entity.getId()); } + // Add crit modifier if the bullet is critical if (isCritArrow()) { - long j = random.nextInt(i / 2 + 2); - i = (int) Math.min(j + i, 2147483647L); + long randomCritModifier = random.nextInt(damage / 2 + 2); + damage = (int) Math.min(randomCritModifier + damage, 2147483647L); } Entity owner = getOwner(); - DamageSource damagesource; + DamageSource damageSource; + + // If the arrow owner doesn't exist (null), set the indirect entity to itself if (owner == null) { - damagesource = DamageSource.arrow(this, this); + damageSource = DamageSource.arrow(this, this); } else { - damagesource = DamageSource.arrow(this, owner); + damageSource = DamageSource.arrow(this, owner); + + // Disable invulnerability for bullets; specifically with the blunderbuss, otherwise + // multiple shots on the same target will simply bounce back + entity.invulnerableTime = 0; + entity.setInvulnerable(false); + + // Extra code to run when an entity is hit + doWhenHitEntity(entity); + if (owner instanceof LivingEntity) { - entity.invulnerableTime = 0; - entity.setInvulnerable(false); - doWhenHitEntity(entity); ((LivingEntity) owner).setLastHurtMob(entity); } } - boolean flag = entity.getType() == EntityType.ENDERMAN; - int k = entity.getRemainingFireTicks(); - if (isOnFire() && !flag) { + boolean isEnderman = entity.getType() == EntityType.ENDERMAN; + int remainingFireTicks = entity.getRemainingFireTicks(); + + // Set the entity on fire if the bullet is on fire, except + // for when the entity is an enderman + if (isOnFire() && !isEnderman) { entity.setSecondsOnFire(5); } - if (entity.hurt(damagesource, i)) { - if (flag) { + if (entity.hurt(damageSource, damage)) { + if (isEnderman) { return; } if (entity instanceof LivingEntity livingEntity) { + // Apply knockback if the strength is above zero if (knockbackStrength > 0) { - Vec3 vector3d = getDeltaMovement().multiply(1.0D, 0.0D, 1.0D).normalize().scale(knockbackStrength * 0.6D); - if (vector3d.lengthSqr() > 0.0D) { - livingEntity.push(vector3d.x, 0.1D, vector3d.z); + Vec3 scaledDeltaMovement = getDeltaMovement() + .multiply(1.0D, 0.0D, 1.0D) + .normalize() + .scale(knockbackStrength * 0.6D); + + if (scaledDeltaMovement.lengthSqr() > 0.0D) { + livingEntity.push(scaledDeltaMovement.x, 0.1D, scaledDeltaMovement.z); } } @@ -287,10 +359,8 @@ protected void onHitEntity(@NotNull EntityHitResult entityRayTraceResult) { EnchantmentHelper.doPostDamageEffects((LivingEntity) owner, livingEntity); } + // Code to run after the entity is hurt doPostHurtEffects(livingEntity); - if (livingEntity != owner && livingEntity instanceof Player && owner instanceof ServerPlayer && !isSilent()) { - ((ServerPlayer) owner).connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.ARROW_HIT_PLAYER, 0.0F)); - } } playSound(hitSound, 1.0F, 1.2F / (random.nextFloat() * 0.2F + 0.9F)); @@ -298,7 +368,8 @@ protected void onHitEntity(@NotNull EntityHitResult entityRayTraceResult) { kill(); } } else { - entity.setRemainingFireTicks(k); + entity.setRemainingFireTicks(remainingFireTicks); + if (!level.isClientSide && getDeltaMovement().lengthSqr() < 1.0E-7D) { kill(); } @@ -314,14 +385,16 @@ protected void onHitEntity(@NotNull EntityHitResult entityRayTraceResult) { protected void onHitBlock(BlockHitResult blockHitResult) { inBlockState = level.getBlockState(blockHitResult.getBlockPos()); + // Check if the bullet hit a permeable block like leaves, if so + // keep moving and decrease velocity if (inBlockState.is(BlockTags.bind("minecraft:leaves"))) { push(0, -0.1, 0); shakeTime = 4; } else { - Vec3 vector3d = blockHitResult.getLocation().subtract(getX(), getY(), getZ()); - setDeltaMovement(vector3d); - Vec3 vector3d1 = vector3d.normalize().scale(0.05F); - setPosRaw(getX() - vector3d1.x, getY() - vector3d1.y, getZ() - vector3d1.z); + Vec3 locationMinusCurrentPosition = blockHitResult.getLocation().subtract(getX(), getY(), getZ()); + setDeltaMovement(locationMinusCurrentPosition); + Vec3 scaledPosition = locationMinusCurrentPosition.normalize().scale(0.05F); + setPosRaw(getX() - scaledPosition.x, getY() - scaledPosition.y, getZ() - scaledPosition.z); inGround = true; shakeTime = 2; setCritArrow(false); @@ -330,10 +403,17 @@ protected void onHitBlock(BlockHitResult blockHitResult) { resetPiercedEntities(); } - if (canBreakGlass && !hasAlreadyBrokeGlass && !inBlockState.is(BlockTags.bind("forge:bulletproof_glass")) && inBlockState.is(BlockTags.bind("forge:glass")) || inBlockState.is(BlockTags.bind("forge:glass_panes"))) { + // 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"))) { + level.destroyBlock(blockHitResult.getBlockPos(), false); hasAlreadyBrokeGlass = true; } + + inBlockState.onProjectileHit(level, inBlockState, blockHitResult, this); } /** diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/BulletEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/BulletEntity.java index 8c3795788..871804c60 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/BulletEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/BulletEntity.java @@ -2,20 +2,23 @@ import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; +import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.projectile.ItemSupplier; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; + public class BulletEntity { public static class CopperBulletEntity extends AbstractBulletEntity { @@ -71,7 +74,7 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.0355d; } } @@ -128,7 +131,7 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.035d; } } @@ -185,7 +188,7 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.02d; } } @@ -242,7 +245,7 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.0355d; } } @@ -299,7 +302,7 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.0355d; } } @@ -356,7 +359,7 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.0355d; } } @@ -393,7 +396,7 @@ public DiamondBulletEntity(LivingEntity shooter, Level world, Item referenceItem * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.0385d; } @@ -470,16 +473,19 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.04d; } } - @OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) public static class FlareEntity extends AbstractBulletEntity implements ItemSupplier { private int explodeDelay = 10; private int deathDelay = 300; + private BlockPos previousLightPosition = BlockPos.ZERO; + private final List lightPositions = new ArrayList<>(3); + static final BlockState lightState = Blocks.LIGHT.defaultBlockState(); + static final BlockState airState = Blocks.AIR.defaultBlockState(); /** * Constructor for FlareEntity. @@ -528,8 +534,13 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy @Override protected void doWhileTicking() { - if (level.isClientSide && explodeDelay != 0) { - level.addParticle(ParticleTypes.FIREWORK, getX(), getY() - 0.3D, getZ(), random.nextGaussian() * 0.05D, -getDeltaMovement().y * 0.5D, random.nextGaussian() * 0.05D); + double x = getX(); + double y = getY(); + double z = getZ(); + Vec3 deltaMovement = getDeltaMovement(); + + if (level.isClientSide && explodeDelay != 0 && (tickCount % 4) >= 2) { + level.addParticle(ParticleTypes.FIREWORK, x, y - 0.3D, z, random.nextGaussian() * 0.05D, -deltaMovement.y * 0.5D, random.nextGaussian() * 0.05D); } shouldStopMoving = false; @@ -538,17 +549,44 @@ protected void doWhileTicking() { } else { if (deathDelay >= 0) { shouldStopMoving = true; - if (level.isClientSide) { - for (int i = 0; i <= 8; i++) { - level.addAlwaysVisibleParticle(ParticleTypes.FLAME, true, getX(), getY(), getZ(), random.nextGaussian() * 0.1D, -getDeltaMovement().y * 0.25D, random.nextGaussian() * 0.1D); - level.addAlwaysVisibleParticle(ParticleTypes.SMOKE, true, getX(), getY(), getZ(), random.nextGaussian() * 0.1D, -getDeltaMovement().y * 0.25D, random.nextGaussian() * 0.1D); + if (level.isClientSide && (tickCount % 4) == 0) { + for (int i = 8; --i >= 0; ) { + level.addAlwaysVisibleParticle(ParticleTypes.FLAME, true, x, y, z, random.nextGaussian() * 0.1D, -deltaMovement.y * 0.25D, random.nextGaussian() * 0.1D); } } deathDelay--; } else { + // Remove all lights before dying + if (!lightPositions.isEmpty()) { + for (BlockPos pos : lightPositions) { + if (level.getBlockState(pos) == lightState) { + level.removeBlock(pos, false); + } + } + lightPositions.clear(); + } kill(); } } + + if (tickCount % 4 >= 1) { + BlockPos currentPosition = blockPosition(); + if (!level.isClientSide && currentPosition != previousLightPosition) { + if (!lightPositions.isEmpty()) { + for (BlockPos pos : lightPositions) { + if (level.getBlockState(pos) == lightState) { + level.removeBlock(pos, false); + } + } + lightPositions.clear(); + } + if (level.getBlockState(currentPosition) == airState) { + level.setBlock(currentPosition, lightState, 3); + lightPositions.add(currentPosition); + } + previousLightPosition = currentPosition; + } + } } /** @@ -567,7 +605,7 @@ protected void doWhenHitEntity(Entity entity) { * @return double */ @Override - public double getMovementModifier() { + public double getGravityModifier() { return 0.0355d; } @@ -580,5 +618,69 @@ public double getMovementModifier() { public @NotNull ItemStack getItem() { return new ItemStack(DeferredRegistryHandler.FLARE.get()); } + + /** + * Add additional save data. + * + * @param pCompound the CompoundTag containing the save data + */ + @Override + public void addAdditionalSaveData(@NotNull CompoundTag pCompound) { + super.addAdditionalSaveData(pCompound); + + if (!lightPositions.isEmpty()) { + List xPositions = new ArrayList<>(3); + List yPositions = new ArrayList<>(3); + List zPositions = new ArrayList<>(3); + for (BlockPos pos : lightPositions) { + xPositions.add(pos.getX()); + yPositions.add(pos.getY()); + zPositions.add(pos.getZ()); + } + + pCompound.putIntArray("xPositions", xPositions); + pCompound.putIntArray("yPositions", yPositions); + pCompound.putIntArray("zPositions", zPositions); + } + } + + /** + * Read additional save data. + * + * @param pCompound the CompoundTag containing the save data + */ + @Override + public void readAdditionalSaveData(@NotNull CompoundTag pCompound) { + super.readAdditionalSaveData(pCompound); + + int[] xPositions = pCompound.getIntArray("xPositions"); + int[] yPositions = pCompound.getIntArray("yPositions"); + int[] zPositions = pCompound.getIntArray("zPositions"); + + // Each item in xPositions should match an entry in y/zPositions, so build a list of BlockPos + // with each individual position + int iteration = 0; + for (Integer integer : xPositions) { + lightPositions.add(new BlockPos(integer, yPositions[iteration], zPositions[iteration])); + iteration++; + } + } + + /** + * Remove all lights when the entity is killed via commands. + */ + @Override + public void kill() { + super.kill(); + + if (!lightPositions.isEmpty()) { + for (BlockPos pos : lightPositions) { + if (level.getBlockState(pos) == lightState) { + level.removeBlock(pos, false); + } + } + lightPositions.clear(); + } + } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/CustomArrowEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/CustomArrowEntity.java index b1206894e..9decc917d 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/CustomArrowEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/CustomArrowEntity.java @@ -1,13 +1,10 @@ package com.anonymoushacker1279.immersiveweapons.entity.projectile; -import com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb.SmokeBombParticleData; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +import com.anonymoushacker1279.immersiveweapons.client.particle.smoke_bomb.SmokeBombParticleOptions; +import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.core.BlockPos; -import net.minecraft.core.particles.ParticleOptions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; @@ -19,14 +16,12 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; -import java.awt.*; import java.util.function.Supplier; public class CustomArrowEntity { @@ -408,8 +403,10 @@ public double getMovementModifier() { } public static class SmokeBombArrowEntity extends AbstractCustomArrowEntity { + private static int color = 0; - private final int configMaxParticles = ServerConfig.MAX_SMOKE_BOMB_PARTICLES.get(); + private final int configMaxParticles = CommonConfig.MAX_SMOKE_BOMB_PARTICLES.get(); + private static final byte VANILLA_IMPACT_STATUS_ID = 3; /** * Constructor for SmokeBombArrowEntity. @@ -464,142 +461,91 @@ public static void setColor(int color) { @Override public void onHit(@NotNull HitResult rayTraceResult) { super.onHit(rayTraceResult); - if (level.isClientSide) { - ParticleOptions particleData = makeParticle(); - for (int i = 0; i < configMaxParticles; ++i) { - level.addParticle(particleData, true, position().x, position().y, position().z, GeneralUtilities.getRandomNumber(-0.03, 0.03d), GeneralUtilities.getRandomNumber(-0.02d, 0.02d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d)); - } - } else { - PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(blockPosition())), new SmokeBombArrowEntityPacketHandler(blockPosition())); + if (!level.isClientSide) { + PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(blockPosition())), + new SmokeBombArrowEntityPacketHandler(color)); + + level.broadcastEntityEvent(this, VANILLA_IMPACT_STATUS_ID); } } /** - * Create a new particle. + * Handle entity events. * - * @return IParticleData + * @param statusID the byte containing status ID */ - static ParticleOptions makeParticle() { - Color tint = getTint(GeneralUtilities.getRandomNumber(0, 2)); - double diameter = getDiameter(GeneralUtilities.getRandomNumber(1.0d, 5.5d)); + @Override + public void handleEntityEvent(byte statusID) { + if (statusID == VANILLA_IMPACT_STATUS_ID) { + double x = getX(); + double y = getY(); + double z = getZ(); - return new SmokeBombParticleData(tint, diameter); + // Spawn smoke particles + for (int i = 0; i < configMaxParticles; ++i) { + level.addParticle(SmokeBombParticleOptions.getParticleByColor(color), + true, x, y, z, + GeneralUtilities.getRandomNumber(-0.1d, 0.1d), + GeneralUtilities.getRandomNumber(-0.1d, 0.1d), + GeneralUtilities.getRandomNumber(-0.1d, 0.1d)); + } + + // Play a hissing sound + level.playLocalSound(x, y, z, DeferredRegistryHandler.SMOKE_BOMB_HISS.get(), + SoundSource.NEUTRAL, 0.2f, 0.6f, true); + } } + } + + public record SmokeBombArrowEntityPacketHandler(int color) { /** - * Get the particle diameter. + * Constructor for SmokeBombArrowEntityPacketHandler. * - * @param random a random number - * @return double + * @param color the color ID */ - private static double getDiameter(double random) { - final double MIN_DIAMETER = 0.5; - final double MAX_DIAMETER = 5.5; - return MIN_DIAMETER + (MAX_DIAMETER - MIN_DIAMETER) * random; - } - - /** - * Get the particle tint. - * - * @param random a random number - * @return Color - */ - private static Color getTint(int random) { - Color[] tints = { - new Color(1.00f, 1.00f, 1.00f), // no tint (white) - new Color(1.00f, 0.97f, 1.00f), // off-white - new Color(1.00f, 1.00f, 0.97f), // off-white 2 - }; - Color[] tintsRed = { - new Color(1.00f, 0.25f, 0.25f), // tint (red) - new Color(1.00f, 0.30f, 0.25f), // off-red - new Color(1.00f, 0.25f, 0.30f), // off-red 2 - }; - Color[] tintsGreen = { - new Color(0.25f, 1.00f, 0.25f), // tint (green) - new Color(0.30f, 1.00f, 0.25f), // off-green - new Color(0.25f, 1.00f, 0.30f), // off-green 2 - }; - Color[] tintsBlue = { - new Color(0.25f, 0.25f, 1.00f), // tint (blue) - new Color(0.30f, 0.25f, 1.00f), // off-blue - new Color(0.25f, 0.30f, 1.00f), // off-blue 2 - }; - Color[] tintsPurple = { - new Color(1.00f, 0.25f, 1.00f), // tint (purple) - new Color(1.00f, 0.30f, 1.00f), // off-purple - new Color(1.00f, 0.35f, 1.00f), // off-purple 2 - }; - Color[] tintsYellow = { - new Color(1.00f, 1.00f, 0.25f), // tint (yellow) - new Color(1.00f, 1.00f, 0.30f), // off-yellow - new Color(1.00f, 1.00f, 0.35f), // off-yellow 2 - }; - - return switch (color) { - case 1 -> tintsRed[random]; - case 2 -> tintsGreen[random]; - case 3 -> tintsBlue[random]; - case 4 -> tintsPurple[random]; - case 5 -> tintsYellow[random]; - default -> tints[random]; - }; - } - - public record SmokeBombArrowEntityPacketHandler(BlockPos blockPos) { - - /** - * Constructor for SmokeBombArrowEntityPacketHandler. - * - * @param blockPos the BlockPos of the block where the packet was sent - */ - public SmokeBombArrowEntityPacketHandler { - } + public SmokeBombArrowEntityPacketHandler { + } - /** - * Encodes a packet - * - * @param msg the SmokeBombArrowEntityPacketHandler message being sent - * @param packetBuffer the PacketBuffer containing packet data - */ - public static void encode(SmokeBombArrowEntityPacketHandler msg, FriendlyByteBuf packetBuffer) { - packetBuffer.writeBlockPos(msg.blockPos); - } + /** + * Encodes a packet + * + * @param msg the SmokeBombArrowEntityPacketHandler message being sent + * @param packetBuffer the PacketBuffer containing packet data + */ + public static void encode(SmokeBombArrowEntityPacketHandler msg, FriendlyByteBuf packetBuffer) { + packetBuffer.writeInt(msg.color); + } - /** - * Decodes a packet - * - * @param packetBuffer the PacketBuffer containing packet data - * @return SmokeBombArrowEntityPacketHandler - */ - public static SmokeBombArrowEntityPacketHandler decode(FriendlyByteBuf packetBuffer) { - return new SmokeBombArrowEntityPacketHandler(packetBuffer.readBlockPos()); - } + /** + * Decodes a packet + * + * @param packetBuffer the PacketBuffer containing packet data + * @return SmokeBombArrowEntityPacketHandler + */ + public static SmokeBombArrowEntityPacketHandler decode(FriendlyByteBuf packetBuffer) { + return new SmokeBombArrowEntityPacketHandler(packetBuffer.readInt()); + } - /** - * Handles an incoming packet, by sending it to the client/server - * - * @param msg the SmokeBombArrowEntityPacketHandler message being sent - * @param contextSupplier the Supplier providing context - */ - public static void handle(SmokeBombArrowEntityPacketHandler msg, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> handleOnClient(msg))); - context.setPacketHandled(true); - } + /** + * Handles an incoming packet, by sending it to the client/server + * + * @param msg the SmokeBombArrowEntityPacketHandler message being sent + * @param contextSupplier the Supplier providing context + */ + public static void handle(SmokeBombArrowEntityPacketHandler msg, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> handleOnClient(msg))); + context.setPacketHandled(true); + } - /** - * Runs specifically on the client, when a packet is received - * - * @param msg the SmokeBombArrowEntityPacketHandler message being sent - */ - @OnlyIn(Dist.CLIENT) - private static void handleOnClient(SmokeBombArrowEntityPacketHandler msg) { - Minecraft minecraft = Minecraft.getInstance(); - if (minecraft.level != null) { - minecraft.level.playLocalSound(msg.blockPos, DeferredRegistryHandler.SMOKE_BOMB_HISS.get(), SoundSource.NEUTRAL, 0.1f, 0.6f, true); - } - } + /** + * Runs specifically on the client, when a packet is received + * + * @param msg the SmokeBombArrowEntityPacketHandler message being sent + */ + private static void handleOnClient(SmokeBombArrowEntityPacketHandler msg) { + SmokeBombArrowEntity.setColor(msg.color); } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/MolotovEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/MolotovEntity.java index 84c8ab3dc..7c3a1ae81 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/MolotovEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/MolotovEntity.java @@ -1,9 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.entity.projectile; -import com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb.SmokeBombParticleData; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.Packet; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -13,15 +11,19 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.HitResult; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; -import java.awt.*; +import java.util.ArrayList; +import java.util.List; public class MolotovEntity extends ThrowableItemProjectile { private static final byte VANILLA_IMPACT_STATUS_ID = 3; + static final BlockState airState = Blocks.AIR.defaultBlockState(); + static final BlockState fireState = Blocks.FIRE.defaultBlockState(); /** * Constructor for MolotovEntity. @@ -85,39 +87,54 @@ public MolotovEntity(Level world, double x, double y, double z) { protected void onHit(@NotNull HitResult rayTraceResult) { super.onHit(rayTraceResult); if (!level.isClientSide) { - level.broadcastEntityEvent(this, VANILLA_IMPACT_STATUS_ID); // calls handleStatusUpdate which tells the client to render particles - if (level.getBlockState(blockPosition()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().above()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().above()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().above(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().east()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().east()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().east(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().east(2)) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().east(2)) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().east(2), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().east().north()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().east().north()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().east().north(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().east().south()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().east().south()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().east().south(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().west()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().west()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().west(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().west(2)) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().west(2)) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().west(2), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().west().south()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().west().south()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().west().south(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().west().north()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().west().north()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().west().north(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().north()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().north()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().north(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().north(2)) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().north(2)) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().north(2), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().south()) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().south()) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().south(), Blocks.FIRE.defaultBlockState()); - if (level.getBlockState(blockPosition().south(2)) == Blocks.AIR.defaultBlockState() || level.getBlockState(blockPosition().south(2)) == Blocks.CAVE_AIR.defaultBlockState()) - level.setBlockAndUpdate(blockPosition().south(2), Blocks.FIRE.defaultBlockState()); + level.broadcastEntityEvent(this, VANILLA_IMPACT_STATUS_ID); + + BlockPos currentPosition = blockPosition(); + + // Build a list of blocks where the fire will be placed. + List firePositionList = new ArrayList<>(15); + firePositionList.add(adjustFirePosition(currentPosition, 4)); + firePositionList.add(adjustFirePosition(currentPosition.east(), 3)); + firePositionList.add(adjustFirePosition(currentPosition.east(2), 3)); + firePositionList.add(adjustFirePosition(currentPosition.east().north(), 3)); + firePositionList.add(adjustFirePosition(currentPosition.east().south(), 3)); + firePositionList.add(adjustFirePosition(currentPosition.west(), 3)); + firePositionList.add(adjustFirePosition(currentPosition.west(2), 3)); + firePositionList.add(adjustFirePosition(currentPosition.west().north(), 3)); + firePositionList.add(adjustFirePosition(currentPosition.west().south(), 3)); + firePositionList.add(adjustFirePosition(currentPosition.north(), 3)); + firePositionList.add(adjustFirePosition(currentPosition.north(2), 3)); + firePositionList.add(adjustFirePosition(currentPosition.south(), 3)); + firePositionList.add(adjustFirePosition(currentPosition.south(2), 3)); + + for (BlockPos pos : firePositionList) { + if (!level.getBlockState(pos.below()).isAir() && level.getBlockState(pos).isAir()) { + level.setBlockAndUpdate(pos, fireState); + } + } + kill(); } } + /** + * Move the position down until a solid block is under it. + * + * @param pos the BlockPos being moved + * @param distanceDown the number of blocks to try moving down + * @return BlockPos + */ + private BlockPos adjustFirePosition(BlockPos pos, int distanceDown) { + BlockPos movedPosition = pos; + for (int i = 0; i <= distanceDown; i++) { + if (level.getBlockState(movedPosition) != airState) { + return movedPosition.above(); + } + movedPosition = movedPosition.below(); + } + return pos; + } + /** * Handle entity events. * @@ -126,53 +143,8 @@ protected void onHit(@NotNull HitResult rayTraceResult) { @Override public void handleEntityEvent(byte statusID) { if (statusID == VANILLA_IMPACT_STATUS_ID) { - ParticleOptions particleData = makeParticle(); - - for (int i = 0; i < 2; ++i) { // Create a few smoke particles, like the smoke bomb - level.addParticle(particleData, true, getX(), getY(), getZ(), GeneralUtilities.getRandomNumber(-0.02, 0.02d), GeneralUtilities.getRandomNumber(-0.02d, 0.02d), GeneralUtilities.getRandomNumber(-0.02d, 0.02d)); - } level.playLocalSound(getX(), getY(), getZ(), SoundEvents.GLASS_BREAK, SoundSource.NEUTRAL, 1f, 1f, false); kill(); } } - - /** - * Create a particle. - * - * @return IParticleData - */ - private ParticleOptions makeParticle() { - Color tint = getTint(GeneralUtilities.getRandomNumber(0, 2)); - double diameter = getDiameter(GeneralUtilities.getRandomNumber(0.2d, 0.4d)); - - return new SmokeBombParticleData(tint, diameter); - } - - /** - * Tint a particle. - * - * @param random a random number - * @return Color - */ - private Color getTint(int random) { - Color[] tints = { - new Color(1.00f, 1.00f, 1.00f), // no tint (white) - new Color(1.00f, 0.97f, 1.00f), // off-white - new Color(1.00f, 1.00f, 0.97f), // off-white 2 - }; - - return tints[random]; - } - - /** - * Get the particle diameter. - * - * @param random a random number - * @return double - */ - private double getDiameter(double random) { - final double MIN_DIAMETER = 0.01; - final double MAX_DIAMETER = 5.5; - return MIN_DIAMETER + (MAX_DIAMETER - MIN_DIAMETER) * random; - } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/MortarShellEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/MortarShellEntity.java index 8253dfec9..0bb89e7e0 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/MortarShellEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/MortarShellEntity.java @@ -10,24 +10,17 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.projectile.ItemSupplier; -import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.entity.projectile.ProjectileUtil; +import net.minecraft.world.entity.projectile.*; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Explosion.BlockInteraction; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.EntityHitResult; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraft.world.phys.*; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.network.NetworkHooks; import org.jetbrains.annotations.NotNull; -@OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) public class MortarShellEntity extends Projectile implements ItemSupplier { private static final DamageSource damageSource = new DamageSource("immersiveweapons.mortar"); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/SmokeBombEntity.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/SmokeBombEntity.java index 48c073647..efd56da0c 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/SmokeBombEntity.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/entity/projectile/SmokeBombEntity.java @@ -1,11 +1,10 @@ package com.anonymoushacker1279.immersiveweapons.entity.projectile; -import com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb.SmokeBombParticleData; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +import com.anonymoushacker1279.immersiveweapons.client.particle.smoke_bomb.SmokeBombParticleOptions; +import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; -import net.minecraft.core.particles.ParticleOptions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.sounds.SoundSource; @@ -16,20 +15,18 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.*; import net.minecraftforge.network.NetworkEvent.Context; import org.jetbrains.annotations.NotNull; -import java.awt.*; import java.util.function.Supplier; public class SmokeBombEntity extends ThrowableItemProjectile { private static final byte VANILLA_IMPACT_STATUS_ID = 3; private static int color; - private final int configMaxParticles = ServerConfig.MAX_SMOKE_BOMB_PARTICLES.get(); + private final int configMaxParticles = CommonConfig.MAX_SMOKE_BOMB_PARTICLES.get(); /** * Constructor for SmokeBombEntity. @@ -72,78 +69,6 @@ public static void setColor(int color) { SmokeBombEntity.color = color; } - /** - * Create a particle. - * - * @return IParticleData - */ - private static ParticleOptions makeParticle() { - Color tint = getTint(GeneralUtilities.getRandomNumber(0, 2)); - double diameter = getDiameter(GeneralUtilities.getRandomNumber(1.0d, 5.5d)); - - return new SmokeBombParticleData(tint, diameter); - } - - /** - * Get the particle diameter. - * - * @param random a random number - * @return double - */ - private static double getDiameter(double random) { - final double MIN_DIAMETER = 0.5; - final double MAX_DIAMETER = 5.5; - return MIN_DIAMETER + (MAX_DIAMETER - MIN_DIAMETER) * random; - } - - /** - * Tint a particle. - * - * @param random a random number - * @return Color - */ - private static Color getTint(int random) { - Color[] tints = { - new Color(1.00f, 1.00f, 1.00f), // no tint (white) - new Color(1.00f, 0.97f, 1.00f), // off-white - new Color(1.00f, 1.00f, 0.97f), // off-white 2 - }; - Color[] tintsRed = { - new Color(1.00f, 0.25f, 0.25f), // tint (red) - new Color(1.00f, 0.30f, 0.25f), // off-red - new Color(1.00f, 0.25f, 0.30f), // off-red 2 - }; - Color[] tintsGreen = { - new Color(0.25f, 1.00f, 0.25f), // tint (green) - new Color(0.30f, 1.00f, 0.25f), // off-green - new Color(0.25f, 1.00f, 0.30f), // off-green 2 - }; - Color[] tintsBlue = { - new Color(0.25f, 0.25f, 1.00f), // tint (blue) - new Color(0.30f, 0.25f, 1.00f), // off-blue - new Color(0.25f, 0.30f, 1.00f), // off-blue 2 - }; - Color[] tintsPurple = { - new Color(1.00f, 0.25f, 1.00f), // tint (purple) - new Color(1.00f, 0.30f, 1.00f), // off-purple - new Color(1.00f, 0.35f, 1.00f), // off-purple 2 - }; - Color[] tintsYellow = { - new Color(1.00f, 1.00f, 0.25f), // tint (yellow) - new Color(1.00f, 1.00f, 0.30f), // off-yellow - new Color(1.00f, 1.00f, 0.35f), // off-yellow 2 - }; - - return switch (color) { - case 1 -> tintsRed[random]; - case 2 -> tintsGreen[random]; - case 3 -> tintsBlue[random]; - case 4 -> tintsPurple[random]; - case 5 -> tintsYellow[random]; - default -> tints[random]; - }; - } - /** * Get the entity spawn packet. * @@ -174,8 +99,11 @@ private static Color getTint(int random) { protected void onHit(@NotNull HitResult rayTraceResult) { super.onHit(rayTraceResult); if (!level.isClientSide) { - PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(blockPosition())), new SmokeBombEntityPacketHandler(color)); - level.broadcastEntityEvent(this, VANILLA_IMPACT_STATUS_ID); // calls handleStatusUpdate which tells the client to render particles + // Inform the client of the smoke bomb color + PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> level.getChunkAt(blockPosition())), + new SmokeBombEntityPacketHandler(color)); + + level.broadcastEntityEvent(this, VANILLA_IMPACT_STATUS_ID); kill(); } } @@ -188,10 +116,23 @@ protected void onHit(@NotNull HitResult rayTraceResult) { @Override public void handleEntityEvent(byte statusID) { if (statusID == VANILLA_IMPACT_STATUS_ID) { + double x = getX(); + double y = getY(); + double z = getZ(); + + // Spawn smoke particles for (int i = 0; i < configMaxParticles; ++i) { - level.addParticle(makeParticle(), true, getX(), getY(), getZ(), GeneralUtilities.getRandomNumber(-0.03, 0.03d), GeneralUtilities.getRandomNumber(-0.02d, 0.02d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d)); + level.addParticle(SmokeBombParticleOptions.getParticleByColor(color), + true, x, y, z, + GeneralUtilities.getRandomNumber(-0.1d, 0.1d), + GeneralUtilities.getRandomNumber(-0.1d, 0.1d), + GeneralUtilities.getRandomNumber(-0.1d, 0.1d)); } - level.playLocalSound(getX(), getY(), getZ(), DeferredRegistryHandler.SMOKE_BOMB_HISS.get(), SoundSource.NEUTRAL, 1f, 1f, false); + + // Play a hissing sound + level.playLocalSound(x, y, z, DeferredRegistryHandler.SMOKE_BOMB_HISS.get(), + SoundSource.NEUTRAL, 0.2f, 0.6f, true); + kill(); } } @@ -243,7 +184,6 @@ public static void handle(SmokeBombEntityPacketHandler msg, Supplier co * * @param msg the SmokeBombEntityPacketHandler message being sent */ - @OnlyIn(Dist.CLIENT) private static void handleOnClient(SmokeBombEntityPacketHandler msg) { SmokeBombEntity.setColor(msg.color); } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/events/ClientForgeEventSubscriber.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ClientForgeEventSubscriber.java similarity index 98% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/events/ClientForgeEventSubscriber.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/event/ClientForgeEventSubscriber.java index 16f6e7054..241ad4e9e 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/events/ClientForgeEventSubscriber.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ClientForgeEventSubscriber.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.events; +package com.anonymoushacker1279.immersiveweapons.event; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/events/ClientModEventSubscriber.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ClientModEventSubscriber.java similarity index 89% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/events/ClientModEventSubscriber.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/event/ClientModEventSubscriber.java index 08b011605..ddeac9d91 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/events/ClientModEventSubscriber.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ClientModEventSubscriber.java @@ -1,11 +1,13 @@ -package com.anonymoushacker1279.immersiveweapons.events; +package com.anonymoushacker1279.immersiveweapons.event; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; +import com.anonymoushacker1279.immersiveweapons.block.properties.WoodTypes; import com.anonymoushacker1279.immersiveweapons.client.gui.screen.SmallPartsTableScreen; import com.anonymoushacker1279.immersiveweapons.client.gui.screen.TeslaSynthesizerScreen; import com.anonymoushacker1279.immersiveweapons.client.model.CelestialTowerModel; -import com.anonymoushacker1279.immersiveweapons.client.particle.blood.BloodParticleFactory; -import com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb.SmokeBombParticleFactory; +import com.anonymoushacker1279.immersiveweapons.client.particle.BloodParticle; +import com.anonymoushacker1279.immersiveweapons.client.particle.SandCloudParticle; +import com.anonymoushacker1279.immersiveweapons.client.particle.smoke_bomb.SmokeBombParticle; import com.anonymoushacker1279.immersiveweapons.client.renderer.blockentity.ChairRenderer; import com.anonymoushacker1279.immersiveweapons.client.renderer.blockentity.ShelfRenderer; import com.anonymoushacker1279.immersiveweapons.client.renderer.dimension.TiltrosDimensionSpecialEffects; @@ -14,7 +16,6 @@ import com.anonymoushacker1279.immersiveweapons.client.renderer.entity.projectile.arrow.*; import com.anonymoushacker1279.immersiveweapons.client.renderer.entity.projectile.bullet.*; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.util.CustomWoodTypes; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.MenuScreens; @@ -94,12 +95,21 @@ public static void onClientSetup(FMLClientSetupEvent event) { ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.NETHER_SULFUR_ORE.get(), RenderType.translucent()); ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.ELECTRIC_ORE.get(), RenderType.translucent()); ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.MOLTEN_ORE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.OAK_TABLE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.SPRUCE_TABLE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.BIRCH_TABLE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.JUNGLE_TABLE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.ACACIA_TABLE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.DARK_OAK_TABLE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.CRIMSON_TABLE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.WARPED_TABLE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(DeferredRegistryHandler.BURNED_OAK_TABLE.get(), RenderType.translucent()); mc.getBlockColors().register((color1, color2, color3, color4) -> BiomeColors.getAverageGrassColor(Objects.requireNonNull(color2), Objects.requireNonNull(color3)), DeferredRegistryHandler.PITFALL.get()); mc.getItemColors().register((color1, color2) -> GrassColor.get(0.5d, 1.0d), DeferredRegistryHandler.PITFALL_ITEM.get()); - event.enqueueWork(() -> Sheets.addWoodType(CustomWoodTypes.BURNED_OAK)); + event.enqueueWork(() -> Sheets.addWoodType(WoodTypes.BURNED_OAK)); event.enqueueWork(ClientModEventSubscriber::registerPropertyGetters); @@ -166,8 +176,9 @@ public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions */ @SubscribeEvent public static void onParticleFactoryRegistration(ParticleFactoryRegisterEvent event) { - mc.particleEngine.register(DeferredRegistryHandler.SMOKE_BOMB_PARTICLE_TYPE.get(), SmokeBombParticleFactory::new); - mc.particleEngine.register(DeferredRegistryHandler.BLOOD_PARTICLE_TYPE.get(), BloodParticleFactory::new); + mc.particleEngine.register(DeferredRegistryHandler.SMOKE_BOMB_PARTICLE.get(), SmokeBombParticle.Provider::new); + mc.particleEngine.register(DeferredRegistryHandler.BLOOD_PARTICLE.get(), BloodParticle.Provider::new); + mc.particleEngine.register(DeferredRegistryHandler.SAND_CLOUD_PARTICLE.get(), SandCloudParticle.Provider::new); } private static void registerPropertyGetters() { diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/events/ForgeEventSubscriber.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ForgeEventSubscriber.java similarity index 90% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/events/ForgeEventSubscriber.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/event/ForgeEventSubscriber.java index 8281d9605..a8428984b 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/events/ForgeEventSubscriber.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ForgeEventSubscriber.java @@ -1,7 +1,7 @@ -package com.anonymoushacker1279.immersiveweapons.events; +package com.anonymoushacker1279.immersiveweapons.event; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +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; @@ -40,9 +40,9 @@ public static void onBiomeLoading(BiomeLoadingEvent event) { } if (event.getCategory() != BiomeCategory.OCEAN && event.getCategory() != BiomeCategory.RIVER) { - if (ServerConfig.WANDERING_WARRIOR_SPAWN.get()) + if (CommonConfig.WANDERING_WARRIOR_SPAWN.get()) event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.WANDERING_WARRIOR_ENTITY.get(), 13, 1, 1)); - if (ServerConfig.HANS_SPAWN.get()) + if (CommonConfig.HANS_SPAWN.get()) event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.HANS_ENTITY.get(), 1, 1, 1)); } } @@ -51,11 +51,11 @@ public static void onBiomeLoading(BiomeLoadingEvent event) { generation.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, OreGeneratorHandler.NETHER_SULFUR_ORE_FEATURE); } if (Objects.requireNonNull(event.getName()).toString().equals("immersiveweapons:tiltros")) { - if (ServerConfig.LAVA_REVENANT_SPAWN.get()) + if (CommonConfig.LAVA_REVENANT_SPAWN.get()) event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.LAVA_REVENANT_ENTITY.get(), 1, 0, 1)); - if (ServerConfig.ROCK_SPIDER_SPAWN.get()) + if (CommonConfig.ROCK_SPIDER_SPAWN.get()) event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.ROCK_SPIDER_ENTITY.get(), 5, 4, 12)); - if (ServerConfig.CELESTIAL_TOWER_SPAWN.get()) + if (CommonConfig.CELESTIAL_TOWER_SPAWN.get()) event.getSpawns().addSpawn(MobCategory.MONSTER, new SpawnerData(DeferredRegistryHandler.CELESTIAL_TOWER_ENTITY.get(), 2, 0, 1)); } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/events/ModEventSubscriber.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ModEventSubscriber.java similarity index 96% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/events/ModEventSubscriber.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/event/ModEventSubscriber.java index be1baa80a..3d786a612 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/events/ModEventSubscriber.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/event/ModEventSubscriber.java @@ -1,9 +1,9 @@ -package com.anonymoushacker1279.immersiveweapons.events; +package com.anonymoushacker1279.immersiveweapons.event; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.entity.monster.*; -import com.anonymoushacker1279.immersiveweapons.entity.passive.AbstractFieldMedicEntity; -import com.anonymoushacker1279.immersiveweapons.entity.passive.AbstractMinutemanEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.AbstractFieldMedicEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.AbstractMinutemanEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import net.minecraft.world.item.Item; import net.minecraftforge.event.RegistryEvent; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DeferredRegistryHandler.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DeferredRegistryHandler.java index d42c17737..45f490a9b 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DeferredRegistryHandler.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DeferredRegistryHandler.java @@ -9,20 +9,18 @@ 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.properties.WoodTypes; import com.anonymoushacker1279.immersiveweapons.block.sign.BurnedOakStandingSignBlock; import com.anonymoushacker1279.immersiveweapons.block.sign.BurnedOakWallSignBlock; import com.anonymoushacker1279.immersiveweapons.block.trap.*; import com.anonymoushacker1279.immersiveweapons.blockentity.*; -import com.anonymoushacker1279.immersiveweapons.client.particle.blood.BloodParticleData; -import com.anonymoushacker1279.immersiveweapons.client.particle.blood.BloodParticleType; -import com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb.SmokeBombParticleData; -import com.anonymoushacker1279.immersiveweapons.client.particle.smokebomb.SmokeBombParticleType; +import com.anonymoushacker1279.immersiveweapons.client.particle.smoke_bomb.SmokeBombParticleOptions; import com.anonymoushacker1279.immersiveweapons.container.SmallPartsContainer; import com.anonymoushacker1279.immersiveweapons.container.TeslaSynthesizerContainer; import com.anonymoushacker1279.immersiveweapons.entity.misc.ChairEntity; import com.anonymoushacker1279.immersiveweapons.entity.monster.*; -import com.anonymoushacker1279.immersiveweapons.entity.passive.FieldMedicEntity; -import com.anonymoushacker1279.immersiveweapons.entity.passive.MinutemanEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.FieldMedicEntity; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.MinutemanEntity; import com.anonymoushacker1279.immersiveweapons.entity.projectile.BulletEntity.*; import com.anonymoushacker1279.immersiveweapons.entity.projectile.CustomArrowEntity.*; import com.anonymoushacker1279.immersiveweapons.entity.projectile.*; @@ -35,7 +33,8 @@ import com.anonymoushacker1279.immersiveweapons.item.crafting.TeslaSynthesizerRecipe; import com.anonymoushacker1279.immersiveweapons.item.fortitude.*; import com.anonymoushacker1279.immersiveweapons.item.gauntlet.*; -import com.anonymoushacker1279.immersiveweapons.item.misc.ExplosiveChocolateBar; +import com.anonymoushacker1279.immersiveweapons.item.materials.CustomArmorMaterials; +import com.anonymoushacker1279.immersiveweapons.item.materials.CustomItemMaterials; import com.anonymoushacker1279.immersiveweapons.item.misc.UsedSyringeItem; import com.anonymoushacker1279.immersiveweapons.item.pike.*; import com.anonymoushacker1279.immersiveweapons.item.projectile.arrow.*; @@ -47,14 +46,17 @@ import com.anonymoushacker1279.immersiveweapons.item.tool.ventus.*; import com.anonymoushacker1279.immersiveweapons.item.utility.*; import com.anonymoushacker1279.immersiveweapons.potion.*; -import com.anonymoushacker1279.immersiveweapons.util.*; +import com.anonymoushacker1279.immersiveweapons.util.CreativeTab; +import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import com.anonymoushacker1279.immersiveweapons.world.food.FoodItemProperties; import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.feature.treedecorators.BurnedBranchDecorator; import com.anonymoushacker1279.immersiveweapons.world.level.levelgen.structures.*; import com.anonymoushacker1279.immersiveweapons.world.level.loot.AzulKeystoneFragmentInChestsLootModifierHandler; import com.anonymoushacker1279.immersiveweapons.world.level.loot.LogShardsLootModifierHandler; import com.google.common.collect.Sets; +import com.mojang.serialization.Codec; import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.*; @@ -78,6 +80,9 @@ import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.*; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Function; @SuppressWarnings({"unused", "ConstantConditions"}) public class DeferredRegistryHandler { @@ -129,7 +134,7 @@ public static void init() { TREE_DECORATORS.register(modEventBus); } - public static final CreativeModeTab ITEM_GROUP = new CreativeTabSorter(ImmersiveWeapons.MOD_ID); + public static final CreativeModeTab ITEM_GROUP = new CreativeTab(ImmersiveWeapons.MOD_ID); // Tools public static final RegistryObject MOLTEN_SWORD = ITEMS.register("molten_sword", () -> new MoltenSword(CustomItemMaterials.MOLTEN, 4, -2.1f, new Properties().tab(DeferredRegistryHandler.ITEM_GROUP).fireResistant())); @@ -138,20 +143,20 @@ public static void init() { public static final RegistryObject MOLTEN_SHOVEL = ITEMS.register("molten_shovel", () -> new MoltenShovel(CustomItemMaterials.MOLTEN, -1, -3.0f, new Properties().tab(DeferredRegistryHandler.ITEM_GROUP).fireResistant())); public static final RegistryObject MOLTEN_HOE = ITEMS.register("molten_hoe", () -> new MoltenHoe(CustomItemMaterials.MOLTEN, -3, 1.0f, new Properties().tab(DeferredRegistryHandler.ITEM_GROUP).fireResistant())); public static final RegistryObject COPPER_SWORD = ITEMS.register("copper_sword", () -> new SwordItem(CustomItemMaterials.COPPER, 2, -2.4f, new Properties().tab(ITEM_GROUP))); - public static final RegistryObject COPPER_PICKAXE = ITEMS.register("copper_pickaxe", () -> new PickaxeItem(CustomItemMaterials.COPPER, 1, -2.3F, new Properties().tab(ITEM_GROUP))); + public static final RegistryObject COPPER_PICKAXE = ITEMS.register("copper_pickaxe", () -> new PickaxeItem(CustomItemMaterials.COPPER, 1, -2.8F, new Properties().tab(ITEM_GROUP))); public static final RegistryObject COPPER_AXE = ITEMS.register("copper_axe", () -> new AxeItem(CustomItemMaterials.COPPER, 3, -3.0f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject COPPER_SHOVEL = ITEMS.register("copper_shovel", () -> new ShovelItem(CustomItemMaterials.COPPER, -1, -2.7f, new Properties().tab(ITEM_GROUP))); - public static final RegistryObject COPPER_HOE = ITEMS.register("copper_hoe", () -> new HoeItem(CustomItemMaterials.COPPER, -2, 1.0f, new Properties().tab(ITEM_GROUP))); + public static final RegistryObject COPPER_HOE = ITEMS.register("copper_hoe", () -> new HoeItem(CustomItemMaterials.COPPER, -2, -3.0f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject TESLA_SWORD = ITEMS.register("tesla_sword", () -> new TeslaSword(CustomItemMaterials.TESLA, 5, -2.1f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject TESLA_PICKAXE = ITEMS.register("tesla_pickaxe", () -> new TeslaPickaxe(CustomItemMaterials.TESLA, 4, -2.3f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject TESLA_AXE = ITEMS.register("tesla_axe", () -> new TeslaAxe(CustomItemMaterials.TESLA, 7, -3.0f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject TESLA_SHOVEL = ITEMS.register("tesla_shovel", () -> new TeslaShovel(CustomItemMaterials.TESLA, 0, -3.0f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject TESLA_HOE = ITEMS.register("tesla_hoe", () -> new TeslaHoe(CustomItemMaterials.TESLA, -3, 1.0f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject COBALT_SWORD = ITEMS.register("cobalt_sword", () -> new SwordItem(CustomItemMaterials.COBALT, 2, -2.4f, new Properties().tab(ITEM_GROUP))); - public static final RegistryObject COBALT_PICKAXE = ITEMS.register("cobalt_pickaxe", () -> new PickaxeItem(CustomItemMaterials.COBALT, 1, -2.3F, new Properties().tab(ITEM_GROUP))); + public static final RegistryObject COBALT_PICKAXE = ITEMS.register("cobalt_pickaxe", () -> new PickaxeItem(CustomItemMaterials.COBALT, 1, -2.7F, new Properties().tab(ITEM_GROUP))); public static final RegistryObject COBALT_AXE = ITEMS.register("cobalt_axe", () -> new AxeItem(CustomItemMaterials.COBALT, 3, -3.0f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject COBALT_SHOVEL = ITEMS.register("cobalt_shovel", () -> new ShovelItem(CustomItemMaterials.COBALT, -1, -2.7f, new Properties().tab(ITEM_GROUP))); - public static final RegistryObject COBALT_HOE = ITEMS.register("cobalt_hoe", () -> new HoeItem(CustomItemMaterials.COBALT, -3, 1.0f, new Properties().tab(ITEM_GROUP))); + public static final RegistryObject COBALT_HOE = ITEMS.register("cobalt_hoe", () -> new HoeItem(CustomItemMaterials.COBALT, -3, -2.0f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject VENTUS_SWORD = ITEMS.register("ventus_sword", () -> new VentusSword(CustomItemMaterials.VENTUS, 4, -2.0f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject VENTUS_PICKAXE = ITEMS.register("ventus_pickaxe", () -> new VentusPickaxe(CustomItemMaterials.VENTUS, 3, -2.2f, new Properties().tab(ITEM_GROUP))); public static final RegistryObject VENTUS_AXE = ITEMS.register("ventus_axe", () -> new VentusAxe(CustomItemMaterials.VENTUS, 6, -2.9f, new Properties().tab(ITEM_GROUP))); @@ -169,14 +174,14 @@ public static void init() { public static final RegistryObject FLINTLOCK_PISTOL = ITEMS.register("flintlock_pistol", () -> new SimplePistolItem(new Properties().tab(ITEM_GROUP).durability(499))); public static final RegistryObject BLUNDERBUSS = ITEMS.register("blunderbuss", () -> new SimpleShotgunItem(new Properties().tab(ITEM_GROUP).durability(449))); public static final RegistryObject FLARE_GUN = ITEMS.register("flare_gun", () -> new FlareGunItem(new Properties().tab(ITEM_GROUP).durability(399))); - public static final RegistryObject WOOD_GAUNTLET = ITEMS.register("wood_gauntlet", () -> new WoodGauntletItem(Tiers.WOOD, 2, -2.6f, new Properties().tab(ITEM_GROUP), 0.15f)); - public static final RegistryObject STONE_GAUNTLET = ITEMS.register("stone_gauntlet", () -> new StoneGauntletItem(Tiers.STONE, 2, -2.6f, new Properties().tab(ITEM_GROUP), 0.25f)); - public static final RegistryObject GOLD_GAUNTLET = ITEMS.register("gold_gauntlet", () -> new GoldGauntletItem(Tiers.GOLD, 2, -2.6f, new Properties().tab(ITEM_GROUP), 0.35f)); - public static final RegistryObject COPPER_GAUNTLET = ITEMS.register("copper_gauntlet", () -> new CopperGauntletItem(CustomItemMaterials.COPPER, 1, -2.6f, new Properties().tab(ITEM_GROUP), 0.45f)); - public static final RegistryObject IRON_GAUNTLET = ITEMS.register("iron_gauntlet", () -> new IronGauntletItem(Tiers.IRON, 2, -2.6f, new Properties().tab(ITEM_GROUP), 0.55f)); - public static final RegistryObject COBALT_GAUNTLET = ITEMS.register("cobalt_gauntlet", () -> new CobaltGauntletItem(CustomItemMaterials.COBALT, 1, -2.6f, new Properties().tab(ITEM_GROUP), 0.60f)); - public static final RegistryObject DIAMOND_GAUNTLET = ITEMS.register("diamond_gauntlet", () -> new DiamondGauntletItem(Tiers.DIAMOND, 2, -2.6f, new Properties().tab(ITEM_GROUP), 0.75f)); - public static final RegistryObject NETHERITE_GAUNTLET = ITEMS.register("netherite_gauntlet", () -> new NetheriteGauntletItem(Tiers.NETHERITE, 2, -2.6f, new Properties().tab(ITEM_GROUP), 0.85f)); + public static final RegistryObject WOOD_GAUNTLET = ITEMS.register("wood_gauntlet", () -> new WoodGauntletItem(Tiers.WOOD, 2, -2.3f, new Properties().tab(ITEM_GROUP), 0.15f)); + public static final RegistryObject STONE_GAUNTLET = ITEMS.register("stone_gauntlet", () -> new StoneGauntletItem(Tiers.STONE, 2, -2.3f, new Properties().tab(ITEM_GROUP), 0.25f)); + public static final RegistryObject GOLD_GAUNTLET = ITEMS.register("gold_gauntlet", () -> new GoldGauntletItem(Tiers.GOLD, 2, -2.3f, new Properties().tab(ITEM_GROUP), 0.35f)); + public static final RegistryObject COPPER_GAUNTLET = ITEMS.register("copper_gauntlet", () -> new CopperGauntletItem(CustomItemMaterials.COPPER, 1, -2.3f, new Properties().tab(ITEM_GROUP), 0.45f)); + public static final RegistryObject IRON_GAUNTLET = ITEMS.register("iron_gauntlet", () -> new IronGauntletItem(Tiers.IRON, 2, -2.3f, new Properties().tab(ITEM_GROUP), 0.55f)); + public static final RegistryObject COBALT_GAUNTLET = ITEMS.register("cobalt_gauntlet", () -> new CobaltGauntletItem(CustomItemMaterials.COBALT, 1, -2.3f, new Properties().tab(ITEM_GROUP), 0.60f)); + public static final RegistryObject DIAMOND_GAUNTLET = ITEMS.register("diamond_gauntlet", () -> new DiamondGauntletItem(Tiers.DIAMOND, 2, -2.3f, new Properties().tab(ITEM_GROUP), 0.75f)); + public static final RegistryObject NETHERITE_GAUNTLET = ITEMS.register("netherite_gauntlet", () -> new NetheriteGauntletItem(Tiers.NETHERITE, 2, -2.3f, new Properties().tab(ITEM_GROUP), 0.85f)); // Items public static final RegistryObject STONE_SHARD = ITEMS.register("stone_shard", () -> new Item(new Properties().tab(ITEM_GROUP))); @@ -187,11 +192,9 @@ public static void init() { public static final RegistryObject WOOD_SHARD = ITEMS.register("wood_shard", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject COPPER_NUGGET = ITEMS.register("copper_nugget", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject COBALT_NUGGET = ITEMS.register("cobalt_nugget", () -> new Item(new Properties().tab(ITEM_GROUP))); - public static final RegistryObject MOLTEN_PLATE = ITEMS.register("molten_plate", () -> new Item(new Properties().tab(ITEM_GROUP).fireResistant())); - public static final RegistryObject TESLA_PLATE = ITEMS.register("tesla_plate", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject WOOD_TOOL_ROD = ITEMS.register("wood_tool_rod", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject OBSIDIAN_ROD = ITEMS.register("obsidian_rod", () -> new Item(new Properties().tab(ITEM_GROUP))); - public static final RegistryObject MOLTEN_INGOT = ITEMS.register("molten_ingot", () -> new Item(new Properties().tab(ITEM_GROUP).fireResistant())); + public static final RegistryObject MOLTEN_INGOT = ITEMS.register("molten_ingot", () -> new FuelItem(new Properties().tab(ITEM_GROUP).fireResistant(), 24000)); public static final RegistryObject CONDUCTIVE_ALLOY = ITEMS.register("conductive_alloy", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject ELECTRIC_INGOT = ITEMS.register("electric_ingot", () -> new Item(new Properties().tab(ITEM_GROUP))); public static final RegistryObject TESLA_INGOT = ITEMS.register("tesla_ingot", () -> new Item(new Properties().tab(ITEM_GROUP))); @@ -254,8 +257,8 @@ public static void init() { public static final RegistryObject BOTTLE_OF_ALCOHOL = ITEMS.register("bottle_of_alcohol", () -> new AlcoholBottleItem(new Properties().tab(ITEM_GROUP).stacksTo(16))); public static final RegistryObject BOTTLE_OF_WINE = ITEMS.register("bottle_of_wine", () -> new WineBottleItem(new Properties().tab(ITEM_GROUP).stacksTo(16))); public static final RegistryObject PLIERS = ITEMS.register("pliers", () -> new Item(new Properties().tab(ITEM_GROUP).stacksTo(1))); - public static final RegistryObject CHOCOLATE_BAR = ITEMS.register("chocolate_bar", () -> new Item(new Properties().tab(ITEM_GROUP).food(FoodItemProperties.CHOCOLATE_BAR))); - public static final RegistryObject EXPLOSIVE_CHOCOLATE_BAR = ITEMS.register("explosive_chocolate_bar", () -> new ExplosiveChocolateBar(new Properties().tab(ITEM_GROUP).food(FoodItemProperties.CHOCOLATE_BAR))); + public static final RegistryObject CHOCOLATE_BAR = ITEMS.register("chocolate_bar", () -> new ChocolateBarItem(new Properties().tab(ITEM_GROUP).food(FoodItemProperties.CHOCOLATE_BAR), false)); + public static final RegistryObject EXPLOSIVE_CHOCOLATE_BAR = ITEMS.register("explosive_chocolate_bar", () -> new ChocolateBarItem(new Properties().tab(ITEM_GROUP).food(FoodItemProperties.CHOCOLATE_BAR), true)); public static final RegistryObject BANDAGE = ITEMS.register("bandage", () -> new BandageItem(new Properties().tab(ITEM_GROUP).stacksTo(16))); public static final RegistryObject MRE = ITEMS.register("mre", () -> new Item(new Properties().tab(ITEM_GROUP).food(FoodItemProperties.MRE))); public static final RegistryObject PAINKILLERS = ITEMS.register("painkillers", () -> new PainkillerItem(new Properties().tab(ITEM_GROUP).stacksTo(24))); @@ -328,6 +331,7 @@ public static void init() { public static final RegistryObject SULFUR_ORE = BLOCKS.register("sulfur_ore", () -> new OreBlock(BlockBehaviour.Properties.of(Material.STONE).strength(4.0f).sound(SoundType.STONE).requiresCorrectToolForDrops())); public static final RegistryObject DEEPSLATE_SULFUR_ORE = BLOCKS.register("deepslate_sulfur_ore", () -> new OreBlock(BlockBehaviour.Properties.of(Material.STONE).strength(4.5f).sound(SoundType.DEEPSLATE).requiresCorrectToolForDrops())); public static final RegistryObject NETHER_SULFUR_ORE = BLOCKS.register("nether_sulfur_ore", () -> new OreBlock(BlockBehaviour.Properties.of(Material.STONE).strength(0.4f).sound(SoundType.STONE).requiresCorrectToolForDrops())); + public static final RegistryObject RAW_SULFUR_BLOCK = BLOCKS.register("raw_sulfur_block", () -> new Block(BlockBehaviour.Properties.of(Material.STONE).strength(0.4f).sound(SoundType.STONE).requiresCorrectToolForDrops())); // Iron tier public static final RegistryObject BARBED_WIRE_FENCE = BLOCKS.register("barbed_wire_fence", () -> new BarbedWireFenceBlock(BlockBehaviour.Properties.of(Material.METAL).strength(7.0f, 8.0f).sound(SoundType.METAL).noOcclusion())); public static final RegistryObject COBALT_ORE = BLOCKS.register("cobalt_ore", () -> new OreBlock(BlockBehaviour.Properties.of(Material.STONE).strength(4.0f).sound(SoundType.STONE).requiresCorrectToolForDrops())); @@ -361,8 +365,8 @@ public static void init() { public static final RegistryObject BURNED_OAK_DOOR = BLOCKS.register("burned_oak_door", () -> new DoorBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(1.7f, 2.7f).sound(SoundType.WOOD))); public static final RegistryObject BURNED_OAK_TRAPDOOR = BLOCKS.register("burned_oak_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(1.7f, 2.7f).sound(SoundType.WOOD).noOcclusion())); public static final RegistryObject BURNED_OAK_PRESSURE_PLATE = BLOCKS.register("burned_oak_pressure_plate", () -> new PressurePlateBlock(Sensitivity.EVERYTHING, BlockBehaviour.Properties.of(Material.WOOD).strength(0.4f).sound(SoundType.WOOD).noOcclusion().noCollission())); - public static final RegistryObject BURNED_OAK_SIGN = BLOCKS.register("burned_oak_sign", () -> new BurnedOakStandingSignBlock(BlockBehaviour.Properties.of(Material.WOOD).noCollission().strength(1.0F).sound(SoundType.WOOD), CustomWoodTypes.BURNED_OAK)); - public static final RegistryObject BURNED_OAK_WALL_SIGN = BLOCKS.register("burned_oak_wall_sign", () -> new BurnedOakWallSignBlock(BlockBehaviour.Properties.of(Material.WOOD).noCollission().strength(1.0F).sound(SoundType.WOOD), CustomWoodTypes.BURNED_OAK)); + public static final RegistryObject BURNED_OAK_SIGN = BLOCKS.register("burned_oak_sign", () -> new BurnedOakStandingSignBlock(BlockBehaviour.Properties.of(Material.WOOD).noCollission().strength(1.0F).sound(SoundType.WOOD), WoodTypes.BURNED_OAK)); + public static final RegistryObject BURNED_OAK_WALL_SIGN = BLOCKS.register("burned_oak_wall_sign", () -> new BurnedOakWallSignBlock(BlockBehaviour.Properties.of(Material.WOOD).noCollission().strength(1.0F).sound(SoundType.WOOD), WoodTypes.BURNED_OAK)); public static final RegistryObject BURNED_OAK_BUTTON = BLOCKS.register("burned_oak_button", () -> new WoodButtonBlock(BlockBehaviour.Properties.of(Material.WOOD).noCollission().strength(0.4f).sound(SoundType.WOOD))); // Stone tier public static final RegistryObject WOODEN_SPIKES = BLOCKS.register("wooden_spikes", () -> new WoodenSpikesBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).requiresCorrectToolForDrops().noOcclusion())); @@ -403,7 +407,15 @@ public static void init() { public static final RegistryObject MEDIC_STATUE = BLOCKS.register("medic_statue", () -> new MedicStatueBlock(BlockBehaviour.Properties.of(Material.STONE).strength(5.0f).sound(SoundType.STONE).noOcclusion())); public static final RegistryObject WALL_SHELF = BLOCKS.register("wall_shelf", () -> new ShelfBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(1.0f).sound(SoundType.WOOD).noOcclusion().noCollission())); public static final RegistryObject PANIC_ALARM = BLOCKS.register("panic_alarm", () -> new PanicAlarmBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(1.0f).sound(SoundType.WOOD).noOcclusion().randomTicks())); - public static final RegistryObject WOODEN_TABLE = BLOCKS.register("wooden_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject OAK_TABLE = BLOCKS.register("oak_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject SPRUCE_TABLE = BLOCKS.register("spruce_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject BIRCH_TABLE = BLOCKS.register("birch_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject JUNGLE_TABLE = BLOCKS.register("jungle_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject ACACIA_TABLE = BLOCKS.register("acacia_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject DARK_OAK_TABLE = BLOCKS.register("dark_oak_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject CRIMSON_TABLE = BLOCKS.register("crimson_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject WARPED_TABLE = BLOCKS.register("warped_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); + public static final RegistryObject BURNED_OAK_TABLE = BLOCKS.register("burned_oak_table", () -> new WoodenTableBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(3.0f).sound(SoundType.WOOD).noOcclusion())); public static final RegistryObject BIOHAZARD_BOX = BLOCKS.register("biohazard_box", () -> new BiohazardBoxBlock(BlockBehaviour.Properties.of(Material.DECORATION).strength(0.5f).sound(SoundType.LANTERN).noOcclusion())); public static final RegistryObject CLOUD = BLOCKS.register("cloud", () -> new HalfTransparentBlock(BlockBehaviour.Properties.of(Material.STRUCTURAL_AIR).strength(0.7f).sound(SoundType.SNOW).noOcclusion())); public static final RegistryObject CAMP_CHAIR = BLOCKS.register("camp_chair", () -> new CampChairBlock(BlockBehaviour.Properties.of(Material.CLOTH_DECORATION).strength(1.0f).sound(SoundType.WOOL).noOcclusion())); @@ -420,15 +432,15 @@ public static void init() { public static final RegistryObject> DIAMOND_ARROW_ENTITY = ENTITY_TYPES.register("diamond_arrow", () -> EntityType.Builder. of(DiamondArrowEntity::new, MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "diamond_arrow").toString())); public static final RegistryObject> NETHERITE_ARROW_ENTITY = ENTITY_TYPES.register("netherite_arrow", () -> EntityType.Builder. of(NetheriteArrowEntity::new, MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "netherite_arrow").toString())); public static final RegistryObject> SMOKE_BOMB_ARROW_ENTITY = ENTITY_TYPES.register("smoke_bomb_arrow", () -> EntityType.Builder. of(SmokeBombArrowEntity::new, MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "smoke_bomb_arrow").toString())); - public static final RegistryObject> WOOD_BULLET_ENTITY = ENTITY_TYPES.register("wood_musket_ball", () -> EntityType.Builder. of((type, world) -> new WoodBulletEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "wood_musket_ball").toString())); - public static final RegistryObject> STONE_BULLET_ENTITY = ENTITY_TYPES.register("stone_musket_ball", () -> EntityType.Builder. of((type, world) -> new StoneBulletEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "stone_musket_ball").toString())); - public static final RegistryObject> COPPER_BULLET_ENTITY = ENTITY_TYPES.register("copper_musket_ball", () -> EntityType.Builder. of((type, world) -> new CopperBulletEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "copper_musket_ball").toString())); - public static final RegistryObject> IRON_BULLET_ENTITY = ENTITY_TYPES.register("iron_musket_ball", () -> EntityType.Builder. of((type, world) -> new IronBulletEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "iron_musket_ball").toString())); - public static final RegistryObject> COBALT_BULLET_ENTITY = ENTITY_TYPES.register("cobalt_musket_ball", () -> EntityType.Builder. of((type, world) -> new CobaltBulletEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "cobalt_musket_ball").toString())); - public static final RegistryObject> GOLD_BULLET_ENTITY = ENTITY_TYPES.register("gold_musket_ball", () -> EntityType.Builder. of((type, world) -> new GoldBulletEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "gold_musket_ball").toString())); - public static final RegistryObject> DIAMOND_BULLET_ENTITY = ENTITY_TYPES.register("diamond_musket_ball", () -> EntityType.Builder. of((type, world) -> new DiamondBulletEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "diamond_musket_ball").toString())); - public static final RegistryObject> NETHERITE_BULLET_ENTITY = ENTITY_TYPES.register("netherite_musket_ball", () -> EntityType.Builder. of((type, world) -> new NetheriteBulletEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "netherite_musket_ball").toString())); - public static final RegistryObject> FLARE_ENTITY = ENTITY_TYPES.register("flare", () -> EntityType.Builder. of((type, world) -> new FlareEntity(type, world, 0), MobCategory.MISC).sized(0.5f, 0.5f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "flare").toString())); + public static final RegistryObject> WOOD_BULLET_ENTITY = ENTITY_TYPES.register("wood_musket_ball", () -> EntityType.Builder. of((type, world) -> new WoodBulletEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "wood_musket_ball").toString())); + public static final RegistryObject> STONE_BULLET_ENTITY = ENTITY_TYPES.register("stone_musket_ball", () -> EntityType.Builder. of((type, world) -> new StoneBulletEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "stone_musket_ball").toString())); + public static final RegistryObject> COPPER_BULLET_ENTITY = ENTITY_TYPES.register("copper_musket_ball", () -> EntityType.Builder. of((type, world) -> new CopperBulletEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "copper_musket_ball").toString())); + public static final RegistryObject> IRON_BULLET_ENTITY = ENTITY_TYPES.register("iron_musket_ball", () -> EntityType.Builder. of((type, world) -> new IronBulletEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "iron_musket_ball").toString())); + public static final RegistryObject> COBALT_BULLET_ENTITY = ENTITY_TYPES.register("cobalt_musket_ball", () -> EntityType.Builder. of((type, world) -> new CobaltBulletEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "cobalt_musket_ball").toString())); + public static final RegistryObject> GOLD_BULLET_ENTITY = ENTITY_TYPES.register("gold_musket_ball", () -> EntityType.Builder. of((type, world) -> new GoldBulletEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "gold_musket_ball").toString())); + public static final RegistryObject> DIAMOND_BULLET_ENTITY = ENTITY_TYPES.register("diamond_musket_ball", () -> EntityType.Builder. of((type, world) -> new DiamondBulletEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "diamond_musket_ball").toString())); + public static final RegistryObject> NETHERITE_BULLET_ENTITY = ENTITY_TYPES.register("netherite_musket_ball", () -> EntityType.Builder. of((type, world) -> new NetheriteBulletEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "netherite_musket_ball").toString())); + public static final RegistryObject> FLARE_ENTITY = ENTITY_TYPES.register("flare", () -> EntityType.Builder. of((type, world) -> new FlareEntity(type, world, 0), MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "flare").toString())); public static final RegistryObject> SMOKE_BOMB_ENTITY = ENTITY_TYPES.register("smoke_bomb", () -> EntityType.Builder. of(SmokeBombEntity::new, MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "smoke_bomb").toString())); public static final RegistryObject> MOLOTOV_COCKTAIL_ENTITY = ENTITY_TYPES.register("molotov_cocktail", () -> EntityType.Builder. of(MolotovEntity::new, MobCategory.MISC).sized(0.25f, 0.25f).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "molotov_cocktail").toString())); public static final RegistryObject> DYING_SOLDIER_ENTITY = ENTITY_TYPES.register("dying_soldier", () -> EntityType.Builder.of(DyingSoldierEntity::new, MobCategory.MONSTER).sized(0.6f, 1.99f).clientTrackingRange(8).build(new ResourceLocation(ImmersiveWeapons.MOD_ID, "dying_soldier").toString())); @@ -453,6 +465,7 @@ public static void init() { public static final RegistryObject SULFUR_ORE_ITEM = ITEMS.register("sulfur_ore", () -> new BlockItem(SULFUR_ORE.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject DEEPSLATE_SULFUR_ORE_ITEM = ITEMS.register("deepslate_sulfur_ore", () -> new BlockItem(DEEPSLATE_SULFUR_ORE.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject NETHER_SULFUR_ORE_ITEM = ITEMS.register("nether_sulfur_ore", () -> new BlockItem(NETHER_SULFUR_ORE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject RAW_SULFUR_BLOCK_ITEM = ITEMS.register("raw_sulfur_block", () -> new BlockItem(RAW_SULFUR_BLOCK.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject MOLTEN_BLOCK_ITEM = ITEMS.register("molten_block", () -> new BlockItem(MOLTEN_BLOCK.get(), new Properties().tab(ITEM_GROUP).fireResistant())); public static final RegistryObject TESLA_BLOCK_ITEM = ITEMS.register("tesla_block", () -> new BlockItem(TESLA_BLOCK.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject COBALT_BLOCK_ITEM = ITEMS.register("cobalt_block", () -> new BlockItem(COBALT_BLOCK.get(), new Properties().tab(ITEM_GROUP))); @@ -491,7 +504,15 @@ public static void init() { public static final RegistryObject MORTAR_ITEM = ITEMS.register("mortar", () -> new BlockItem(MORTAR.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject WALL_SHELF_ITEM = ITEMS.register("wall_shelf", () -> new BlockItem(WALL_SHELF.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject PANIC_ALARM_ITEM = ITEMS.register("panic_alarm", () -> new BlockItem(PANIC_ALARM.get(), new Properties().tab(ITEM_GROUP))); - public static final RegistryObject WOODEN_TABLE_ITEM = ITEMS.register("wooden_table", () -> new BlockItem(WOODEN_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject OAK_TABLE_ITEM = ITEMS.register("oak_table", () -> new BlockItem(OAK_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject SPRUCE_TABLE_ITEM = ITEMS.register("spruce_table", () -> new BlockItem(SPRUCE_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject BIRCH_TABLE_ITEM = ITEMS.register("birch_table", () -> new BlockItem(BIRCH_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject JUNGLE_TABLE_ITEM = ITEMS.register("jungle_table", () -> new BlockItem(JUNGLE_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject ACACIA_TABLE_ITEM = ITEMS.register("acacia_table", () -> new BlockItem(ACACIA_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject DARK_OAK_TABLE_ITEM = ITEMS.register("dark_oak_table", () -> new BlockItem(DARK_OAK_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject CRIMSON_TABLE_ITEM = ITEMS.register("crimson_table", () -> new BlockItem(CRIMSON_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject WARPED_TABLE_ITEM = ITEMS.register("warped_table", () -> new BlockItem(WARPED_TABLE.get(), new Properties().tab(ITEM_GROUP))); + public static final RegistryObject BURNED_OAK_TABLE_ITEM = ITEMS.register("burned_oak_table", () -> new BlockItem(BURNED_OAK_TABLE.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject CAMP_CHAIR_ITEM = ITEMS.register("camp_chair", () -> new BlockItem(CAMP_CHAIR.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject BARBED_WIRE_FENCE_ITEM = ITEMS.register("barbed_wire_fence", () -> new BlockItem(BARBED_WIRE_FENCE.get(), new Properties().tab(ITEM_GROUP))); public static final RegistryObject WOODEN_SPIKES_ITEM = ITEMS.register("wooden_spikes", () -> new BlockItem(WOODEN_SPIKES.get(), new Properties().tab(ITEM_GROUP))); @@ -545,6 +566,7 @@ public static void init() { public static final RegistryObject TESLA_ARMOR_EFFECT = SOUND_EVENTS.register("tesla_armor_effect", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_armor_effect"))); public static final RegistryObject TESLA_ARMOR_POWER_DOWN = SOUND_EVENTS.register("tesla_armor_power_down", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_armor_power_down"))); public static final RegistryObject TESLA_ARMOR_POWER_UP = SOUND_EVENTS.register("tesla_armor_power_up", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_armor_power_up"))); + public static final RegistryObject TESLA_ARMOR_EQUIP = SOUND_EVENTS.register("tesla_armor_equip", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "tesla_armor_equip"))); public static final RegistryObject FLINTLOCK_PISTOL_FIRE = SOUND_EVENTS.register("flintlock_pistol_fire", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "flintlock_pistol_fire"))); public static final RegistryObject BULLET_WHIZZ = SOUND_EVENTS.register("bullet_whizz", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "bullet_whizz"))); public static final RegistryObject FLINTLOCK_PISTOL_MISFIRE = SOUND_EVENTS.register("flintlock_pistol_misfire", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "flintlock_pistol_misfire"))); @@ -556,9 +578,7 @@ public static void init() { public static final RegistryObject BEAR_TRAP_CLOSE = SOUND_EVENTS.register("bear_trap_close", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "bear_trap_close"))); public static final RegistryObject SPIKE_TRAP_EXTEND = SOUND_EVENTS.register("spike_trap_extend", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "spike_trap_extend"))); public static final RegistryObject SPIKE_TRAP_RETRACT = SOUND_EVENTS.register("spike_trap_retract", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "spike_trap_retract"))); - public static final RegistryObject ALARM_1 = SOUND_EVENTS.register("alarm_1", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "alarm_1"))); - public static final RegistryObject ALARM_2 = SOUND_EVENTS.register("alarm_2", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "alarm_2"))); - public static final RegistryObject ALARM_3 = SOUND_EVENTS.register("alarm_3", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "alarm_3"))); + public static final RegistryObject PANIC_ALARM_SOUND = SOUND_EVENTS.register("panic_alarm", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "panic_alarm"))); public static final RegistryObject DYING_SOLDIER_AMBIENT = SOUND_EVENTS.register("dying_soldier_ambient", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "dying_soldier_ambient"))); public static final RegistryObject DYING_SOLDIER_STEP = SOUND_EVENTS.register("dying_soldier_step", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "dying_soldier_step"))); public static final RegistryObject DYING_SOLDIER_DEATH = SOUND_EVENTS.register("dying_soldier_death", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "dying_soldier_death"))); @@ -586,6 +606,7 @@ public static void init() { public static final RegistryObject CELESTIAL_TOWER_DEATH = SOUND_EVENTS.register("celestial_tower_death", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "celestial_tower_death"))); public static final RegistryObject CELESTIAL_TOWER_SUMMON = SOUND_EVENTS.register("celestial_tower_summon", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "celestial_tower_summon"))); public static final RegistryObject CELESTIAL_TOWER_VULNERABLE = SOUND_EVENTS.register("celestial_tower_vulnerable", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "celestial_tower_vulnerable"))); + public static final RegistryObject MORTAR_FIRE = SOUND_EVENTS.register("mortar_fire", () -> new SoundEvent(new ResourceLocation(ImmersiveWeapons.MOD_ID, "mortar_fire"))); // Containers public static final RegistryObject> SMALL_PARTS_TABLE_CONTAINER = CONTAINER_TYPES.register("small_parts_table", () -> IForgeMenuType.create((id, inv, data) -> new SmallPartsContainer(id, inv))); @@ -600,8 +621,15 @@ public static void init() { public static final RegistryObject AZUL_KEYSTONE_FRAGMENT_IN_CHESTS_MODIFIER = GLOBAL_LOOT_MODIFIER_SERIALIZER.register("azul_keystone_fragment_in_chests", AzulKeystoneFragmentInChestsLootModifierHandler.Serializer::new); // Particles - public static final RegistryObject> SMOKE_BOMB_PARTICLE_TYPE = PARTICLE_TYPES.register("smoke_bomb", SmokeBombParticleType::new); - public static final RegistryObject> BLOOD_PARTICLE_TYPE = PARTICLE_TYPES.register("blood", BloodParticleType::new); + public static final RegistryObject> SMOKE_BOMB_PARTICLE = PARTICLE_TYPES.register("smoke_bomb", () -> new ParticleType<>(false, SmokeBombParticleOptions.DESERIALIZER) { + final Function, Codec> codec = (type) -> SmokeBombParticleOptions.CODEC; + + public @NotNull Codec codec() { + return codec.apply(this); + } + }); + public static final RegistryObject BLOOD_PARTICLE = PARTICLE_TYPES.register("blood", () -> new SimpleParticleType(false)); + public static final RegistryObject SAND_CLOUD_PARTICLE = PARTICLE_TYPES.register("sand_cloud", () -> new SimpleParticleType(false)); // Block Entities public static final RegistryObject> BEAR_TRAP_BLOCK_ENTITY = BLOCK_ENTITIES.register("bear_trap", () -> new BlockEntityType<>(BearTrapBlockEntity::new, Sets.newHashSet(BEAR_TRAP.get()), null)); diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DispenserBehaviorRegistry.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DispenserBehaviorRegistry.java index c8bbbd3b5..7d687bd8d 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DispenserBehaviorRegistry.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/DispenserBehaviorRegistry.java @@ -232,12 +232,13 @@ public static void init() { /** * Custom dispense behavior. * - * @param iBlockSource the IBlockSource instance - * @param itemStack the ItemStack being dispensed + * @param source the BlockSource instance + * @param itemStack the ItemStack being dispensed * @return ItemStack */ + @SuppressWarnings("ConstantConditions") @Override - public @NotNull ItemStack dispense(@NotNull BlockSource iBlockSource, @NotNull ItemStack itemStack) { + public @NotNull ItemStack dispense(@NotNull BlockSource source, @NotNull ItemStack itemStack) { return null; } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/PacketHandler.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PacketHandler.java similarity index 83% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/util/PacketHandler.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/init/PacketHandler.java index 129abb54d..48b12cefd 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/PacketHandler.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PacketHandler.java @@ -1,17 +1,16 @@ -package com.anonymoushacker1279.immersiveweapons.util; +package com.anonymoushacker1279.immersiveweapons.init; 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.trap.SpikeTrapBlock.SpikeTrapBlockPacketHandler; -import com.anonymoushacker1279.immersiveweapons.blockentity.PanicAlarmBlockEntity.PanicAlarmPacketHandler; import com.anonymoushacker1279.immersiveweapons.entity.monster.LavaRevenantEntity.LavaRevenantEntityPacketHandler; -import com.anonymoushacker1279.immersiveweapons.entity.projectile.CustomArrowEntity.SmokeBombArrowEntity.SmokeBombArrowEntityPacketHandler; +import com.anonymoushacker1279.immersiveweapons.entity.neutral.AbstractFieldMedicEntity.AbstractFieldMedicEntityPacketHandler; +import com.anonymoushacker1279.immersiveweapons.entity.projectile.CustomArrowEntity.SmokeBombArrowEntityPacketHandler; import com.anonymoushacker1279.immersiveweapons.entity.projectile.SmokeBombEntity.SmokeBombEntityPacketHandler; import com.anonymoushacker1279.immersiveweapons.item.armor.CobaltArmorItem.CobaltArmorItemPacketHandler; import com.anonymoushacker1279.immersiveweapons.item.armor.TeslaArmorItem.TeslaArmorItemPacketHandler; import com.anonymoushacker1279.immersiveweapons.item.armor.VentusArmorItem.VentusArmorItemPacketHandler; -import com.anonymoushacker1279.immersiveweapons.potion.BleedingEffect.BleedingEffectPacketHandler; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; @@ -31,18 +30,18 @@ public class PacketHandler { */ public static void registerPackets() { int networkId = 0; - PacketHandler.INSTANCE.registerMessage(networkId++, - PanicAlarmPacketHandler.class, - PanicAlarmPacketHandler::encode, - PanicAlarmPacketHandler::decode, - PanicAlarmPacketHandler::handle - ); PacketHandler.INSTANCE.registerMessage(networkId++, SmokeBombEntityPacketHandler.class, SmokeBombEntityPacketHandler::encode, SmokeBombEntityPacketHandler::decode, SmokeBombEntityPacketHandler::handle ); + PacketHandler.INSTANCE.registerMessage(networkId++, + SmokeBombArrowEntityPacketHandler.class, + SmokeBombArrowEntityPacketHandler::encode, + SmokeBombArrowEntityPacketHandler::decode, + SmokeBombArrowEntityPacketHandler::handle + ); PacketHandler.INSTANCE.registerMessage(networkId++, CobaltArmorItemPacketHandler.class, CobaltArmorItemPacketHandler::encode, @@ -67,35 +66,29 @@ public static void registerPackets() { MortarBlockPacketHandler::decode, MortarBlockPacketHandler::handle ); - PacketHandler.INSTANCE.registerMessage(networkId++, - SmokeBombArrowEntityPacketHandler.class, - SmokeBombArrowEntityPacketHandler::encode, - SmokeBombArrowEntityPacketHandler::decode, - SmokeBombArrowEntityPacketHandler::handle - ); PacketHandler.INSTANCE.registerMessage(networkId++, SpikeTrapBlockPacketHandler.class, SpikeTrapBlockPacketHandler::encode, SpikeTrapBlockPacketHandler::decode, SpikeTrapBlockPacketHandler::handle ); - PacketHandler.INSTANCE.registerMessage(networkId++, - BleedingEffectPacketHandler.class, - BleedingEffectPacketHandler::encode, - BleedingEffectPacketHandler::decode, - BleedingEffectPacketHandler::handle - ); PacketHandler.INSTANCE.registerMessage(networkId++, WarriorStatueTorsoPacketHandler.class, WarriorStatueTorsoPacketHandler::encode, WarriorStatueTorsoPacketHandler::decode, WarriorStatueTorsoPacketHandler::handle ); - PacketHandler.INSTANCE.registerMessage(networkId, + PacketHandler.INSTANCE.registerMessage(networkId++, LavaRevenantEntityPacketHandler.class, LavaRevenantEntityPacketHandler::encode, LavaRevenantEntityPacketHandler::decode, LavaRevenantEntityPacketHandler::handle ); + PacketHandler.INSTANCE.registerMessage(networkId, + AbstractFieldMedicEntityPacketHandler.class, + AbstractFieldMedicEntityPacketHandler::encode, + AbstractFieldMedicEntityPacketHandler::decode, + AbstractFieldMedicEntityPacketHandler::handle + ); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PostSetupHandler.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PostSetupHandler.java index 89d6bdd40..c5f25c5f9 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PostSetupHandler.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/init/PostSetupHandler.java @@ -1,6 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.init; import com.anonymoushacker1279.immersiveweapons.item.gauntlet.*; +import com.anonymoushacker1279.immersiveweapons.item.materials.CustomArmorMaterials; import com.anonymoushacker1279.immersiveweapons.item.pike.*; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; import com.google.common.collect.ImmutableMap; @@ -130,5 +131,8 @@ public static void init() { // 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(); + + // Set custom armor equip sounds, as these don't exist during the initialization of materials + CustomArmorMaterials.TESLA.setEquipSound(DeferredRegistryHandler.TESLA_ARMOR_EQUIP.get()); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/CobaltArmorItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/CobaltArmorItem.java index 0c707ad73..7cef6fae9 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/CobaltArmorItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/CobaltArmorItem.java @@ -1,10 +1,10 @@ package com.anonymoushacker1279.immersiveweapons.item.armor; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.events.ClientModEventSubscriber; +import com.anonymoushacker1279.immersiveweapons.event.ClientModEventSubscriber; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/TeslaArmorItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/TeslaArmorItem.java index 7c596037a..83b5bf720 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/TeslaArmorItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/TeslaArmorItem.java @@ -2,9 +2,9 @@ import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; import com.anonymoushacker1279.immersiveweapons.config.ClientConfig; -import com.anonymoushacker1279.immersiveweapons.events.ClientModEventSubscriber; +import com.anonymoushacker1279.immersiveweapons.event.ClientModEventSubscriber; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.sounds.SoundSource; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/VentusArmorItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/VentusArmorItem.java index 76d5d5e02..96e6b3b84 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/VentusArmorItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/armor/VentusArmorItem.java @@ -1,10 +1,10 @@ package com.anonymoushacker1279.immersiveweapons.item.armor; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.events.ClientModEventSubscriber; +import com.anonymoushacker1279.immersiveweapons.event.ClientModEventSubscriber; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import com.anonymoushacker1279.immersiveweapons.init.PacketHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/bottle/AbstractBottleItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/bottle/AbstractBottleItem.java index b58152771..4cd9db8ec 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/bottle/AbstractBottleItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/bottle/AbstractBottleItem.java @@ -3,10 +3,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.UseAnim; +import net.minecraft.world.item.*; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; @@ -24,40 +21,31 @@ public abstract class AbstractBottleItem extends Item { /** * Runs when the item is used. * - * @param worldIn the World the player is in - * @param playerIn the PlayerEntity instance - * @param handIn the Hand the player is using + * @param level the Level the player is in + * @param playerIn the Player instance + * @param handIn the InteractionHand the player is using */ @Override - public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { - ItemStack itemstack = playerIn.getItemInHand(handIn); + public @NotNull InteractionResultHolder use(@NotNull Level level, Player playerIn, @NotNull InteractionHand handIn) { + ItemStack itemInHand = playerIn.getItemInHand(handIn); onUse(playerIn); if (!playerIn.isCreative()) { - itemstack.shrink(1); + itemInHand.shrink(1); playerIn.addItem(new ItemStack(Items.GLASS_BOTTLE)); - playerIn.getCooldowns().addCooldown(this, getCooldown()); + playerIn.getCooldowns().addCooldown(this, 600); } - return InteractionResultHolder.sidedSuccess(itemstack, worldIn.isClientSide()); + return InteractionResultHolder.sidedSuccess(itemInHand, level.isClientSide()); } /** * Additional code to run when the item is used. * - * @param playerIn the PlayerEntity instance + * @param playerIn the Player instance */ protected void onUse(Player playerIn) { } - /** - * Get the item cooldown. - * - * @return int - */ - private int getCooldown() { - return 600; - } - /** * Check if the item has a container item. * diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/bottle/WineBottleItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/bottle/WineBottleItem.java index 50e5848b6..7310e0a16 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/bottle/WineBottleItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/bottle/WineBottleItem.java @@ -19,7 +19,7 @@ public WineBottleItem(Properties properties) { /** * Additional code to run when the item is used. * - * @param playerIn the PlayerEntity instance + * @param playerIn the Player instance */ @Override protected void onUse(Player playerIn) { diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/BandageItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/BandageItem.java index 6968bcd9d..b91128f51 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/BandageItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/BandageItem.java @@ -1,8 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.item.fortitude; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; +import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import net.minecraft.world.*; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.LivingEntity; @@ -26,43 +25,57 @@ public BandageItem(Properties properties) { /** * Runs when the player right-clicks. * - * @param worldIn the World the player is in - * @param playerIn the PlayerEntity performing the action - * @param handIn the Hand the player is using - * @return ActionResult extending ItemStack + * @param level the Level the player is in + * @param player the Player performing the action + * @param handIn the Hand the player is using + * @return InteractionResultHolder extending ItemStack */ @Override - public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { - ItemStack itemstack = playerIn.getItemInHand(handIn); - playerIn.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 240, 0, false, true)); - if (!playerIn.isCreative()) { - itemstack.shrink(1); - playerIn.getCooldowns().addCooldown(this, 300); + public @NotNull InteractionResultHolder use(@NotNull Level level, Player player, + @NotNull InteractionHand handIn) { + + ItemStack itemInHand = player.getItemInHand(handIn); + + setEffects(player); + + if (!player.isCreative()) { + itemInHand.shrink(1); + player.getCooldowns().addCooldown(this, 300); } - return InteractionResultHolder.sidedSuccess(itemstack, worldIn.isClientSide()); + return InteractionResultHolder.sidedSuccess(itemInHand, level.isClientSide()); } /** * Runs when the player right-clicks an entity. * - * @param stack the ItemStack right-clicked with - * @param playerIn the PlayerEntity performing the action - * @param entity the LivingEntity being interacted with - * @param hand the Hand the player is using - * @return ActionResultType + * @param stack the ItemStack right-clicked with + * @param player the Player performing the action + * @param entity the LivingEntity being interacted with + * @param hand the Hand the player is using + * @return InteractionResult */ @Override - public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack stack, @NotNull Player playerIn, LivingEntity entity, @NotNull InteractionHand hand) { + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack stack, @NotNull Player player, + LivingEntity entity, @NotNull InteractionHand hand) { + if (entity.level.isClientSide) { return InteractionResult.PASS; } - entity.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 160, 0, false, true)); - if (!playerIn.isCreative()) { + setEffects(entity); + + if (!player.isCreative()) { stack.shrink(1); } return InteractionResult.PASS; } + + private void setEffects(LivingEntity entity) { + if (entity.hasEffect(DeferredRegistryHandler.BLEEDING_EFFECT.get())) { + entity.removeEffect(DeferredRegistryHandler.BLEEDING_EFFECT.get()); + } + entity.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 240, 0, false, true)); + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/ChocolateBarItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/ChocolateBarItem.java new file mode 100644 index 000000000..21635aeb4 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/ChocolateBarItem.java @@ -0,0 +1,44 @@ +package com.anonymoushacker1279.immersiveweapons.item.fortitude; + +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +public class ChocolateBarItem extends Item { + + private static final DamageSource damageSource = new DamageSource("immersiveweapons.explosive_chocolate_bar"); + private final boolean isExplosive; + + /** + * Constructor for ChocolateBarItem. + * + * @param properties the Properties for the item + */ + public ChocolateBarItem(Properties properties, boolean isExplosive) { + super(properties); + + this.isExplosive = isExplosive; + } + + /** + * Runs when the item is no longer being used. + * + * @param stack the ItemStack instance + * @param level the Level the entity is in + * @param entity the LivingEntity using the item + * @return ItemStack + */ + @Override + public @NotNull ItemStack finishUsingItem(@NotNull ItemStack stack, @NotNull Level level, @NotNull LivingEntity entity) { + if (isExplosive) { + level.explode(null, damageSource, null, entity.position().x, entity.position().y, + entity.position().z, 2.0F, false, Explosion.BlockInteraction.NONE); + } + + return super.finishUsingItem(stack, level, entity); + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/FirstAidKitItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/FirstAidKitItem.java index fd829b54a..e27fc063e 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/FirstAidKitItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/FirstAidKitItem.java @@ -1,11 +1,10 @@ package com.anonymoushacker1279.immersiveweapons.item.fortitude; +import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.*; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.LivingEntity; @@ -29,53 +28,69 @@ public FirstAidKitItem(Properties properties) { /** * Runs when the player right-clicks. * - * @param worldIn the World the player is in - * @param playerIn the PlayerEntity performing the action - * @param handIn the Hand the player is using - * @return ActionResult extending ItemStack + * @param level the Level the player is in + * @param player the Player performing the action + * @param hand the InteractionHand the player is using + * @return InteractionResultHolder extending ItemStack */ @Override - public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { - ItemStack itemstack = playerIn.getItemInHand(handIn); - if (playerIn.getMaxHealth() - playerIn.getHealth() <= playerIn.getMaxHealth() / 2) { // Only use if at or less than half health - if (worldIn.isClientSide) { - playerIn.sendMessage(new TranslatableComponent("immersiveweapons.item.first_aid_kit").withStyle(ChatFormatting.RED), Util.NIL_UUID); + public @NotNull InteractionResultHolder use(@NotNull Level level, Player player, + @NotNull InteractionHand hand) { + + ItemStack itemInHand = player.getItemInHand(hand); + if (player.getMaxHealth() - player.getHealth() <= player.getMaxHealth() / 2) { // Only use if at or less than half health + if (level.isClientSide) { + player.sendMessage(new TranslatableComponent("immersiveweapons.item.first_aid_kit") + .withStyle(ChatFormatting.RED), Util.NIL_UUID); } - return InteractionResultHolder.pass(itemstack); + return InteractionResultHolder.pass(itemInHand); } - playerIn.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 240, 1, false, true)); - playerIn.addEffect(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, 1200, 0, false, true)); - if (!playerIn.isCreative()) { - itemstack.shrink(1); - playerIn.getCooldowns().addCooldown(this, 400); + + setEffects(player); + + if (!player.isCreative()) { + itemInHand.shrink(1); + player.getCooldowns().addCooldown(this, 400); } - return InteractionResultHolder.sidedSuccess(itemstack, worldIn.isClientSide()); + return InteractionResultHolder.sidedSuccess(itemInHand, level.isClientSide()); } /** * Runs when the player right-clicks an entity. * - * @param stack the ItemStack right-clicked with - * @param playerIn the PlayerEntity performing the action - * @param entity the LivingEntity being interacted with - * @param hand the Hand the player is using + * @param stack the ItemStack right-clicked with + * @param player the Player performing the action + * @param entity the LivingEntity being interacted with + * @param hand the Hand the player is using * @return ActionResultType */ @Override - public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack stack, @NotNull Player playerIn, LivingEntity entity, @NotNull InteractionHand hand) { + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack stack, @NotNull Player player, + LivingEntity entity, @NotNull InteractionHand hand) { + if (entity.level.isClientSide) { return InteractionResult.PASS; } + if (entity.getMaxHealth() - entity.getHealth() <= entity.getMaxHealth() / 2) { // Only use if at or less than half health return InteractionResult.PASS; } - entity.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 160, 1, false, true)); - entity.addEffect(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, 900, 0, false, true)); - if (!playerIn.isCreative()) { + + setEffects(entity); + + if (!player.isCreative()) { stack.shrink(1); } return InteractionResult.PASS; } + + private void setEffects(LivingEntity entity) { + if (entity.hasEffect(DeferredRegistryHandler.BLEEDING_EFFECT.get())) { + entity.removeEffect(DeferredRegistryHandler.BLEEDING_EFFECT.get()); + } + entity.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 240, 1, false, true)); + entity.addEffect(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, 1200, 0, false, true)); + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/MorphineItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/MorphineItem.java index 14ca33ea2..cf16833d0 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/MorphineItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/MorphineItem.java @@ -1,9 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.item.fortitude; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.*; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -27,43 +25,57 @@ public MorphineItem(Properties properties) { * Runs when the player right-clicks. * * @param worldIn the World the player is in - * @param playerIn the PlayerEntity performing the action - * @param handIn the Hand the player is using - * @return ActionResult extending ItemStack + * @param playerIn the Player performing the action + * @param handIn the InteractionHand the player is using + * @return InteractionResultHolder extending ItemStack */ @Override - public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { - ItemStack itemstack = playerIn.getItemInHand(handIn); - playerIn.addEffect(new MobEffectInstance(DeferredRegistryHandler.MORPHINE_EFFECT.get(), 1800, 0, false, true)); + public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, + @NotNull InteractionHand handIn) { + + ItemStack itemInHand = playerIn.getItemInHand(handIn); + + setEffects(playerIn); + if (!playerIn.isCreative()) { - itemstack.shrink(1); + itemInHand.shrink(1); playerIn.getInventory().add(new ItemStack(DeferredRegistryHandler.USED_SYRINGE.get())); playerIn.getCooldowns().addCooldown(this, 2400); } - return InteractionResultHolder.sidedSuccess(itemstack, worldIn.isClientSide()); + return InteractionResultHolder.sidedSuccess(itemInHand, worldIn.isClientSide()); } /** * Runs when the player right-clicks an entity. * * @param stack the ItemStack right-clicked with - * @param playerIn the PlayerEntity performing the action + * @param playerIn the Player performing the action * @param entity the LivingEntity being interacted with - * @param hand the Hand the player is using - * @return ActionResultType + * @param hand the InteractionHand the player is using + * @return InteractionResult */ @Override - public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack stack, @NotNull Player playerIn, LivingEntity entity, @NotNull InteractionHand hand) { + public @NotNull InteractionResult interactLivingEntity(@NotNull ItemStack stack, @NotNull Player playerIn, + LivingEntity entity, @NotNull InteractionHand hand) { + if (entity.level.isClientSide) { return InteractionResult.PASS; } - entity.addEffect(new MobEffectInstance(DeferredRegistryHandler.MORPHINE_EFFECT.get(), 1800, 0, false, true)); + + setEffects(entity); + if (!playerIn.isCreative()) { stack.shrink(1); playerIn.getInventory().add(new ItemStack(DeferredRegistryHandler.USED_SYRINGE.get())); + playerIn.getCooldowns().addCooldown(this, 2400); } return InteractionResult.PASS; } + + private void setEffects(LivingEntity entity) { + entity.addEffect(new MobEffectInstance(DeferredRegistryHandler.MORPHINE_EFFECT.get(), 1800, 0, + false, true)); + } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/PainkillerItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/PainkillerItem.java index 72fb1b670..c8cf7ece3 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/PainkillerItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/fortitude/PainkillerItem.java @@ -26,8 +26,8 @@ public PainkillerItem(Properties properties) { * * @param worldIn the World the player is in * @param playerIn the PlayerEntity performing the action - * @param handIn the Hand the player is using - * @return ActionResult extending ItemStack + * @param handIn the InteractionHand the player is using + * @return InteractionResultHolder extending ItemStack */ @Override public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/gauntlet/GauntletItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/gauntlet/GauntletItem.java index 45a80141a..43c989f73 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/gauntlet/GauntletItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/gauntlet/GauntletItem.java @@ -11,14 +11,9 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Tier; -import net.minecraft.world.item.TieredItem; -import net.minecraft.world.item.Vanishable; +import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -104,7 +99,8 @@ Ingredient getRepairMaterial() { */ public void bleedBehavior(LivingEntity target) { if (GeneralUtilities.getRandomNumber(0.0f, 1.0f) <= bleedChance) { - target.addEffect(new MobEffectInstance(DeferredRegistryHandler.BLEEDING_EFFECT.get(), 200, 0, false, false)); + target.addEffect(new MobEffectInstance(DeferredRegistryHandler.BLEEDING_EFFECT.get(), 200, + 0, true, false)); } } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/materials/CustomArmorMaterials.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/materials/CustomArmorMaterials.java new file mode 100644 index 000000000..5a6a497cd --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/materials/CustomArmorMaterials.java @@ -0,0 +1,152 @@ +package com.anonymoushacker1279.immersiveweapons.item.materials; + +import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Supplier; + +public enum CustomArmorMaterials implements ArmorMaterial { + + MOLTEN("molten", 39, new int[]{5, 6, 9, 4}, 15, SoundEvents.ARMOR_EQUIP_NETHERITE, + 3.25F, () -> Ingredient.of(DeferredRegistryHandler.MOLTEN_INGOT.get()), 0.12F), + COPPER("copper", 13, new int[]{1, 4, 5, 1}, 9, SoundEvents.ARMOR_EQUIP_IRON, + 0.0F, () -> Ingredient.of(Items.COPPER_INGOT), 0.0F), + TESLA("tesla", 42, new int[]{7, 8, 11, 6}, 20, SoundEvents.ARMOR_EQUIP_IRON, + 3.5F, () -> Ingredient.of(DeferredRegistryHandler.TESLA_INGOT.get()), 0.05F), + COBALT("cobalt", 19, new int[]{3, 5, 6, 3}, 10, SoundEvents.ARMOR_EQUIP_IRON, + 0.0F, () -> Ingredient.of(DeferredRegistryHandler.COBALT_INGOT.get()), 0.0F), + VENTUS("ventus", 39, new int[]{5, 6, 9, 5}, 14, SoundEvents.ARMOR_EQUIP_NETHERITE, + 2.75F, () -> Ingredient.of(DeferredRegistryHandler.VENTUS_SHARD.get()), 0.02F); + + static final int[] HEALTH_PER_SLOT = new int[]{13, 15, 16, 11}; + private final String name; + private final int durabilityMultiplier; + private final int[] slotArmorValues; + private final int enchantability; + private SoundEvent equipSound; + private final float toughness; + private final Supplier repairMaterial; + private final float knockbackResist; + + /** + * Constructor for CustomArmorMaterials. + * + * @param name the material name + * @param durabilityMultiplier the durability multiplier. This is multiplied by the values in the + * HEALTH_PER_SLOT array. + * @param slotArmorValues an array of defense values for each armor piece. From left to right: helmet, + * chestplate, leggings, boots. + * @param enchantability the enchantability value + * @param equipSound the SoundEvent providing a sound to play when the armor is equipped + * @param toughness the armor toughness value + * @param repairMaterial the repair material + * @param knockbackResist the knockback resistance value + */ + CustomArmorMaterials(String name, int durabilityMultiplier, int[] slotArmorValues, int enchantability, + SoundEvent equipSound, float toughness, Supplier repairMaterial, float knockbackResist) { + + this.name = name; + this.durabilityMultiplier = durabilityMultiplier; + this.slotArmorValues = slotArmorValues; + this.enchantability = enchantability; + this.equipSound = equipSound; + this.toughness = toughness; + this.repairMaterial = repairMaterial; + this.knockbackResist = knockbackResist; + } + + /** + * Get durability for a slot. + * + * @param slotIn the EquipmentSlotType + * @return int + */ + @Override + public int getDurabilityForSlot(EquipmentSlot slotIn) { + return HEALTH_PER_SLOT[slotIn.getIndex()] * durabilityMultiplier; + } + + /** + * Get the defense for a slot. + * + * @param slotIn the EquipmentSlotType + * @return int + */ + @Override + public int getDefenseForSlot(EquipmentSlot slotIn) { + return slotArmorValues[slotIn.getIndex()]; + } + + /** + * Get the enchantment value. + * + * @return int + */ + @Override + public int getEnchantmentValue() { + return enchantability; + } + + /** + * Get the equipping sound. + * + * @return SoundEvent + */ + @Override + public @NotNull SoundEvent getEquipSound() { + return equipSound; + } + + /** + * Set the equipping sound. + */ + public void setEquipSound(SoundEvent sound) { + equipSound = sound; + } + + /** + * Get the repair ingredient. + * + * @return Ingredient + */ + @Override + public @NotNull Ingredient getRepairIngredient() { + return repairMaterial.get(); + } + + /** + * Get the name. + * + * @return String + */ + @Override + public @NotNull String getName() { + return name; + } + + /** + * Get the toughness. + * + * @return float + */ + @Override + public float getToughness() { + return toughness; + } + + /** + * Get the knockback resistance. + * + * @return float + */ + @Override + public float getKnockbackResistance() { + return knockbackResist; + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomItemMaterials.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/materials/CustomItemMaterials.java similarity index 97% rename from src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomItemMaterials.java rename to src/main/java/com/anonymoushacker1279/immersiveweapons/item/materials/CustomItemMaterials.java index 651d73fd4..8381ff42d 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomItemMaterials.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/materials/CustomItemMaterials.java @@ -1,4 +1,4 @@ -package com.anonymoushacker1279.immersiveweapons.util; +package com.anonymoushacker1279.immersiveweapons.item.materials; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import net.minecraft.world.item.Items; diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/misc/ExplosiveChocolateBar.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/misc/ExplosiveChocolateBar.java deleted file mode 100644 index 996bb60e5..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/misc/ExplosiveChocolateBar.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.item.misc; - -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Explosion; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; - -public class ExplosiveChocolateBar extends Item { - - private static final DamageSource damageSource = new DamageSource("immersiveweapons.explosive_chocolate_bar"); - - /** - * Constructor for ExplosiveChocolateBar. - * - * @param properties the Properties for the item - */ - public ExplosiveChocolateBar(Properties properties) { - super(properties); - } - - /** - * Runs when the item is no longer being used. - * - * @param stack the ItemStack instance - * @param worldIn the World the entity is in - * @param entityLiving the LivingEntity using the item - * @return ItemStack - */ - @Override - public @NotNull ItemStack finishUsingItem(@NotNull ItemStack stack, Level worldIn, LivingEntity entityLiving) { - worldIn.explode(null, damageSource, null, entityLiving.blockPosition().getX(), entityLiving.blockPosition().getY(), entityLiving.blockPosition().getZ(), 2.0F, false, Explosion.BlockInteraction.NONE); - return super.finishUsingItem(stack, worldIn, entityLiving); - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/misc/UsedSyringeItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/misc/UsedSyringeItem.java index 1ff349fc9..8821167aa 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/misc/UsedSyringeItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/misc/UsedSyringeItem.java @@ -1,7 +1,6 @@ package com.anonymoushacker1279.immersiveweapons.item.misc; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import net.minecraft.client.Minecraft; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.damagesource.DamageSource; @@ -11,8 +10,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.HitResult.Type; import org.jetbrains.annotations.NotNull; public class UsedSyringeItem extends Item { @@ -31,28 +28,29 @@ public UsedSyringeItem(Properties properties) { /** * Runs when the player right-clicks. * - * @param worldIn the World the player is in + * @param level the Level the player is in * @param playerIn the PlayerEntity performing the action - * @param handIn the Hand the player is using - * @return ActionResult extending ItemStack + * @param handIn the InteractionHand the player is using + * @return InteractionResultHolder extending ItemStack */ @Override - public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { - ItemStack itemstack = playerIn.getItemInHand(handIn); - HitResult rayTraceResult = Minecraft.getInstance().hitResult; - if (rayTraceResult != null && rayTraceResult.getType() != Type.ENTITY) { - int randomNumber = GeneralUtilities.getRandomNumber(0, 100); - if (randomNumber <= 80) { - playerIn.addEffect(new MobEffectInstance(MobEffects.POISON, 500, 0, false, true)); - if (randomNumber <= 30) { - playerIn.hurt(damageSource, 8.0F); - } - } - if (!playerIn.isCreative()) { - itemstack.shrink(1); + public @NotNull InteractionResultHolder use(@NotNull Level level, Player playerIn, + @NotNull InteractionHand handIn) { + + ItemStack itemInHand = playerIn.getItemInHand(handIn); + + int randomNumber = GeneralUtilities.getRandomNumber(0, 100); + if (randomNumber <= 80) { + playerIn.addEffect(new MobEffectInstance(MobEffects.POISON, 500, 0, false, true)); + if (randomNumber <= 30) { + playerIn.hurt(damageSource, 8.0F); } } + if (!playerIn.isCreative()) { + itemInHand.shrink(1); + } + - return InteractionResultHolder.sidedSuccess(itemstack, worldIn.isClientSide()); + return InteractionResultHolder.sidedSuccess(itemInHand, level.isClientSide()); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/gun/AbstractGunItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/gun/AbstractGunItem.java index 7a80e419c..23c802cda 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/gun/AbstractGunItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/gun/AbstractGunItem.java @@ -9,6 +9,7 @@ import java.util.function.Predicate; public abstract class AbstractGunItem extends Item { + protected static final Predicate MUSKET_BALLS = (stack) -> stack.is(ImmersiveWeaponsItemTagGroups.MUSKET_BALLS); protected static final Predicate FLARES = (stack) -> stack.is(ImmersiveWeaponsItemTagGroups.FLARES); @@ -32,7 +33,8 @@ protected static ItemStack getHeldAmmo(LivingEntity livingEntity, PredicateItemStack to look for - * @param entityLiving the LivingEntity to be searched + * @param livingEntity the LivingEntity to be searched * @return ItemStack */ - ItemStack findAmmo(ItemStack itemStack, LivingEntity entityLiving) { - Player playerEntity = (Player) entityLiving; + ItemStack findAmmo(ItemStack itemStack, LivingEntity livingEntity) { + Player playerEntity = (Player) livingEntity; if (!(itemStack.getItem() instanceof AbstractGunItem)) { return ItemStack.EMPTY; } else { - Predicate predicate = ((AbstractGunItem) itemStack.getItem()).getAmmoPredicate(); - ItemStack itemStack2 = AbstractGunItem.getHeldAmmo(playerEntity, predicate); - if (!itemStack2.isEmpty()) { - return itemStack2; + Predicate ammoPredicate = ((AbstractGunItem) itemStack.getItem()).getAmmoPredicate(); + ItemStack heldAmmo = AbstractGunItem.getHeldAmmo(playerEntity, ammoPredicate); + if (!heldAmmo.isEmpty()) { + return heldAmmo; } else { - predicate = ((AbstractGunItem) itemStack.getItem()).getInventoryAmmoPredicate(); + ammoPredicate = ((AbstractGunItem) itemStack.getItem()).getInventoryAmmoPredicate(); for (int i = 0; i < playerEntity.getInventory().getContainerSize(); ++i) { - ItemStack itemStack1 = playerEntity.getInventory().getItem(i); - if (predicate.test(itemStack1)) { - return itemStack1; + ItemStack ammoItem = playerEntity.getInventory().getItem(i); + if (ammoPredicate.test(ammoItem)) { + return ammoItem; } } @@ -67,76 +65,103 @@ ItemStack findAmmo(ItemStack itemStack, LivingEntity entityLiving) { * * @param itemStack the ItemStack being used * @param worldIn the World the entity is in - * @param entityLiving the LivingEntity releasing the item + * @param livingEntity the LivingEntity releasing the item * @param timeLeft the time left from charging */ @Override - public void releaseUsing(@NotNull ItemStack itemStack, @NotNull Level worldIn, @NotNull LivingEntity entityLiving, int timeLeft) { - if (entityLiving instanceof Player playerEntity) { - boolean flag = playerEntity.isCreative(); + public void releaseUsing(@NotNull ItemStack itemStack, @NotNull Level worldIn, @NotNull LivingEntity livingEntity, + int timeLeft) { + + if (livingEntity instanceof Player playerEntity) { + boolean isCreative = playerEntity.isCreative(); boolean misfire = false; - ItemStack itemStack1 = findAmmo(itemStack, entityLiving); + ItemStack ammo = findAmmo(itemStack, livingEntity); // Roll for misfire - if (itemStack1.getItem() == DeferredRegistryHandler.WOOD_MUSKET_BALL.get()) { - int randomNumber = GeneralUtilities.getRandomNumber(1, 10); - if (randomNumber <= 3) { + if (ammo.getItem() == DeferredRegistryHandler.WOOD_MUSKET_BALL.get()) { + if (GeneralUtilities.getRandomNumber(1, 10) <= 3) { misfire = true; - worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), getMisfireSound(), SoundSource.PLAYERS, 1.0F, 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); - if (!playerEntity.isCreative()) { - itemStack1.shrink(1); - if (itemStack1.isEmpty()) { - playerEntity.getInventory().removeItem(itemStack1); + worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), + getMisfireSound(), SoundSource.PLAYERS, 1.0F, + 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); + + if (!isCreative) { + ammo.shrink(1); + if (ammo.isEmpty()) { + playerEntity.getInventory().removeItem(ammo); } - itemStack.hurtAndBreak(5, playerEntity, (entity) -> entity.broadcastBreakEvent(entity.getUsedItemHand())); + itemStack.hurtAndBreak(5, playerEntity, (entity) -> + entity.broadcastBreakEvent(entity.getUsedItemHand())); } } - } - // Roll for misfire - if (itemStack1.getItem() == DeferredRegistryHandler.STONE_MUSKET_BALL.get()) { - int randomNumber = GeneralUtilities.getRandomNumber(1, 20); - if (randomNumber <= 3) { + } else if (ammo.getItem() == DeferredRegistryHandler.STONE_MUSKET_BALL.get()) { + if (GeneralUtilities.getRandomNumber(1, 20) <= 3) { misfire = true; - worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), getMisfireSound(), SoundSource.PLAYERS, 1.0F, 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); - if (!playerEntity.isCreative()) { - itemStack1.shrink(1); - if (itemStack1.isEmpty()) { - playerEntity.getInventory().removeItem(itemStack1); + worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), + getMisfireSound(), SoundSource.PLAYERS, 1.0F, + 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); + + if (!isCreative) { + ammo.shrink(1); + if (ammo.isEmpty()) { + playerEntity.getInventory().removeItem(ammo); } - itemStack.hurtAndBreak(5, playerEntity, (entity) -> entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); + itemStack.hurtAndBreak(5, playerEntity, (entity) -> + entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); } } } - int i = getUseDuration(itemStack); - i = ForgeEventFactory.onArrowLoose(itemStack, worldIn, playerEntity, i, !itemStack1.isEmpty() || flag); - if (i < 0) return; + int useDuration = getUseDuration(itemStack); + useDuration = ForgeEventFactory.onArrowLoose(itemStack, worldIn, playerEntity, useDuration, !ammo.isEmpty() || isCreative); + if (useDuration < 0) { + return; + } - if (!itemStack1.isEmpty() || flag || !misfire) { - if (itemStack1.isEmpty()) { - itemStack1 = new ItemStack(defaultAmmo()); + // Check if the ammunition stack is not empty, if the player is in creative mode, + // or that a misfire hasn't occurred + if (!ammo.isEmpty() || isCreative || !misfire) { + // If the ammunition stack is empty, set it to the default. + // This happens when the player is in creative mode but has + // no ammunition. + if (ammo.isEmpty()) { + ammo = new ItemStack(defaultAmmo()); } if (!misfire) { - boolean flag1 = playerEntity.isCreative() || (itemStack1.getItem() instanceof AbstractArrowItem && ((AbstractArrowItem) itemStack1.getItem()).isInfinite(itemStack1, itemStack, playerEntity)); if (!worldIn.isClientSide) { - AbstractArrowItem customArrowItem = (AbstractArrowItem) (itemStack1.getItem() instanceof AbstractArrowItem ? itemStack1.getItem() : defaultAmmo()); - AbstractArrow abstractArrowEntity = customArrowItem.createArrow(worldIn, itemStack1, playerEntity); - abstractArrowEntity.shootFromRotation(playerEntity, playerEntity.xRot, playerEntity.yRot, 0.0F, 3.0F, 1.0F); - abstractArrowEntity.setCritArrow(true); + AbstractArrowItem customArrowItem = (AbstractArrowItem) (ammo.getItem() instanceof AbstractArrowItem + ? ammo.getItem() : defaultAmmo()); - itemStack.hurtAndBreak(1, playerEntity, (entity) -> entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); + AbstractArrow abstractBulletEntity = customArrowItem.createArrow(worldIn, ammo, playerEntity); + abstractBulletEntity.shootFromRotation(playerEntity, playerEntity.xRot, playerEntity.yRot, + 0.0F, 3.0F, 1.0F); - worldIn.addFreshEntity(abstractArrowEntity); + // Roll for random crits + if (GeneralUtilities.getRandomNumber(0f, 1f) <= 0.1f) { + abstractBulletEntity.setCritArrow(true); + } + + abstractBulletEntity.setOwner(playerEntity); + abstractBulletEntity.pickup = Pickup.DISALLOWED; + + itemStack.hurtAndBreak(1, playerEntity, (entity) -> + entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); + + worldIn.addFreshEntity(abstractBulletEntity); } - worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), getFireSound(), SoundSource.PLAYERS, 1.0F, 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); - if (!flag1 && !playerEntity.isCreative()) { - itemStack1.shrink(1); - if (itemStack1.isEmpty()) { - playerEntity.getInventory().removeItem(itemStack1); + worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), + getFireSound(), SoundSource.PLAYERS, 1.0F, + 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); + + if (!isCreative) { + ammo.shrink(1); + if (ammo.isEmpty()) { + playerEntity.getInventory().removeItem(ammo); } } + if (!playerEntity.isCreative()) { playerEntity.getCooldowns().addCooldown(this, 60); } @@ -154,18 +179,23 @@ public void releaseUsing(@NotNull ItemStack itemStack, @NotNull Level worldIn, @ * @return ActionResult extending ItemStack */ @Override - public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { - ItemStack itemstack = playerIn.getItemInHand(handIn); - boolean flag = !findAmmo(itemstack, playerIn).isEmpty(); + public @NotNull InteractionResultHolder use(@NotNull Level worldIn, Player playerIn, + @NotNull InteractionHand handIn) { - InteractionResultHolder ret = ForgeEventFactory.onArrowNock(itemstack, worldIn, playerIn, handIn, flag); - if (ret != null) return ret; + ItemStack itemInHand = playerIn.getItemInHand(handIn); + boolean hasAmmo = !findAmmo(itemInHand, playerIn).isEmpty(); + + InteractionResultHolder resultHolder = ForgeEventFactory.onArrowNock(itemInHand, worldIn, playerIn, + handIn, hasAmmo); + if (resultHolder != null) { + return resultHolder; + } - if (!playerIn.isCreative() && !flag) { - return InteractionResultHolder.fail(itemstack); + if (!playerIn.isCreative() && !hasAmmo) { + return InteractionResultHolder.fail(itemInHand); } else { playerIn.startUsingItem(handIn); - return InteractionResultHolder.consume(itemstack); + return InteractionResultHolder.consume(itemInHand); } } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/gun/SimpleShotgunItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/gun/SimpleShotgunItem.java index 325224e10..82e20927c 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/gun/SimpleShotgunItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/gun/SimpleShotgunItem.java @@ -1,6 +1,5 @@ package com.anonymoushacker1279.immersiveweapons.item.projectile.gun; -import com.anonymoushacker1279.immersiveweapons.entity.projectile.AbstractBulletEntity; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.item.projectile.arrow.AbstractArrowItem; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; @@ -8,6 +7,7 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.AbstractArrow.Pickup; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -32,82 +32,111 @@ public SimpleShotgunItem(Properties properties) { * * @param itemStack the ItemStack being used * @param worldIn the World the entity is in - * @param entityLiving the LivingEntity releasing the item + * @param livingEntity the LivingEntity releasing the item * @param timeLeft the time left from charging */ @Override - public void releaseUsing(@NotNull ItemStack itemStack, @NotNull Level worldIn, @NotNull LivingEntity entityLiving, int timeLeft) { - if (entityLiving instanceof Player playerEntity) { - boolean flag = playerEntity.isCreative(); + public void releaseUsing(@NotNull ItemStack itemStack, @NotNull Level worldIn, @NotNull LivingEntity livingEntity, + int timeLeft) { + + if (livingEntity instanceof Player playerEntity) { + boolean isCreative = playerEntity.isCreative(); boolean misfire = false; - ItemStack itemStack1 = findAmmo(itemStack, entityLiving); + ItemStack ammo = findAmmo(itemStack, livingEntity); // Determine number of bullets to fire - int bulletsToFire = getBulletsToFire(itemStack1); + int bulletsToFire = isCreative ? 4 : getBulletsToFire(ammo); // Roll for misfire - if (itemStack1.getItem() == DeferredRegistryHandler.WOOD_MUSKET_BALL.get()) { - int randomNumber = GeneralUtilities.getRandomNumber(1, 10); - if (randomNumber <= 3) { + if (ammo.getItem() == DeferredRegistryHandler.WOOD_MUSKET_BALL.get()) { + if (GeneralUtilities.getRandomNumber(1, 10) <= 3) { misfire = true; - worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), getMisfireSound(), SoundSource.PLAYERS, 1.0F, 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); - if (!playerEntity.isCreative()) { - itemStack1.shrink(bulletsToFire); - if (itemStack1.isEmpty()) { - playerEntity.getInventory().removeItem(itemStack1); + worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), + getMisfireSound(), SoundSource.PLAYERS, 1.0F, + 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); + + if (!isCreative) { + ammo.shrink(bulletsToFire); + if (ammo.isEmpty()) { + playerEntity.getInventory().removeItem(ammo); } - itemStack.hurtAndBreak(5, playerEntity, (entity) -> entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); + itemStack.hurtAndBreak(5, playerEntity, (entity) -> + entity.broadcastBreakEvent(entity.getUsedItemHand())); } } - } - // Roll for misfire - if (itemStack1.getItem() == DeferredRegistryHandler.STONE_MUSKET_BALL.get()) { - int randomNumber = GeneralUtilities.getRandomNumber(1, 20); - if (randomNumber <= 3) { + } else if (ammo.getItem() == DeferredRegistryHandler.STONE_MUSKET_BALL.get()) { + if (GeneralUtilities.getRandomNumber(1, 20) <= 3) { misfire = true; - worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), getMisfireSound(), SoundSource.PLAYERS, 1.0F, 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); - if (!playerEntity.isCreative()) { - itemStack1.shrink(bulletsToFire); - if (itemStack1.isEmpty()) { - playerEntity.getInventory().removeItem(itemStack1); + worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), + getMisfireSound(), SoundSource.PLAYERS, 1.0F, + 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); + + if (!isCreative) { + ammo.shrink(bulletsToFire); + if (ammo.isEmpty()) { + playerEntity.getInventory().removeItem(ammo); } - itemStack.hurtAndBreak(5, playerEntity, (entity) -> entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); + itemStack.hurtAndBreak(5, playerEntity, (entity) -> + entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); } } } - int i = getUseDuration(itemStack); - i = ForgeEventFactory.onArrowLoose(itemStack, worldIn, playerEntity, i, !itemStack1.isEmpty() || flag); - if (i < 0) return; + int useDuration = getUseDuration(itemStack); + useDuration = ForgeEventFactory.onArrowLoose(itemStack, worldIn, playerEntity, useDuration, !ammo.isEmpty() || isCreative); + if (useDuration < 0) { + return; + } - if (!itemStack1.isEmpty() || flag || !misfire) { - if (itemStack1.isEmpty()) { - itemStack1 = new ItemStack(defaultAmmo()); + // Check if the ammunition stack is not empty, if the player is in creative mode, + // or that a misfire hasn't occurred + if (!ammo.isEmpty() || isCreative || !misfire) { + // If the ammunition stack is empty, set it to the default. + // This happens when the player is in creative mode but has + // no ammunition. + if (ammo.isEmpty()) { + ammo = new ItemStack(defaultAmmo()); } if (!misfire) { - boolean flag1 = playerEntity.isCreative() || (itemStack1.getItem() instanceof AbstractArrowItem && ((AbstractArrowItem) itemStack1.getItem()).isInfinite(itemStack1, itemStack, playerEntity)); if (!worldIn.isClientSide) { - for (int iterator = 0; iterator < bulletsToFire; ++iterator) { - AbstractArrowItem customArrowItem = (AbstractArrowItem) (itemStack1.getItem() instanceof AbstractArrowItem ? itemStack1.getItem() : defaultAmmo()); - AbstractBulletEntity abstractBulletEntity = (AbstractBulletEntity) customArrowItem.createArrow(worldIn, itemStack1, playerEntity); - abstractBulletEntity.setKnockback(3); - abstractBulletEntity.shootFromRotation(playerEntity, playerEntity.xRot + GeneralUtilities.getRandomNumber(-5.0f, 5.0f), playerEntity.yRot + GeneralUtilities.getRandomNumber(-5.0f, 5.0f), 0.0F, 3.0F, 1.0F); - abstractBulletEntity.setCritArrow(true); + AbstractArrowItem customArrowItem = (AbstractArrowItem) (ammo.getItem() instanceof AbstractArrowItem + ? ammo.getItem() : defaultAmmo()); + + for (int i = 0; i < bulletsToFire; ++i) { + AbstractArrow abstractBulletEntity = customArrowItem.createArrow(worldIn, ammo, playerEntity); + abstractBulletEntity.shootFromRotation(playerEntity, + playerEntity.xRot + GeneralUtilities.getRandomNumber(-5.0f, 5.0f), + playerEntity.yRot + GeneralUtilities.getRandomNumber(-5.0f, 5.0f), + 0.0F, 3.0F, 1.0F); + + // Roll for random crits + if (GeneralUtilities.getRandomNumber(0f, 1f) <= 0.1f) { + abstractBulletEntity.setCritArrow(true); + } + abstractBulletEntity.setOwner(playerEntity); abstractBulletEntity.pickup = Pickup.DISALLOWED; + abstractBulletEntity.setKnockback(3); + + itemStack.hurtAndBreak(1, playerEntity, (entity) -> + entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); + worldIn.addFreshEntity(abstractBulletEntity); } - itemStack.hurtAndBreak(1, playerEntity, (entity) -> entity.broadcastBreakEvent(playerEntity.getUsedItemHand())); } - worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), getFireSound(), SoundSource.PLAYERS, 1.0F, 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 0.5F)); - if (!flag1 && !playerEntity.isCreative()) { - itemStack1.shrink(bulletsToFire); - if (itemStack1.isEmpty()) { - playerEntity.getInventory().removeItem(itemStack1); + worldIn.playSound(null, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), + getFireSound(), SoundSource.PLAYERS, 1.0F, + 1.0F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 1.2F) + 0.5F); + + if (!isCreative) { + ammo.shrink(bulletsToFire); + if (ammo.isEmpty()) { + playerEntity.getInventory().removeItem(ammo); } } + if (!playerEntity.isCreative()) { playerEntity.getCooldowns().addCooldown(this, 100); } diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/throwable/MolotovItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/throwable/MolotovItem.java index b3091f455..95b1bed81 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/throwable/MolotovItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/throwable/MolotovItem.java @@ -33,20 +33,23 @@ public MolotovItem(Properties properties) { */ @Override public @NotNull InteractionResultHolder use(Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { - ItemStack itemstack = playerIn.getItemInHand(handIn); - worldIn.playLocalSound(playerIn.getX(), playerIn.getY(), playerIn.getZ(), DeferredRegistryHandler.GENERIC_WHOOSH.get(), SoundSource.NEUTRAL, 0.5F, 0.4F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 0.8F), false); + ItemStack itemInHand = playerIn.getItemInHand(handIn); + worldIn.playLocalSound(playerIn.getX(), playerIn.getY(), playerIn.getZ(), + DeferredRegistryHandler.GENERIC_WHOOSH.get(), SoundSource.NEUTRAL, + 0.5F, 0.4F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 0.8F), false); + if (!worldIn.isClientSide) { MolotovEntity molotovEntity = new MolotovEntity(worldIn, playerIn); - molotovEntity.setItem(itemstack); - molotovEntity.shootFromRotation(playerIn, playerIn.xRot, playerIn.yRot, 0.01F, 1F, 1.0F); + molotovEntity.setItem(itemInHand); + molotovEntity.shootFromRotation(playerIn, playerIn.xRot, playerIn.yRot, -20.0F, 0.5F, 1.0F); worldIn.addFreshEntity(molotovEntity); } if (!playerIn.isCreative()) { - itemstack.shrink(1); - playerIn.getCooldowns().addCooldown(this, 100); // Helps to prevent spamming + itemInHand.shrink(1); + playerIn.getCooldowns().addCooldown(this, 100); } - return InteractionResultHolder.sidedSuccess(itemstack, worldIn.isClientSide()); + return InteractionResultHolder.sidedSuccess(itemInHand, worldIn.isClientSide()); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/throwable/SmokeBombItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/throwable/SmokeBombItem.java index 1f6538365..55f64baf9 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/throwable/SmokeBombItem.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/projectile/throwable/SmokeBombItem.java @@ -36,20 +36,24 @@ public SmokeBombItem(Properties properties, int color) { */ @Override public @NotNull InteractionResultHolder use(Level worldIn, Player playerIn, @NotNull InteractionHand handIn) { - ItemStack itemstack = playerIn.getItemInHand(handIn); - worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), DeferredRegistryHandler.GENERIC_WHOOSH.get(), SoundSource.NEUTRAL, 0.5F, 0.4F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 0.8F)); + ItemStack itemInHand = playerIn.getItemInHand(handIn); + worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), + DeferredRegistryHandler.GENERIC_WHOOSH.get(), SoundSource.NEUTRAL, + 0.5F, 0.4F / (GeneralUtilities.getRandomNumber(0.2f, 0.6f) + 0.8F)); + if (!worldIn.isClientSide) { SmokeBombEntity.setColor(color); SmokeBombEntity smokeBombEntity = new SmokeBombEntity(worldIn, playerIn); - smokeBombEntity.setItem(itemstack); - smokeBombEntity.shootFromRotation(playerIn, playerIn.xRot, playerIn.yRot, 0.0F, 1.5F, 1.0F); + smokeBombEntity.setItem(itemInHand); + smokeBombEntity.shootFromRotation(playerIn, playerIn.xRot, playerIn.yRot, -20.0F, 0.5F, 1.0F); worldIn.addFreshEntity(smokeBombEntity); } + if (!playerIn.isCreative()) { - itemstack.shrink(1); - playerIn.getCooldowns().addCooldown(this, 100); // Helps to prevent spamming, mostly to reduce the total particles in an area + itemInHand.shrink(1); + playerIn.getCooldowns().addCooldown(this, 100); } - return InteractionResultHolder.sidedSuccess(itemstack, worldIn.isClientSide()); + return InteractionResultHolder.sidedSuccess(itemInHand, worldIn.isClientSide()); } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/item/utility/FuelItem.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/utility/FuelItem.java new file mode 100644 index 000000000..7526f0f21 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/item/utility/FuelItem.java @@ -0,0 +1,22 @@ +package com.anonymoushacker1279.immersiveweapons.item.utility; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; + +import javax.annotation.Nullable; + +public class FuelItem extends Item { + + private final int burnTime; + + public FuelItem(Properties properties, int burnTime) { + super(properties); + this.burnTime = burnTime; + } + + @Override + public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType) { + return burnTime; + } +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/potion/BleedingEffect.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/potion/BleedingEffect.java index e73b2d635..8473df7c9 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/potion/BleedingEffect.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/potion/BleedingEffect.java @@ -1,28 +1,13 @@ package com.anonymoushacker1279.immersiveweapons.potion; -import com.anonymoushacker1279.immersiveweapons.client.particle.blood.BloodParticleData; +import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.anonymoushacker1279.immersiveweapons.util.GeneralUtilities; -import com.anonymoushacker1279.immersiveweapons.util.PacketHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.core.BlockPos; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.NetworkEvent.Context; -import net.minecraftforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; -import java.awt.*; -import java.util.function.Supplier; - public class BleedingEffect extends MobEffect { public final DamageSource damageSource = new DamageSource("immersiveweapons.bleeding").bypassArmor(); @@ -53,10 +38,19 @@ public void applyEffectTick(@NotNull LivingEntity livingEntity, int amplifier) { } else { cooldownTicks--; } - PacketHandler.INSTANCE.send(PacketDistributor.TRACKING_CHUNK.with(() -> livingEntity.level.getChunkAt(livingEntity.blockPosition())), new BleedingEffectPacketHandler(livingEntity.blockPosition(), livingEntity.position(), livingEntity.getEyeHeight())); + } else { + livingEntity.level.addParticle(DeferredRegistryHandler.BLOOD_PARTICLE.get(), + livingEntity.position().x, livingEntity.position().y + GeneralUtilities.getRandomNumber(0.3d, livingEntity.getEyeHeight()), + livingEntity.position().z, GeneralUtilities.getRandomNumber(-0.03d, 0.03d), + GeneralUtilities.getRandomNumber(-0.1d, -0.08d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d)); } } + @Override + public boolean isBeneficial() { + return false; + } + /** * Check if the duration effect is ticking. * @@ -68,105 +62,4 @@ public void applyEffectTick(@NotNull LivingEntity livingEntity, int amplifier) { public boolean isDurationEffectTick(int duration, int amplifier) { return true; } - - public record BleedingEffectPacketHandler(BlockPos blockPos, - Vec3 vector3d, float eyeLevel) { - - /** - * Constructor for BleedingEffectPacketHandler. - * - * @param blockPos the BlockPos the packet came from - * @param vector3d the Vector3d of the entity position - * @param eyeLevel the eye level of the entity - */ - public BleedingEffectPacketHandler { - } - - /** - * Encodes a packet - * - * @param msg the BleedingEffectPacketHandler message being sent - * @param packetBuffer the PacketBuffer containing packet data - */ - public static void encode(BleedingEffectPacketHandler msg, FriendlyByteBuf packetBuffer) { - packetBuffer.writeBlockPos(msg.blockPos); - packetBuffer.writeDouble(msg.vector3d.x).writeDouble(msg.vector3d.y).writeDouble(msg.vector3d.z); - packetBuffer.writeFloat(msg.eyeLevel); - } - - /** - * Decodes a packet - * - * @param packetBuffer the PacketBuffer containing packet data - * @return BleedingEffectPacketHandler - */ - public static BleedingEffectPacketHandler decode(FriendlyByteBuf packetBuffer) { - return new BleedingEffectPacketHandler(packetBuffer.readBlockPos(), new Vec3(packetBuffer.readDouble(), packetBuffer.readDouble(), packetBuffer.readDouble()), packetBuffer.readFloat()); - } - - /** - * Handles an incoming packet, by sending it to the client/server - * - * @param msg the BleedingEffectPacketHandler message being sent - * @param contextSupplier the Supplier providing context - */ - public static void handle(BleedingEffectPacketHandler msg, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> handleOnClient(msg))); - context.setPacketHandled(true); - } - - /** - * Runs specifically on the client, when a packet is received - * - * @param msg the BleedingEffectPacketHandler message being sent - */ - @OnlyIn(Dist.CLIENT) - private static void handleOnClient(BleedingEffectPacketHandler msg) { - Minecraft minecraft = Minecraft.getInstance(); - if (minecraft.level != null) { - minecraft.level.addParticle(makeParticle(), msg.vector3d.x, msg.vector3d.y + GeneralUtilities.getRandomNumber(0.3d, msg.eyeLevel), msg.vector3d.z, GeneralUtilities.getRandomNumber(-0.03d, 0.03d), GeneralUtilities.getRandomNumber(-0.1d, -0.08d), GeneralUtilities.getRandomNumber(-0.03d, 0.03d)); - } - } - - /** - * Create a particle. - * - * @return IParticleData - */ - private static ParticleOptions makeParticle() { - Color tint = getTint(GeneralUtilities.getRandomNumber(0, 2)); - double diameter = getDiameter(GeneralUtilities.getRandomNumber(0.07d, 0.1d)); - - return new BloodParticleData(tint, diameter); - } - - /** - * Get the particle diameter. - * - * @param random a random number - * @return double - */ - private static double getDiameter(double random) { - final double MIN_DIAMETER = 0.07; - final double MAX_DIAMETER = 0.1; - return MIN_DIAMETER + (MAX_DIAMETER - MIN_DIAMETER) * random; - } - - /** - * Tint a particle. - * - * @param random a random number - * @return Color - */ - private static Color getTint(int random) { - Color[] tints = { - new Color(1.00f, 0.25f, 0.25f), // tint (red) - new Color(1.00f, 0.30f, 0.25f), // off-red - new Color(1.00f, 0.25f, 0.30f), // off-red 2 - }; - - return tints[random]; - } - } } \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CreativeTab.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CreativeTab.java new file mode 100644 index 000000000..986ca6fc8 --- /dev/null +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CreativeTab.java @@ -0,0 +1,29 @@ +package com.anonymoushacker1279.immersiveweapons.util; + +import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class CreativeTab extends CreativeModeTab { + + /** + * Constructor for CreativeTabSorter. + * + * @param label the tab label + */ + public CreativeTab(String label) { + super(label); + } + + /** + * Set the tab icon. + * + * @return ItemStack + */ + @Override + public @NotNull ItemStack makeIcon() { + return new ItemStack(DeferredRegistryHandler.TESLA_SWORD.get()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CreativeTabSorter.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CreativeTabSorter.java deleted file mode 100644 index 1868ec2af..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CreativeTabSorter.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.util; - -import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import net.minecraft.core.NonNullList; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -public class CreativeTabSorter extends CreativeModeTab { - - /** - * Constructor for CreativeTabSorter. - * - * @param label the tab label - */ - public CreativeTabSorter(String label) { - super(label); - } - - /** - * Fill the item list with the proper ordering. - * - * @param itemStack the NonNullList extending ItemStack - */ - @Override - public void fillItemList(@NotNull NonNullList itemStack) { - List items = new ArrayList<>(1); - DeferredRegistryHandler.ITEMS.getEntries().stream().map(RegistryObject::get).forEach(items::add); - - for (Item item : items) { - item.fillItemCategory(this, itemStack); - } - } - - /** - * Set the tab icon. - * - * @return ItemStack - */ - @Override - public @NotNull ItemStack makeIcon() { - return new ItemStack(DeferredRegistryHandler.TESLA_SWORD.get()); - } - -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomArmorMaterials.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomArmorMaterials.java deleted file mode 100644 index 3cc7a9556..000000000 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/CustomArmorMaterials.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.anonymoushacker1279.immersiveweapons.util; - -import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ArmorMaterial; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Supplier; - -public enum CustomArmorMaterials implements ArmorMaterial { - - MOLTEN("molten", 39, new int[]{5, 6, 9, 4}, 15, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.5F, () -> Ingredient.of(DeferredRegistryHandler.MOLTEN_PLATE.get()), 0.12F), - COPPER("copper", 15, new int[]{1, 4, 5, 1}, 9, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, () -> Ingredient.of(Items.COPPER_INGOT), 0.0F), - TESLA("tesla", 42, new int[]{7, 8, 11, 6}, 20, SoundEvents.ARMOR_EQUIP_GOLD, 3.0F, () -> Ingredient.of(DeferredRegistryHandler.TESLA_INGOT.get()), 0.05F), - COBALT("cobalt", 16, new int[]{3, 5, 6, 3}, 10, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, () -> Ingredient.of(DeferredRegistryHandler.COBALT_INGOT.get()), 0.0F), - VENTUS("ventus", 39, new int[]{5, 6, 9, 5}, 14, SoundEvents.ARMOR_EQUIP_NETHERITE, 2.5F, () -> Ingredient.of(DeferredRegistryHandler.VENTUS_SHARD.get()), 0.02F); - - static final int[] MAX_DAMAGE_ARRAY = new int[]{13, 15, 16, 11}; - private final String name; - private final int maxDamageFactor; - private final int[] damageReductionAmountArray; - private final int enchantability; - private final SoundEvent soundEvent; - private final float toughness; - private final Supplier repairMaterial; - private final float knockbackResistance; - - /** - * Constructor for CustomArmorMaterials. - * - * @param nameIn the material name - * @param maxDamageFactorIn the max damage factor - * @param damageReductionAmountsIn the reduction amount - * @param enchantabilityIn the enchantability level - * @param equipSoundIn the equipping SoundEvent - * @param toughnessIn the toughness level - * @param repairMaterialSupplier the Supplier extending Ingredient for repairs - * @param knockbackResistanceIn the knockback resistance - */ - CustomArmorMaterials(String nameIn, int maxDamageFactorIn, int[] damageReductionAmountsIn, int enchantabilityIn, SoundEvent equipSoundIn, float toughnessIn, Supplier repairMaterialSupplier, float knockbackResistanceIn) { - name = nameIn; - maxDamageFactor = maxDamageFactorIn; - damageReductionAmountArray = damageReductionAmountsIn; - enchantability = enchantabilityIn; - soundEvent = equipSoundIn; - toughness = toughnessIn; - repairMaterial = repairMaterialSupplier; - knockbackResistance = knockbackResistanceIn; - } - - /** - * Get durability for a slot. - * - * @param slotIn the EquipmentSlotType - * @return int - */ - @Override - public int getDurabilityForSlot(EquipmentSlot slotIn) { - return MAX_DAMAGE_ARRAY[slotIn.getIndex()] * maxDamageFactor; - } - - /** - * Get the defense for a slot. - * - * @param slotIn the EquipmentSlotType - * @return int - */ - @Override - public int getDefenseForSlot(EquipmentSlot slotIn) { - return damageReductionAmountArray[slotIn.getIndex()]; - } - - /** - * Get the enchantment value. - * - * @return int - */ - @Override - public int getEnchantmentValue() { - return enchantability; - } - - /** - * Get the equipping sound. - * - * @return SoundEvent - */ - @Override - public @NotNull SoundEvent getEquipSound() { - return soundEvent; - } - - /** - * Get the repair ingredient. - * - * @return Ingredient - */ - @Override - public @NotNull Ingredient getRepairIngredient() { - return repairMaterial.get(); - } - - /** - * Get the name. - * - * @return String - */ - @Override - @OnlyIn(Dist.CLIENT) - public @NotNull String getName() { - return name; - } - - /** - * Get the toughness. - * - * @return float - */ - @Override - public float getToughness() { - return toughness; - } - - /** - * Get the knockback resistance. - * - * @return float - */ - @Override - public float getKnockbackResistance() { - return knockbackResistance; - } -} \ No newline at end of file diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/GeneralUtilities.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/util/GeneralUtilities.java index 23da96ed3..1311a1632 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/util/GeneralUtilities.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/util/GeneralUtilities.java @@ -4,7 +4,11 @@ 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; @@ -60,4 +64,17 @@ public static int getRandomNumber(int min, int max) { public static StainedGlassBlock createStainedGlassFromColor(DyeColor color, Properties properties) { return new StainedGlassBlock(color, properties); } + + public static boolean hasFeatherFalling(LivingEntity entity) { + ItemStack boots = entity.getArmorSlots().iterator().next(); + return EnchantmentHelper.getEnchantments(boots).containsKey(Enchantments.FALL_PROTECTION); + } + + public static int getFeatherFallingLevel(LivingEntity entity) { + ItemStack boots = entity.getArmorSlots().iterator().next(); + if (hasFeatherFalling(entity)) { + return EnchantmentHelper.getEnchantments(boots).getOrDefault(Enchantments.FALL_PROTECTION, 0); + } + return 0; + } } \ No newline at end of file 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 21f36588c..fe2403e51 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,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.world.level.levelgen; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +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; @@ -28,12 +28,12 @@ public class OreGeneratorHandler { public static PlacedFeature DEEPSLATE_SULFUR_ORE_FEATURE; public static PlacedFeature DEEPSLATE_COBALT_ORE_FEATURE; - static final List MOLTEN_ORE_CONFIG = ServerConfig.MOLTEN_ORE_CONFIG.get(); - static final List NETHER_SULFUR_ORE_CONFIG = ServerConfig.NETHER_SULFUR_ORE_CONFIG.get(); - static final List SULFUR_ORE_CONFIG = ServerConfig.SULFUR_ORE_CONFIG.get(); - static final List COBALT_ORE_CONFIG = ServerConfig.COBALT_ORE_CONFIG.get(); - static final List DEEPSLATE_SULFUR_ORE_CONFIG = ServerConfig.DEEPSLATE_SULFUR_ORE_CONFIG.get(); - static final List DEEPSLATE_COBALT_ORE_CONFIG = ServerConfig.DEEPSLATE_COBALT_ORE_CONFIG.get(); + 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. 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 index cbc73c6ba..de850b9ab 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/Structures.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/world/level/levelgen/Structures.java @@ -1,7 +1,7 @@ package com.anonymoushacker1279.immersiveweapons.world.level.levelgen; import com.anonymoushacker1279.immersiveweapons.ImmersiveWeapons; -import com.anonymoushacker1279.immersiveweapons.config.ServerConfig; +import com.anonymoushacker1279.immersiveweapons.config.CommonConfig; import com.anonymoushacker1279.immersiveweapons.init.DeferredRegistryHandler; import com.google.common.collect.*; import net.minecraft.core.Registry; @@ -24,6 +24,7 @@ import net.minecraftforge.event.world.WorldEvent; import java.util.*; +import java.util.Map.Entry; public class Structures { @@ -57,24 +58,24 @@ public class Structures { * 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); + 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); } /** @@ -84,64 +85,64 @@ public static void setupStructures() { setupStructure( DeferredRegistryHandler.ABANDONED_FACTORY_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_ABANDONED_FACTORY_DISTANCE.get(), - ServerConfig.MIN_ABANDONED_FACTORY_DISTANCE.get(), + CommonConfig.MAX_ABANDONED_FACTORY_DISTANCE.get(), + CommonConfig.MIN_ABANDONED_FACTORY_DISTANCE.get(), 959874384), true); setupStructure( DeferredRegistryHandler.BEAR_TRAP_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_BEAR_TRAP_DISTANCE.get(), - ServerConfig.MIN_BEAR_TRAP_DISTANCE.get(), + CommonConfig.MAX_BEAR_TRAP_DISTANCE.get(), + CommonConfig.MIN_BEAR_TRAP_DISTANCE.get(), 794532168), false); setupStructure( DeferredRegistryHandler.CAMPSITE_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_CAMPSITE_DISTANCE.get(), - ServerConfig.MIN_CAMPSITE_DISTANCE.get(), + CommonConfig.MAX_CAMPSITE_DISTANCE.get(), + CommonConfig.MIN_CAMPSITE_DISTANCE.get(), 671249835), true); setupStructure( DeferredRegistryHandler.CLOUD_ISLAND_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_CLOUD_ISLAND_DISTANCE.get(), - ServerConfig.MIN_CLOUD_ISLAND_DISTANCE.get(), + CommonConfig.MAX_CLOUD_ISLAND_DISTANCE.get(), + CommonConfig.MIN_CLOUD_ISLAND_DISTANCE.get(), 349821657), false); setupStructure( DeferredRegistryHandler.LANDMINE_TRAP_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_LANDMINE_TRAP_DISTANCE.get(), - ServerConfig.MIN_LANDMINE_TRAP_DISTANCE.get(), + CommonConfig.MAX_LANDMINE_TRAP_DISTANCE.get(), + CommonConfig.MIN_LANDMINE_TRAP_DISTANCE.get(), 959874384), true); setupStructure( DeferredRegistryHandler.OUTHOUSE_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_OUTHOUSE_DISTANCE.get(), - ServerConfig.MIN_OUTHOUSE_DISTANCE.get(), + CommonConfig.MAX_OUTHOUSE_DISTANCE.get(), + CommonConfig.MIN_OUTHOUSE_DISTANCE.get(), 845721365), false); setupStructure( DeferredRegistryHandler.PITFALL_TRAP_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_PITFALL_TRAP_DISTANCE.get(), - ServerConfig.MIN_PITFALL_TRAP_DISTANCE.get(), + CommonConfig.MAX_PITFALL_TRAP_DISTANCE.get(), + CommonConfig.MIN_PITFALL_TRAP_DISTANCE.get(), 875412395), false); setupStructure( DeferredRegistryHandler.UNDERGROUND_BUNKER_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_UNDERGROUND_BUNKER_DISTANCE.get(), - ServerConfig.MIN_UNDERGROUND_BUNKER_DISTANCE.get(), + CommonConfig.MAX_UNDERGROUND_BUNKER_DISTANCE.get(), + CommonConfig.MIN_UNDERGROUND_BUNKER_DISTANCE.get(), 548796135), false); setupStructure( DeferredRegistryHandler.WATER_TOWER_STRUCTURE.get(), new StructureFeatureConfiguration( - ServerConfig.MAX_WATER_TOWER_DISTANCE.get(), - ServerConfig.MIN_WATER_TOWER_DISTANCE.get(), + CommonConfig.MAX_WATER_TOWER_DISTANCE.get(), + CommonConfig.MIN_WATER_TOWER_DISTANCE.get(), 246975135), true); } @@ -179,7 +180,8 @@ ImmutableMap., StructureFeatureConfiguration> builder() // Add the structure to all the noise generator settings BuiltinRegistries.NOISE_GENERATOR_SETTINGS.entrySet().forEach(settings -> { - Map, StructureFeatureConfiguration> structureMap = settings.getValue().structureSettings().structureConfig(); + Map, StructureFeatureConfiguration> structureMap = settings.getValue() + .structureSettings().structureConfig(); // Be careful with mods that make the structure map immutable (like datapacks do) if (structureMap instanceof ImmutableMap) { @@ -218,8 +220,8 @@ public static void addDimensionalSpacing(WorldEvent.Load event) { */ // Create a mutable map, which biomes will be added to for now - HashMap, HashMultimap, ResourceKey>> structureToMultiMap = - new HashMap<>(1); + 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 : @@ -254,8 +256,9 @@ public static void addDimensionalSpacing(WorldEvent.Load event) { } // Grab the map that holds what ConfigureStructures a structure has and what biomes it can spawn in. - ImmutableMap.Builder, ImmutableMultimap, ResourceKey>> tempStructureToMultiMap = - ImmutableMap.builder(); + ImmutableMap.Builder, ImmutableMultimap, + ResourceKey>> tempStructureToMultiMap = ImmutableMap.builder(); + worldStructureConfig.configuredStructures.entrySet() .stream() .filter(entry -> !structureToMultiMap.containsKey(entry.getKey())) @@ -280,17 +283,24 @@ private static void associateBiomeToConfiguredStructure(Map, 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), - BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getId(configuredStructureToBiomeMultiMap.entries() - .stream() - .filter(e -> e.getValue() == biomeRegistryKey) - .findFirst() - .get().getKey()), + keyID, biomeRegistryKey ); } else { @@ -301,7 +311,9 @@ private static void associateBiomeToConfiguredStructure(Map, /** * 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) { + public static PieceGeneratorSupplier.Context + createContextWithConfig(PieceGeneratorSupplier.Context context, JigsawConfiguration newConfig) { + return new PieceGeneratorSupplier.Context<>( context.chunkGenerator(), context.biomeSource(), diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 19839f97e..79e0e4524 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -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.18.x-dev/update.json" +updateJSONURL = "https://raw.githubusercontent.com/AnonymousHacker1279/ImmersiveWeapons/1.14.0-update-indev/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 @@ -28,4 +28,11 @@ modId = "minecraft" mandatory = true versionRange = "[1.18.1,1.19)" ordering = "NONE" +side = "BOTH" + +[[dependencies.immersiveweapons]] +modId = "patchouli" +mandatory = false +versionRange = "[1.18.1-64,)" +ordering = "NONE" side = "BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/blockstates/wooden_table.json b/src/main/resources/assets/immersiveweapons/blockstates/wooden_table.json deleted file mode 100644 index a1679acd7..000000000 --- a/src/main/resources/assets/immersiveweapons/blockstates/wooden_table.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "immersiveweapons:block/wooden_table" - } - } -} \ 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 e6157ea88..f49fca573 100644 --- a/src/main/resources/assets/immersiveweapons/lang/en_us.json +++ b/src/main/resources/assets/immersiveweapons/lang/en_us.json @@ -17,7 +17,6 @@ "item.immersiveweapons.copper_axe": "Copper Axe", "item.immersiveweapons.copper_shovel": "Copper Shovel", "item.immersiveweapons.copper_hoe": "Copper Hoe", - "item.immersiveweapons.molten_plate": "Molten Plate", "item.immersiveweapons.molten_helmet": "Molten Helmet", "item.immersiveweapons.molten_chestplate": "Molten Chestplate", "item.immersiveweapons.molten_leggings": "Molten Leggings", @@ -35,7 +34,6 @@ "item.immersiveweapons.tesla_chestplate": "Tesla Chestplate", "item.immersiveweapons.tesla_leggings": "Tesla Leggings", "item.immersiveweapons.tesla_boots": "Tesla Boots", - "item.immersiveweapons.tesla_plate": "Tesla Plate", "item.immersiveweapons.iron_pike": "Iron Pike", "item.immersiveweapons.iron_pike_head": "Iron Pike Head", "item.immersiveweapons.diamond_pike": "Diamond Pike", @@ -45,23 +43,23 @@ "item.immersiveweapons.stone_pike": "Stone Pike", "item.immersiveweapons.stone_shard": "Stone Shard", "item.immersiveweapons.stone_pike_head": "Stone Pike Head", - "item.immersiveweapons.wood_pike": "Wood Pike", - "item.immersiveweapons.wood_pike_head": "Wood Pike Head", - "item.immersiveweapons.wood_shard": "Wood Shard", - "item.immersiveweapons.gold_pike": "Gold Pike", - "item.immersiveweapons.gold_pike_head": "Gold Pike Head", + "item.immersiveweapons.wood_pike": "Wooden Pike", + "item.immersiveweapons.wood_pike_head": "Wooden Pike Head", + "item.immersiveweapons.wood_shard": "Wooden Shard", + "item.immersiveweapons.gold_pike": "Golden Pike", + "item.immersiveweapons.gold_pike_head": "Golden Pike Head", "item.immersiveweapons.iron_arrow": "Iron Arrow", "item.immersiveweapons.diamond_arrow": "Diamond Arrow", - "item.immersiveweapons.gold_arrow": "Gold Arrow", + "item.immersiveweapons.gold_arrow": "Golden Arrow", "item.immersiveweapons.stone_arrow": "Stone Arrow", - "item.immersiveweapons.wood_arrow": "Wood Arrow", + "item.immersiveweapons.wood_arrow": "Wooden Arrow", "item.immersiveweapons.netherite_arrow": "Netherite Arrow", "item.immersiveweapons.flintlock_pistol": "Flintlock Pistol", "item.immersiveweapons.copper_musket_ball": "Copper Musket Ball", - "item.immersiveweapons.wood_musket_ball": "Wood Musket Ball", + "item.immersiveweapons.wood_musket_ball": "Wooden Musket Ball", "item.immersiveweapons.stone_musket_ball": "Stone Musket Ball", "item.immersiveweapons.iron_musket_ball": "Iron Musket Ball", - "item.immersiveweapons.gold_musket_ball": "Gold Musket Ball", + "item.immersiveweapons.gold_musket_ball": "Golden Musket Ball", "item.immersiveweapons.diamond_musket_ball": "Diamond Musket Ball", "item.immersiveweapons.netherite_musket_ball": "Netherite Musket Ball", "item.immersiveweapons.blank_blueprint": "Blank Blueprint", @@ -99,14 +97,14 @@ "item.immersiveweapons.dying_soldier_spawn_egg": "Dying Soldier Spawn Egg", "item.immersiveweapons.minuteman_spawn_egg": "Minuteman Spawn Egg", "item.immersiveweapons.bandage": "Bandage", - "item.immersiveweapons.mre": "Meal Ready-To-Eat (MRE)", + "item.immersiveweapons.mre": "Meal Ready-to-Eat (MRE)", "item.immersiveweapons.painkillers": "Painkillers", "item.immersiveweapons.syringe": "Syringe", "item.immersiveweapons.morphine": "Morphine", "item.immersiveweapons.used_syringe": "Used Syringe", "item.immersiveweapons.first_aid_kit": "First Aid Kit", "item.immersiveweapons.field_medic_spawn_egg": "Field Medic Spawn Egg", - "item.immersiveweapons.raw_cobalt": "Raw Cobalt", + "item.immersiveweapons.raw_cobalt": "Block of Raw Cobalt", "item.immersiveweapons.cobalt_ingot": "Cobalt Ingot", "item.immersiveweapons.cobalt_sword": "Cobalt Sword", "item.immersiveweapons.cobalt_pickaxe": "Cobalt Pickaxe", @@ -143,9 +141,9 @@ "item.immersiveweapons.burned_oak_boat": "Burned Oak Boat", "item.immersiveweapons.gauntlet_scaffolding": "Gauntlet Scaffolding", "item.immersiveweapons.gauntlet_scaffolding_blueprint": "Gauntlet Scaffolding Blueprint", - "item.immersiveweapons.wood_gauntlet": "Wood Gauntlet", + "item.immersiveweapons.wood_gauntlet": "Wooden Gauntlet", "item.immersiveweapons.stone_gauntlet": "Stone Gauntlet", - "item.immersiveweapons.gold_gauntlet": "Gold Gauntlet", + "item.immersiveweapons.gold_gauntlet": "Golden Gauntlet", "item.immersiveweapons.copper_gauntlet": "Copper Gauntlet", "item.immersiveweapons.iron_gauntlet": "Iron Gauntlet", "item.immersiveweapons.cobalt_gauntlet": "Cobalt Gauntlet", @@ -159,6 +157,7 @@ "item.immersiveweapons.sulfur": "Sulfur", "item.immersiveweapons.celestial_tower_spawn_egg": "Celestial Tower Spawn Egg", "item.immersiveweapons.celestial_fragment": "Celestial Fragment", + "item.immersiveweapons.encyclopedia": "Encyclopedia", "block.immersiveweapons.molten_ore": "Molten Ore", "block.immersiveweapons.molten_block": "Molten Block", "block.immersiveweapons.electric_ore": "Electric Ore", @@ -195,7 +194,15 @@ "block.immersiveweapons.spotlight": "Spotlight", "block.immersiveweapons.wall_shelf": "Wall Shelf", "block.immersiveweapons.panic_alarm": "Panic Alarm", - "block.immersiveweapons.wooden_table": "Wooden Table", + "block.immersiveweapons.oak_table": "Oak Table", + "block.immersiveweapons.spruce_table": "Spruce Table", + "block.immersiveweapons.birch_table": "Birch Table", + "block.immersiveweapons.jungle_table": "Jungle Table", + "block.immersiveweapons.acacia_table": "Acacia Table", + "block.immersiveweapons.dark_oak_table": "Dark Oak Table", + "block.immersiveweapons.crimson_table": "Crimson Table", + "block.immersiveweapons.warped_table": "Warped Table", + "block.immersiveweapons.burned_oak_table": "Burned Oak Table", "block.immersiveweapons.barbed_wire_fence": "Barbed Wire Fence", "block.immersiveweapons.wooden_spikes": "Wooden Spikes", "block.immersiveweapons.biohazard_box": "Biohazard Box", @@ -253,6 +260,7 @@ "block.immersiveweapons.celestial_lantern": "Celestial Lantern", "block.immersiveweapons.deepslate_cobalt_ore": "Deepslate Cobalt Ore", "block.immersiveweapons.deepslate_sulfur_ore": "Deepslate Sulfur Ore", + "block.immersiveweapons.raw_sulfur_block": "Block of Raw Sulfur", "entity.immersiveweapons.dying_soldier": "Dying Soldier", "entity.immersiveweapons.minuteman": "Minuteman", "entity.immersiveweapons.field_medic": "Field Medic", @@ -260,7 +268,7 @@ "entity.immersiveweapons.hans": "Hans The Almighty", "entity.immersiveweapons.wood_arrow": "Wood Arrow", "entity.immersiveweapons.stone_arrow": "Stone Arrow", - "entity.immersiveweapons.gold_arrow": "Gold Arrow", + "entity.immersiveweapons.gold_arrow": "Golden Arrow", "entity.immersiveweapons.copper_arrow": "Copper Arrow", "entity.immersiveweapons.iron_arrow": "Iron Arrow", "entity.immersiveweapons.cobalt_arrow": "Cobalt Arrow", @@ -268,7 +276,7 @@ "entity.immersiveweapons.netherite_arrow": "Netherite Arrow", "entity.immersiveweapons.wood_musket_ball": "Wood Musket Ball", "entity.immersiveweapons.stone_musket_ball": "Stone Musket Ball", - "entity.immersiveweapons.gold_musket_ball": "Gold Musket Ball", + "entity.immersiveweapons.gold_musket_ball": "Golden Musket Ball", "entity.immersiveweapons.copper_musket_ball": "Copper Musket Ball", "entity.immersiveweapons.iron_musket_ball": "Iron Musket Ball", "entity.immersiveweapons.cobalt_musket_ball": "Cobalt Musket Ball", @@ -286,12 +294,13 @@ "entity.immersiveweapons.rock_spider": "Rock Spider", "entity.immersiveweapons.celestial_tower": "Celestial Tower", "effect.immersiveweapons.morphine": "Morphine", - "effect.immersiveweapons.bleeding": "Internal Bleeding", + "effect.immersiveweapons.bleeding": "Bleeding", "effect.immersiveweapons.alcohol": "Alcohol", "container.immersiveweapons.small_parts_table": "Small Parts Crafting", "container.immersiveweapons.tesla_synthesizer": "Tesla Synthesizing", "gui.jei.category.small_parts": "Small Parts Crafting", "gui.jei.category.tesla_synthesizer": "Tesla Synthesizing", + "immersiveweapons.subtitle.armor.tesla.equip": "Tesla armor clanks", "immersiveweapons.subtitle.armor.tesla.effect": "Tesla armor zapping", "immersiveweapons.subtitle.armor.tesla.power_down": "Tesla armor turning off", "immersiveweapons.subtitle.armor.tesla.power_up": "Tesla armor turning on", @@ -306,9 +315,8 @@ "immersiveweapons.subtitle.block.bear_trap_close": "Bear trap closes", "immersiveweapons.subtitle.block.spike_trap_extend": "Spike trap extends", "immersiveweapons.subtitle.block.spike_trap_retract": "Spike trap retracts", - "immersiveweapons.subtitle.block.alarm.alarm_1": "Alarm sounds", - "immersiveweapons.subtitle.block.alarm.alarm_2": "Alarm sounds", - "immersiveweapons.subtitle.block.alarm.alarm_3": "Alarm sounds", + "immersiveweapons.subtitle.block.alarm.panic_alarm": "Alarm sounds", + "immersiveweapons.subtitle.block.mortar.fire": "Mortar fires", "immersiveweapons.subtitle.entity.dying_soldier.ambient": "Soldier speaking", "immersiveweapons.subtitle.entity.dying_soldier.step": "Soldier walks", "immersiveweapons.subtitle.entity.dying_soldier.death": "Soldier dies", @@ -336,9 +344,6 @@ "immersiveweapons.subtitle.entity.celestial_tower.death": "Celestial Tower collapses", "immersiveweapons.subtitle.entity.celestial_tower.summon": "Celestial Tower summons", "immersiveweapons.subtitle.entity.celestial_tower.vulnerable": "Celestial Tower becomes vulnerable", - "immersiveweapons.block.alarm.alarm1": "Currently Set Alarm: Emergency Alert", - "immersiveweapons.block.alarm.alarm2": "Currently Set Alarm: Local Area Alert", - "immersiveweapons.block.alarm.alarm3": "Currently Set Alarm: Wide Area Alert", "immersiveweapons.item.first_aid_kit": "You must be at or below half health to use this", "immersiveweapons.tooltip.molten_sword": "Kill it with fire", "immersiveweapons.tooltip.tesla_sword": "Provides quite a shocking experience", @@ -372,7 +377,7 @@ "immersiveweapons.tooltip.smoke_bomb_blue": "This one releases blue smoke.", "immersiveweapons.tooltip.smoke_bomb_purple": "This one releases purple smoke.", "immersiveweapons.tooltip.smoke_bomb_yellow": "This one releases yellow smoke.", - "immersiveweapons.tooltip.molotov_cocktail": "Creates a ring of fire upon impact. Best used when thrown on flat ground.", + "immersiveweapons.tooltip.molotov_cocktail": "Creates a ring of fire upon impact.", "immersiveweapons.tooltip.bottle_of_alcohol": "You could drink this, but you'll be nauseous. Highly flammable!", "immersiveweapons.tooltip.bottle_of_wine": "A relaxing combination of sweet berries", "immersiveweapons.tooltip.punji_sticks": "Commit war crimes using Vietnam war tactics", @@ -391,14 +396,14 @@ "immersiveweapons.tooltip.hans_spawn_egg": "Summon Hans the Almighty into this world", "immersiveweapons.tooltip.flare_gun": "Launch bright flares into the sky", "immersiveweapons.tooltip.gauntlet": "Beat the life out of your opponents.", - "immersiveweapons.tooltip.wood_gauntlet": "Has a 15% chance to inflict Internal Bleeding.", - "immersiveweapons.tooltip.stone_gauntlet": "Has a 25% chance to inflict Internal Bleeding.", - "immersiveweapons.tooltip.gold_gauntlet": "Has a 35% chance to inflict Internal Bleeding.", - "immersiveweapons.tooltip.copper_gauntlet": "Has a 45% chance to inflict Internal Bleeding.", - "immersiveweapons.tooltip.iron_gauntlet": "Has a 55% chance to inflict Internal Bleeding.", - "immersiveweapons.tooltip.cobalt_gauntlet": "Has a 60% chance to inflict Internal Bleeding.", - "immersiveweapons.tooltip.diamond_gauntlet": "Has a 75% chance to inflict Internal Bleeding.", - "immersiveweapons.tooltip.netherite_gauntlet": "Has a 85% chance to inflict Internal Bleeding.", + "immersiveweapons.tooltip.wood_gauntlet": "Has a 15% chance to inflict Bleeding.", + "immersiveweapons.tooltip.stone_gauntlet": "Has a 25% chance to inflict Bleeding.", + "immersiveweapons.tooltip.gold_gauntlet": "Has a 35% chance to inflict Bleeding.", + "immersiveweapons.tooltip.copper_gauntlet": "Has a 45% chance to inflict Bleeding.", + "immersiveweapons.tooltip.iron_gauntlet": "Has a 55% chance to inflict Bleeding.", + "immersiveweapons.tooltip.cobalt_gauntlet": "Has a 60% chance to inflict Bleeding.", + "immersiveweapons.tooltip.diamond_gauntlet": "Has a 75% chance to inflict Bleeding.", + "immersiveweapons.tooltip.netherite_gauntlet": "Has a 85% chance to inflict Bleeding.", "immersiveweapons.tooltip.bandage": "Cover those nasty cuts and scrapes", "immersiveweapons.tooltip.painkillers": "Feel no pain with a copious amount of pills", "immersiveweapons.tooltip.mre": "Tastes disgusting but at least you won't be hungry for a while", @@ -433,19 +438,27 @@ "advancements.immersiveweapons.root.title": "Immersive Weapons", "advancements.immersiveweapons.root.description": "Spice up your combat skills", "advancements.immersiveweapons.molten_shard.title": "A Hot Metal", - "advancements.immersiveweapons.molten_shard.description": "Obtain molten shards", + "advancements.immersiveweapons.molten_shard.description": "Obtain Molten shards", "advancements.immersiveweapons.molten_ingot.title": "Lava Forge", - "advancements.immersiveweapons.molten_ingot.description": "Smelt a molten ingot", + "advancements.immersiveweapons.molten_ingot.description": "Smelt a Molten ingot", "advancements.immersiveweapons.molten_sword.title": "Kill It With Fire", - "advancements.immersiveweapons.molten_sword.description": "Craft a molten sword", + "advancements.immersiveweapons.molten_sword.description": "Craft a Molten sword", + "advancements.immersiveweapons.molten_pickaxe.title": "Molten Tools: Pickaxe", + "advancements.immersiveweapons.molten_pickaxe.description": "Craft a Molten pickaxe", + "advancements.immersiveweapons.molten_axe.title": "Molten Tools: Axe", + "advancements.immersiveweapons.molten_axe.description": "Craft a Molten axe", + "advancements.immersiveweapons.molten_shovel.title": "Molten Tools: Shovel", + "advancements.immersiveweapons.molten_shovel.description": "Craft a Molten shovel", + "advancements.immersiveweapons.molten_hoe.title": "Molten Tools: Hoe", + "advancements.immersiveweapons.molten_hoe.description": "Craft a Molten hoe", "advancements.immersiveweapons.play_with_fire.title": "Play With Fire", - "advancements.immersiveweapons.play_with_fire.description": "Obtain every molten tool", + "advancements.immersiveweapons.play_with_fire.description": "Obtain every Molten tool", "advancements.immersiveweapons.molten_plate.title": "Lava Blacksmith", - "advancements.immersiveweapons.molten_plate.description": "Craft a molten plate", + "advancements.immersiveweapons.molten_plate.description": "Craft a Molten plate", "advancements.immersiveweapons.warm_and_toasty.title": "Warm And Toasty", - "advancements.immersiveweapons.warm_and_toasty.description": "Wear a full set of molten armor", + "advancements.immersiveweapons.warm_and_toasty.description": "Wear a full set of Molten armor", "advancements.immersiveweapons.lava_bath.title": "Lava Bath", - "advancements.immersiveweapons.lava_bath.description": "Swim in lava with a full set of molten armor", + "advancements.immersiveweapons.lava_bath.description": "Swim in lava with a full set of Molten armor", "advancements.immersiveweapons.battlefield.title": "A Destroyed Landscape", "advancements.immersiveweapons.battlefield.description": "Visit a battlefield", "advancements.immersiveweapons.conductive_alloy.title": "Electrician", @@ -453,17 +466,23 @@ "advancements.immersiveweapons.electric_ingot.title": "Electrician: Part 2", "advancements.immersiveweapons.electric_ingot.description": "Obtain an electric ingot, a rare and powerful energy source", "advancements.immersiveweapons.tesla_ingot.title": "Electrician: The Final Saga", - "advancements.immersiveweapons.tesla_ingot.description": "Obtain a tesla ingot, the answer to your mass energy requirements", + "advancements.immersiveweapons.tesla_ingot.description": "Obtain a Tesla ingot, the answer to your mass energy requirements", "advancements.immersiveweapons.tesla_sword.title": "A Shocking Experience", - "advancements.immersiveweapons.tesla_sword.description": "Obtain a tesla sword", + "advancements.immersiveweapons.tesla_sword.description": "Obtain a Tesla sword", + "advancements.immersiveweapons.tesla_pickaxe.title": "Tesla Tools: Pickaxe", + "advancements.immersiveweapons.tesla_pickaxe.description": "Obtain a Tesla pickaxe", + "advancements.immersiveweapons.tesla_axe.title": "Tesla Tools: Axe", + "advancements.immersiveweapons.tesla_axe.description": "Obtain a Tesla axe", + "advancements.immersiveweapons.tesla_shovel.title": "Tesla Tools: Shovel", + "advancements.immersiveweapons.tesla_shovel.description": "Obtain a Tesla shovel", + "advancements.immersiveweapons.tesla_hoe.title": "Tesla Tools: Hoe", + "advancements.immersiveweapons.tesla_hoe.description": "Destroy your wealth by obtaining a Tesla hoe", "advancements.immersiveweapons.energized.title": "Energized", - "advancements.immersiveweapons.energized.description": "Obtain a full set of tesla tools", - "advancements.immersiveweapons.rich_no_more.title": "Not Rich Anymore", - "advancements.immersiveweapons.rich_no_more.description": "Destroy your wealth by obtaining a tesla hoe", + "advancements.immersiveweapons.energized.description": "Obtain a full set of Tesla tools", "advancements.immersiveweapons.tesla_coil.title": "Maybe I Am A Tesla Coil", - "advancements.immersiveweapons.tesla_coil.description": "Wear a full set of tesla armor", + "advancements.immersiveweapons.tesla_coil.description": "Wear a full set of Tesla armor", "advancements.immersiveweapons.tesla_synthesizer.title": "I'm A Genius Too", - "advancements.immersiveweapons.tesla_synthesizer.description": "Craft a tesla synthesizer", + "advancements.immersiveweapons.tesla_synthesizer.description": "Craft a Tesla synthesizer", "advancements.immersiveweapons.tool_rod.title": "Strong Stick", "advancements.immersiveweapons.tool_rod.description": "Craft a wooden tool rod.", "advancements.immersiveweapons.pike.title": "Long Distance Stabbing", @@ -476,6 +495,16 @@ "advancements.immersiveweapons.blunderbuss.description": "Craft a blunderbuss", "advancements.immersiveweapons.shards.title": "Sharp Shrapnel", "advancements.immersiveweapons.shards.description": "Obtain any shard", + "advancements.immersiveweapons.wood_shard.title": "Shards: Wood", + "advancements.immersiveweapons.wood_shard.description": "Obtain a wooden shard", + "advancements.immersiveweapons.stone_shard.title": "Shards: Stone", + "advancements.immersiveweapons.stone_shard.description": "Obtain a stone shard", + "advancements.immersiveweapons.diamond_shard.title": "Shards: Diamond", + "advancements.immersiveweapons.diamond_shard.description": "Obtain a diamond shard", + "advancements.immersiveweapons.obsidian_shard.title": "Shards: Obsidian", + "advancements.immersiveweapons.obsidian_shard.description": "Obtain an obsidian shard", + "advancements.immersiveweapons.musket_ball.title": "Pow!", + "advancements.immersiveweapons.musket_ball.description": "Obtain any musket ball", "advancements.immersiveweapons.netherite_projectile.title": "Throwing Away Money", "advancements.immersiveweapons.netherite_projectile.description": "Obtain a netherite arrow and musket ball", "advancements.immersiveweapons.smoke_bomb.title": "Sight Privileges Revoked", @@ -493,17 +522,25 @@ "advancements.immersiveweapons.traps.title": "Advanced Warfare", "advancements.immersiveweapons.traps.description": "Obtain any trap", "advancements.immersiveweapons.ventus_shard.title": "Cool Shards", - "advancements.immersiveweapons.ventus_shard.description": "Obtain ventus shards", + "advancements.immersiveweapons.ventus_shard.description": "Obtain Ventus shards", "advancements.immersiveweapons.ventus_sword.title": "Whoosh", - "advancements.immersiveweapons.ventus_sword.description": "Craft a ventus sword", + "advancements.immersiveweapons.ventus_sword.description": "Craft a Ventus sword", + "advancements.immersiveweapons.ventus_pickaxe.title": "Ventus Tools: Pickaxe", + "advancements.immersiveweapons.ventus_pickaxe.description": "Obtain a Ventus pickaxe", + "advancements.immersiveweapons.ventus_axe.title": "Ventus Tools: Axe", + "advancements.immersiveweapons.ventus_axe.description": "Obtain a Ventus axe", + "advancements.immersiveweapons.ventus_shovel.title": "Ventus Tools: Shovel", + "advancements.immersiveweapons.ventus_shovel.description": "Obtain a Ventus shovel", + "advancements.immersiveweapons.ventus_hoe.title": "Ventus Tools: Hoe", + "advancements.immersiveweapons.ventus_hoe.description": "Obtain a Ventus hoe", "advancements.immersiveweapons.pretty_windy.title": "Pretty Windy", - "advancements.immersiveweapons.pretty_windy.description": "Obtain a full set of ventus tools", + "advancements.immersiveweapons.pretty_windy.description": "Obtain a full set of Ventus tools", "advancements.immersiveweapons.almost_flying.title": "Almost Flying", - "advancements.immersiveweapons.almost_flying.description": "Wear a full set of ventus armor", + "advancements.immersiveweapons.almost_flying.description": "Wear a full set of Ventus armor", "advancements.immersiveweapons.ventus_staff_core.title": "Wind Energy", - "advancements.immersiveweapons.ventus_staff_core.description": "Craft a ventus staff core", + "advancements.immersiveweapons.ventus_staff_core.description": "Craft a Ventus staff core", "advancements.immersiveweapons.ventus_staff.title": "Gone With The Wind", - "advancements.immersiveweapons.ventus_staff.description": "Craft a ventus staff", + "advancements.immersiveweapons.ventus_staff.description": "Craft a Ventus staff", "advancements.immersiveweapons.gauntlet.title": "Rule With An Iron Fist", "advancements.immersiveweapons.gauntlet.description": "Craft any gauntlet", "advancements.immersiveweapons.tiltros.warrior_statue.title": "A Portal to a Forgotten Land", @@ -512,10 +549,60 @@ "advancements.immersiveweapons.tiltros.azul_keystone.description": "Craft an Azul Keystone from fragments scattered across the world", "advancements.immersiveweapons.tiltros.tiltros.title": "Welcome to Tiltros", "advancements.immersiveweapons.tiltros.tiltros.description": "A ravaged landscape lost in space", + "advancements.immersiveweapons.copper_ingot.title": "Simple Metals: Copper", + "advancements.immersiveweapons.copper_ingot.description": "Obtain a copper ingot", + "advancements.immersiveweapons.copper_sword.title": "Copper Tools: Sword", + "advancements.immersiveweapons.copper_sword.description": "Obtain a copper sword", + "advancements.immersiveweapons.copper_pickaxe.title": "Copper Tools: Pickaxe", + "advancements.immersiveweapons.copper_pickaxe.description": "Obtain a copper pickaxe", + "advancements.immersiveweapons.copper_axe.title": "Copper Tools: Axe", + "advancements.immersiveweapons.copper_axe.description": "Obtain a copper Axe", + "advancements.immersiveweapons.copper_shovel.title": "Copper Tools: Shovel", + "advancements.immersiveweapons.copper_shovel.description": "Obtain a copper shovel", + "advancements.immersiveweapons.copper_hoe.title": "Copper Tools: Hoe", + "advancements.immersiveweapons.copper_hoe.description": "Obtain a copper Hoe", + "advancements.immersiveweapons.copper_tools.title": "Close Enough to Iron Tools", + "advancements.immersiveweapons.copper_tools.description": "Obtain a full set of copper tools", + "advancements.immersiveweapons.cobalt_ingot.title": "Simple Metals: Cobalt", + "advancements.immersiveweapons.cobalt_ingot.description": "Obtain a cobalt ingot", + "advancements.immersiveweapons.cobalt_sword.title": "Cobalt Tools: Sword", + "advancements.immersiveweapons.cobalt_sword.description": "Obtain a cobalt sword", + "advancements.immersiveweapons.cobalt_pickaxe.title": "Cobalt Tools: Pickaxe", + "advancements.immersiveweapons.cobalt_pickaxe.description": "Obtain a cobalt pickaxe", + "advancements.immersiveweapons.cobalt_axe.title": "Cobalt Tools: Axe", + "advancements.immersiveweapons.cobalt_axe.description": "Obtain a cobalt Axe", + "advancements.immersiveweapons.cobalt_shovel.title": "Cobalt Tools: Shovel", + "advancements.immersiveweapons.cobalt_shovel.description": "Obtain a cobalt shovel", + "advancements.immersiveweapons.cobalt_hoe.title": "Cobalt Tools: Hoe", + "advancements.immersiveweapons.cobalt_hoe.description": "Obtain a cobalt Hoe", + "advancements.immersiveweapons.cobalt_tools.title": "Who Needs Iron Tools", + "advancements.immersiveweapons.cobalt_tools.description": "Obtain a full set of cobalt tools", + "advancements.immersiveweapons.gold_ingot.title": "Simple Metals: Gold", + "advancements.immersiveweapons.gold_ingot.description": "Obtain a gold ingot", + "advancements.immersiveweapons.netherite_ingot.title": "Diamonds are for Peasants", + "advancements.immersiveweapons.netherite_ingot.description": "Obtain a netherite ingot", + "advancements.immersiveweapons.ingots.title": "Ingots!", + "advancements.immersiveweapons.ingots.description": "Obtain any ingot", + "advancements.immersiveweapons.nuggets.title": "Nuggets!", + "advancements.immersiveweapons.nuggets.description": "Obtain any nugget", + "advancements.immersiveweapons.planks.title": "Planks!", + "advancements.immersiveweapons.planks.description": "Obtain any plank", + "advancements.immersiveweapons.mud.title": "Mud!", + "advancements.immersiveweapons.mud.description": "Obtain a mud block", + "advancements.immersiveweapons.bamboo.title": "Thick Grass", + "advancements.immersiveweapons.bamboo.description": "Obtain bamboo", + "advancements.immersiveweapons.cloud_marble.title": "Looks Better than Diorite", + "advancements.immersiveweapons.cloud_marble.description": "Obtain a block of cloud marble", + "advancements.immersiveweapons.biohazard_box.title": "Hazardous?", + "advancements.immersiveweapons.biohazard_box.description": "Obtain a (harmless) biohazard box from a medic station", + "advancements.immersiveweapons.cloud.title": "High in the Sky", + "advancements.immersiveweapons.cloud.description": "Walk across cloud blocks high in the air", "biome.immersiveweapons.battlefield": "Battlefield", "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.", "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", diff --git a/src/main/resources/assets/immersiveweapons/lang/es_es.json b/src/main/resources/assets/immersiveweapons/lang/es_es.json index 692718422..ed20f1bc0 100644 --- a/src/main/resources/assets/immersiveweapons/lang/es_es.json +++ b/src/main/resources/assets/immersiveweapons/lang/es_es.json @@ -17,7 +17,6 @@ "item.immersiveweapons.copper_axe": "Copper Axe", "item.immersiveweapons.copper_shovel": "Cobre Shovel", "item.immersiveweapons.copper_hoe": "Copper Hoe", - "item.immersiveweapons.molten_plate": "Molten Plate", "item.immersiveweapons.molten_helmet": "Casco de moldeado", "item.immersiveweapons.molten_chestplate": "Molten Chestplate", "item.immersiveweapons.molten_leggings": "Leggings moldeados", @@ -35,7 +34,6 @@ "item.immersiveweapons.tesla_chestplate": "Tesla Chestplate", "item.immersiveweapons.tesla_leggings": "Tesla Leggings", "item.immersiveweapons.tesla_boots": "Tesla Boots", - "item.immersiveweapons.tesla_plate": "Tesla Plate", "item.immersiveweapons.iron_pike": "Iron Pike", "item.immersiveweapons.iron_pike_head": "Iron Pike Head", "item.immersiveweapons.diamond_pike": "Pastel de diamante", @@ -46,22 +44,22 @@ "item.immersiveweapons.stone_shard": "Stone Shard", "item.immersiveweapons.stone_pike_head": "Stone Pike Head", "item.immersiveweapons.wood_pike": "Pike de madera", - "item.immersiveweapons.wood_pike_head": "Wood Pike Head", - "item.immersiveweapons.wood_shard": "Wood Shard", - "item.immersiveweapons.gold_pike": "Pike de oro", - "item.immersiveweapons.gold_pike_head": "Gold Pike Head", + "item.immersiveweapons.wood_pike_head": "Wooden Pike Head", + "item.immersiveweapons.wood_shard": "Wooden Shard", + "item.immersiveweapons.gold_pike": "Pike dorado", + "item.immersiveweapons.gold_pike_head": "Golden Pike Head", "item.immersiveweapons.iron_arrow": "Iron Arrow", "item.immersiveweapons.diamond_arrow": "Diamond Arrow", "item.immersiveweapons.gold_arrow": "Flecha de oro", "item.immersiveweapons.stone_arrow": "Stone Arrow", - "item.immersiveweapons.wood_arrow": "Wood Arrow", + "item.immersiveweapons.wood_arrow": "Wooden Arrow", "item.immersiveweapons.netherite_arrow": "Natherite Arrow", "item.immersiveweapons.flintlock_pistol": "Flintlock Pistol", "item.immersiveweapons.copper_musket_ball": "Copper Musket Ball", - "item.immersiveweapons.wood_musket_ball": "Wood Musket Ball", + "item.immersiveweapons.wood_musket_ball": "Wooden Musket Ball", "item.immersiveweapons.stone_musket_ball": "Stone Musket Ball", "item.immersiveweapons.iron_musket_ball": "Iron Musket Ball", - "item.immersiveweapons.gold_musket_ball": "Gold Musket Ball", + "item.immersiveweapons.gold_musket_ball": "Golden Musket Ball", "item.immersiveweapons.diamond_musket_ball": "Diamond Musket Ball", "item.immersiveweapons.netherite_musket_ball": "Bola de mosquete de neoterito", "item.immersiveweapons.blank_blueprint": "Blank Blueprint", @@ -99,14 +97,14 @@ "item.immersiveweapons.dying_soldier_spawn_egg": "Dying Soldier Spawn Egg", "item.immersiveweapons.minuteman_spawn_egg": "Minuteman Spawn Egg", "item.immersiveweapons.bandage": "Bandage", - "item.immersiveweapons.mre": "Comida lista para comer (MRE)", + "item.immersiveweapons.mre": "Comida Listo para comer (MRE)", "item.immersiveweapons.painkillers": "Dolores", "item.immersiveweapons.syringe": "Syringe", "item.immersiveweapons.morphine": "Morphine", "item.immersiveweapons.used_syringe": "Syringe usado", "item.immersiveweapons.first_aid_kit": "First Aid Kit", "item.immersiveweapons.field_medic_spawn_egg": "Field Medic Spawn Egg", - "item.immersiveweapons.raw_cobalt": "Raw Cobalt", + "item.immersiveweapons.raw_cobalt": "Bloque de Cobalto Raw", "item.immersiveweapons.cobalt_ingot": "Cobalto Ingot", "item.immersiveweapons.cobalt_sword": "Cobalt Sword", "item.immersiveweapons.cobalt_pickaxe": "Cobalto Pickaxe", @@ -145,7 +143,7 @@ "item.immersiveweapons.gauntlet_scaffolding_blueprint": "Gauntlet Scaffolding Blueprint", "item.immersiveweapons.wood_gauntlet": "Madera Gauntlet", "item.immersiveweapons.stone_gauntlet": "Piedra Gauntlet", - "item.immersiveweapons.gold_gauntlet": "Gauntlet de oro", + "item.immersiveweapons.gold_gauntlet": "Golden Gauntlet", "item.immersiveweapons.copper_gauntlet": "Copper Gauntlet", "item.immersiveweapons.iron_gauntlet": "Iron Gauntlet", "item.immersiveweapons.cobalt_gauntlet": "Cobalt Gauntlet", @@ -159,6 +157,7 @@ "item.immersiveweapons.sulfur": "Sulfuro", "item.immersiveweapons.celestial_tower_spawn_egg": "Huevo picado de la torre celestial", "item.immersiveweapons.celestial_fragment": "Fragmento Celestial", + "item.immersiveweapons.encyclopedia": "Enciclopedia", "block.immersiveweapons.molten_ore": "Molten Ore", "block.immersiveweapons.molten_block": "Bloque de moldeo", "block.immersiveweapons.electric_ore": "Electric Ore", @@ -195,7 +194,15 @@ "block.immersiveweapons.spotlight": "Spotlight", "block.immersiveweapons.wall_shelf": "Estante de pared", "block.immersiveweapons.panic_alarm": "Alarma de pánico", - "block.immersiveweapons.wooden_table": "Mesa de madera", + "block.immersiveweapons.oak_table": "Mesa redonda", + "block.immersiveweapons.spruce_table": "Mesa de grifo", + "block.immersiveweapons.birch_table": "Mesa de abedul", + "block.immersiveweapons.jungle_table": "Jungle Table", + "block.immersiveweapons.acacia_table": "Mesa de Acacia", + "block.immersiveweapons.dark_oak_table": "Mesa de roble oscuro", + "block.immersiveweapons.crimson_table": "Cuadro de Crimson", + "block.immersiveweapons.warped_table": "Mesa calentada", + "block.immersiveweapons.burned_oak_table": "Mesa de roble quemado", "block.immersiveweapons.barbed_wire_fence": "Fence de alambre de púas", "block.immersiveweapons.wooden_spikes": "Spikes de madera", "block.immersiveweapons.biohazard_box": "Caja de Biohazard", @@ -253,6 +260,7 @@ "block.immersiveweapons.celestial_lantern": "Linterna Celestial", "block.immersiveweapons.deepslate_cobalt_ore": "Deepslate Cobalt Ore", "block.immersiveweapons.deepslate_sulfur_ore": "Azufre de azufre", + "block.immersiveweapons.raw_sulfur_block": "Bloque de azufre crudo", "entity.immersiveweapons.dying_soldier": "Soldado que muere", "entity.immersiveweapons.minuteman": "Minuteman", "entity.immersiveweapons.field_medic": "Field Medic", @@ -268,7 +276,7 @@ "entity.immersiveweapons.netherite_arrow": "Natherite Arrow", "entity.immersiveweapons.wood_musket_ball": "Wood Musket Ball", "entity.immersiveweapons.stone_musket_ball": "Stone Musket Ball", - "entity.immersiveweapons.gold_musket_ball": "Gold Musket Ball", + "entity.immersiveweapons.gold_musket_ball": "Golden Musket Ball", "entity.immersiveweapons.copper_musket_ball": "Copper Musket Ball", "entity.immersiveweapons.iron_musket_ball": "Iron Musket Ball", "entity.immersiveweapons.cobalt_musket_ball": "Cobalto de bola de mosquete", @@ -286,12 +294,13 @@ "entity.immersiveweapons.rock_spider": "Rock Spider", "entity.immersiveweapons.celestial_tower": "Torre Celestial", "effect.immersiveweapons.morphine": "Morphine", - "effect.immersiveweapons.bleeding": "Bleeding interno", + "effect.immersiveweapons.bleeding": "Bleeding", "effect.immersiveweapons.alcohol": "Alcohol", "container.immersiveweapons.small_parts_table": "Pequeñas piezas Artesanía", "container.immersiveweapons.tesla_synthesizer": "Tesla Synthesizing", "gui.jei.category.small_parts": "Pequeñas piezas Artesanía", "gui.jei.category.tesla_synthesizer": "Tesla Synthesizing", + "immersiveweapons.subtitle.armor.tesla.equip": "Tesla armor clans", "immersiveweapons.subtitle.armor.tesla.effect": "Tesla armadura zapping", "immersiveweapons.subtitle.armor.tesla.power_down": "Armadura Tesla apagando", "immersiveweapons.subtitle.armor.tesla.power_up": "Armadura Tesla girando", @@ -306,9 +315,8 @@ "immersiveweapons.subtitle.block.bear_trap_close": "La trampa del oso cierra", "immersiveweapons.subtitle.block.spike_trap_extend": "La trampa de Spike se extiende", "immersiveweapons.subtitle.block.spike_trap_retract": "Retractos de la trampa de Spike", - "immersiveweapons.subtitle.block.alarm.alarm_1": "Alarma sonidos", - "immersiveweapons.subtitle.block.alarm.alarm_2": "Alarma sonidos", - "immersiveweapons.subtitle.block.alarm.alarm_3": "Alarma sonidos", + "immersiveweapons.subtitle.block.alarm.panic_alarm": "Alarma sonidos", + "immersiveweapons.subtitle.block.mortar.fire": "Fuegos morteros", "immersiveweapons.subtitle.entity.dying_soldier.ambient": "Soldado hablando", "immersiveweapons.subtitle.entity.dying_soldier.step": "Camina el soldado", "immersiveweapons.subtitle.entity.dying_soldier.death": "El soldado muere", @@ -336,9 +344,6 @@ "immersiveweapons.subtitle.entity.celestial_tower.death": "La Torre Celestial colapsa", "immersiveweapons.subtitle.entity.celestial_tower.summon": "Torre Celestial llama", "immersiveweapons.subtitle.entity.celestial_tower.vulnerable": "La Torre Celestial se vuelve vulnerable", - "immersiveweapons.block.alarm.alarm1": "Actualmente Set Alarma: Alerta de Emergencia", - "immersiveweapons.block.alarm.alarm2": "Actualmente Set Alarma: Local Area Alert", - "immersiveweapons.block.alarm.alarm3": "Actualmente Set Alarma: alerta de área amplia", "immersiveweapons.item.first_aid_kit": "Usted debe estar en la mitad de la salud o debajo de ella", "immersiveweapons.tooltip.molten_sword": "Matarlo con fuego", "immersiveweapons.tooltip.tesla_sword": "Proporciona una experiencia bastante impactante", @@ -372,7 +377,7 @@ "immersiveweapons.tooltip.smoke_bomb_blue": "Esta libera humo azul.", "immersiveweapons.tooltip.smoke_bomb_purple": "Éste libera humo púrpura.", "immersiveweapons.tooltip.smoke_bomb_yellow": "Esta libera humo amarillo.", - "immersiveweapons.tooltip.molotov_cocktail": "Crea un anillo de fuego sobre el impacto. Mejor utilizado cuando se lanza en tierra plana.", + "immersiveweapons.tooltip.molotov_cocktail": "Crea un anillo de fuego sobre el impacto.", "immersiveweapons.tooltip.bottle_of_alcohol": "Podrías beber esto, pero serás nauseoso. ¡Muy inflamable!", "immersiveweapons.tooltip.bottle_of_wine": "Una relajante combinación de dulces bayas", "immersiveweapons.tooltip.punji_sticks": "Compromiso de crímenes de guerra usando tácticas de guerra de Vietnam", @@ -391,14 +396,14 @@ "immersiveweapons.tooltip.hans_spawn_egg": "Invoca a Hans el Todopoderoso en este mundo", "immersiveweapons.tooltip.flare_gun": "Inicie luces brillantes en el cielo", "immersiveweapons.tooltip.gauntlet": "Golpea la vida de tus oponentes.", - "immersiveweapons.tooltip.wood_gauntlet": "Tiene un 15% de posibilidades de infligir Bleeding interno.", - "immersiveweapons.tooltip.stone_gauntlet": "Tiene un 25% de posibilidades de infligir Bleeding Interno.", - "immersiveweapons.tooltip.gold_gauntlet": "Tiene un 35% de probabilidad de infligir Bleeding interno.", - "immersiveweapons.tooltip.copper_gauntlet": "Tiene un 45% de probabilidad de infligir Bleeding interno.", - "immersiveweapons.tooltip.iron_gauntlet": "Tiene un 55% de probabilidad de infligir Bleeding interno.", - "immersiveweapons.tooltip.cobalt_gauntlet": "Tiene un 60% de posibilidades de infligir sangrado interno.", - "immersiveweapons.tooltip.diamond_gauntlet": "Tiene un 75% de posibilidades de infligir Bleeding Interno.", - "immersiveweapons.tooltip.netherite_gauntlet": "Tiene un 85% de probabilidad de infligir Bleeding interno.", + "immersiveweapons.tooltip.wood_gauntlet": "Tiene un 15% de posibilidades de infligir a Bleeding.", + "immersiveweapons.tooltip.stone_gauntlet": "Tiene un 25% de posibilidades de infligir a Bleeding.", + "immersiveweapons.tooltip.gold_gauntlet": "Tiene un 35% de probabilidad de infligir a Bleeding.", + "immersiveweapons.tooltip.copper_gauntlet": "Tiene un 45% de oportunidad para infligir Bleeding.", + "immersiveweapons.tooltip.iron_gauntlet": "Tiene un 55% de probabilidad de infligir Bleeding.", + "immersiveweapons.tooltip.cobalt_gauntlet": "Tiene un 60% de posibilidades de infligir a Bleeding.", + "immersiveweapons.tooltip.diamond_gauntlet": "Tiene un 75% de posibilidades de infligir a Bleeding.", + "immersiveweapons.tooltip.netherite_gauntlet": "Tiene un 85% de probabilidad de infligir a Bleeding.", "immersiveweapons.tooltip.bandage": "Cubrir esos cortes y rasguños desagradables", "immersiveweapons.tooltip.painkillers": "No siente dolor con una cantidad copiosa de pastillas", "immersiveweapons.tooltip.mre": "Sabe desagradable pero al menos no tendrá hambre por un tiempo", @@ -433,19 +438,27 @@ "advancements.immersiveweapons.root.title": "Armas inmersivas", "advancements.immersiveweapons.root.description": "Escupe tus habilidades de combate", "advancements.immersiveweapons.molten_shard.title": "Un metal caliente", - "advancements.immersiveweapons.molten_shard.description": "Obtenga fragmentos de fundición", + "advancements.immersiveweapons.molten_shard.description": "Obtened Molten shards", "advancements.immersiveweapons.molten_ingot.title": "Lava Forge", - "advancements.immersiveweapons.molten_ingot.description": "Es fundir un gusano fundido", + "advancements.immersiveweapons.molten_ingot.description": "Es fundir un ingot de Molten", "advancements.immersiveweapons.molten_sword.title": "Matarlo con fuego", - "advancements.immersiveweapons.molten_sword.description": "Artesanía una espada fundida", + "advancements.immersiveweapons.molten_sword.description": "Fabrica una espada de Molten", + "advancements.immersiveweapons.molten_pickaxe.title": "Herramientas de moldeo: Pickaxe", + "advancements.immersiveweapons.molten_pickaxe.description": "Artesanía un pico de fundición", + "advancements.immersiveweapons.molten_axe.title": "Herramientas de moldeo: hacha", + "advancements.immersiveweapons.molten_axe.description": "Artesanía un hacha fundido", + "advancements.immersiveweapons.molten_shovel.title": "Herramientas de moldeo: Zapato", + "advancements.immersiveweapons.molten_shovel.description": "Fabricar una pala fundida", + "advancements.immersiveweapons.molten_hoe.title": "Herramientas de moldeo: Hoe", + "advancements.immersiveweapons.molten_hoe.description": "Artesanía una manguera fundida", "advancements.immersiveweapons.play_with_fire.title": "Juega con fuego", - "advancements.immersiveweapons.play_with_fire.description": "Obtener cada herramienta fundida", + "advancements.immersiveweapons.play_with_fire.description": "Obtenga cada herramienta Molten", "advancements.immersiveweapons.molten_plate.title": "Lava Blacksmith", - "advancements.immersiveweapons.molten_plate.description": "Artesanía una placa fundida", + "advancements.immersiveweapons.molten_plate.description": "Fabricar una placa de fundición", "advancements.immersiveweapons.warm_and_toasty.title": "Caliente y Tosty", - "advancements.immersiveweapons.warm_and_toasty.description": "Use un conjunto completo de armadura fundida", + "advancements.immersiveweapons.warm_and_toasty.description": "Use un conjunto completo de la armadura Molten", "advancements.immersiveweapons.lava_bath.title": "Baño de lava", - "advancements.immersiveweapons.lava_bath.description": "Swim en lava con un conjunto completo de armadura fundida", + "advancements.immersiveweapons.lava_bath.description": "Swim en lava con un conjunto completo de armadura Molten", "advancements.immersiveweapons.battlefield.title": "Un paisaje destrozado", "advancements.immersiveweapons.battlefield.description": "Visite un campo de batalla", "advancements.immersiveweapons.conductive_alloy.title": "Electricista", @@ -453,17 +466,23 @@ "advancements.immersiveweapons.electric_ingot.title": "Electricista: Parte 2", "advancements.immersiveweapons.electric_ingot.description": "Obtenga un enigma eléctrico, una fuente de energía rara y poderosa", "advancements.immersiveweapons.tesla_ingot.title": "Electricista: El Saga Final", - "advancements.immersiveweapons.tesla_ingot.description": "Obtenga un tesla ingot, la respuesta a sus necesidades de energía en masa", + "advancements.immersiveweapons.tesla_ingot.description": "Obtenga un ingot de Tesla, la respuesta a sus necesidades de energía en masa", "advancements.immersiveweapons.tesla_sword.title": "Una experiencia de choque", - "advancements.immersiveweapons.tesla_sword.description": "Obtenga una espada de tesla", + "advancements.immersiveweapons.tesla_sword.description": "Obtenga una espada de Tesla", + "advancements.immersiveweapons.tesla_pickaxe.title": "Herramientas de Tesla: Pickaxe", + "advancements.immersiveweapons.tesla_pickaxe.description": "Obtenga un pico de Tesla", + "advancements.immersiveweapons.tesla_axe.title": "Herramientas de Tesla: Axe", + "advancements.immersiveweapons.tesla_axe.description": "Obtenga un hacha de Tesla", + "advancements.immersiveweapons.tesla_shovel.title": "Herramientas de Tesla: Shovel", + "advancements.immersiveweapons.tesla_shovel.description": "Obtenga una pala Tesla", + "advancements.immersiveweapons.tesla_hoe.title": "Herramientas de Tesla: Hoe", + "advancements.immersiveweapons.tesla_hoe.description": "Destruya su riqueza obteniendo una manguera de Tesla", "advancements.immersiveweapons.energized.title": "Energizada", - "advancements.immersiveweapons.energized.description": "Obtener un conjunto completo de herramientas de tesla", - "advancements.immersiveweapons.rich_no_more.title": "Ya no es rico.", - "advancements.immersiveweapons.rich_no_more.description": "Destruya su riqueza obteniendo una tesla hoe", + "advancements.immersiveweapons.energized.description": "Obtener un conjunto completo de herramientas de Tesla", "advancements.immersiveweapons.tesla_coil.title": "Tal vez soy una bobina de Tesla", - "advancements.immersiveweapons.tesla_coil.description": "Use un conjunto completo de armadura de tesla", + "advancements.immersiveweapons.tesla_coil.description": "Use un conjunto completo de la armadura Tesla", "advancements.immersiveweapons.tesla_synthesizer.title": "Yo también soy un genio.", - "advancements.immersiveweapons.tesla_synthesizer.description": "Fabricar un sintetizador de tesla", + "advancements.immersiveweapons.tesla_synthesizer.description": "Fabricar un sintetizador de Tesla", "advancements.immersiveweapons.tool_rod.title": "Stick fuerte", "advancements.immersiveweapons.tool_rod.description": "Fabricar una barra de herramientas de madera.", "advancements.immersiveweapons.pike.title": "Apuñalamiento de larga distancia", @@ -476,6 +495,16 @@ "advancements.immersiveweapons.blunderbuss.description": "Haciendo un blunderbuss", "advancements.immersiveweapons.shards.title": "Shrapnel de afeitar", "advancements.immersiveweapons.shards.description": "Obtenga cualquier fragmento", + "advancements.immersiveweapons.wood_shard.title": "Shards: Madera", + "advancements.immersiveweapons.wood_shard.description": "Obtenga un fragmento de madera", + "advancements.immersiveweapons.stone_shard.title": "Shards: Stone", + "advancements.immersiveweapons.stone_shard.description": "Obtenga un fragmento de piedra", + "advancements.immersiveweapons.diamond_shard.title": "Shards: Diamond", + "advancements.immersiveweapons.diamond_shard.description": "Obtenga un diamante duro", + "advancements.immersiveweapons.obsidian_shard.title": "Shards: Obsidian", + "advancements.immersiveweapons.obsidian_shard.description": "Obtenga un fragmento obsidiano", + "advancements.immersiveweapons.musket_ball.title": "¡Pow!", + "advancements.immersiveweapons.musket_ball.description": "Obtenga cualquier bola de mosquete", "advancements.immersiveweapons.netherite_projectile.title": "Lanzar dinero de la salida", "advancements.immersiveweapons.netherite_projectile.description": "Obtenga una flecha netherita y una bola de mosquete", "advancements.immersiveweapons.smoke_bomb.title": "Privilegios de la vista Revocado", @@ -493,17 +522,25 @@ "advancements.immersiveweapons.traps.title": "Warfare avanzada", "advancements.immersiveweapons.traps.description": "Obtenga cualquier trampa", "advancements.immersiveweapons.ventus_shard.title": "Cool Shards", - "advancements.immersiveweapons.ventus_shard.description": "Obtenga fragmentos de ventus", + "advancements.immersiveweapons.ventus_shard.description": "Obtenga fragmentos de Ventus", "advancements.immersiveweapons.ventus_sword.title": "Whoosh", - "advancements.immersiveweapons.ventus_sword.description": "Fabricar una espada de ventus", + "advancements.immersiveweapons.ventus_sword.description": "Fabrica una espada Ventus", + "advancements.immersiveweapons.ventus_pickaxe.title": "Herramientas de Ventus: Pickaxe", + "advancements.immersiveweapons.ventus_pickaxe.description": "Obtenga un pico Ventus", + "advancements.immersiveweapons.ventus_axe.title": "Herramientas de Ventus: Axe", + "advancements.immersiveweapons.ventus_axe.description": "Obtenga un hacha Ventus", + "advancements.immersiveweapons.ventus_shovel.title": "Herramientas de Ventus: Shovel", + "advancements.immersiveweapons.ventus_shovel.description": "Obtenga una pala Ventus", + "advancements.immersiveweapons.ventus_hoe.title": "Herramientas de Ventus: Hoe", + "advancements.immersiveweapons.ventus_hoe.description": "Obtenga una manguera Ventus", "advancements.immersiveweapons.pretty_windy.title": "Bastante Windy", - "advancements.immersiveweapons.pretty_windy.description": "Obtener un conjunto completo de herramientas de ventus", + "advancements.immersiveweapons.pretty_windy.description": "Obtener un conjunto completo de herramientas de Ventus", "advancements.immersiveweapons.almost_flying.title": "Casi volando", - "advancements.immersiveweapons.almost_flying.description": "Use un conjunto completo de armadura de vento", + "advancements.immersiveweapons.almost_flying.description": "Use un conjunto completo de la armadura Ventus", "advancements.immersiveweapons.ventus_staff_core.title": "Energía eólica", - "advancements.immersiveweapons.ventus_staff_core.description": "Crear un núcleo de personal de ventus", + "advancements.immersiveweapons.ventus_staff_core.description": "Crear un núcleo de personal de Ventus", "advancements.immersiveweapons.ventus_staff.title": "Se fue con el viento", - "advancements.immersiveweapons.ventus_staff.description": "Crear un personal de ventus", + "advancements.immersiveweapons.ventus_staff.description": "Crear un personal de Ventus", "advancements.immersiveweapons.gauntlet.title": "Regla con un puño de hierro", "advancements.immersiveweapons.gauntlet.description": "Artesan cualquier gauntlet", "advancements.immersiveweapons.tiltros.warrior_statue.title": "Un Portal de Tierras Olvidadas", @@ -512,10 +549,60 @@ "advancements.immersiveweapons.tiltros.azul_keystone.description": "Artesanía una piedra angular Azul de fragmentos diseminados por todo el mundo", "advancements.immersiveweapons.tiltros.tiltros.title": "Bienvenido a Tiltros", "advancements.immersiveweapons.tiltros.tiltros.description": "Un paisaje devastado perdido en el espacio", + "advancements.immersiveweapons.copper_ingot.title": "Metales simples: cobre", + "advancements.immersiveweapons.copper_ingot.description": "Obtenga un enigma de cobre", + "advancements.immersiveweapons.copper_sword.title": "Herramientas de cobre: Espada", + "advancements.immersiveweapons.copper_sword.description": "Obtenga una espada de cobre", + "advancements.immersiveweapons.copper_pickaxe.title": "Herramientas de cobre: Pickaxe", + "advancements.immersiveweapons.copper_pickaxe.description": "Obtenga un pico de cobre", + "advancements.immersiveweapons.copper_axe.title": "Herramientas de cobre: Axe", + "advancements.immersiveweapons.copper_axe.description": "Obtenga un hacha de cobre", + "advancements.immersiveweapons.copper_shovel.title": "Herramientas de cobre: Zapato", + "advancements.immersiveweapons.copper_shovel.description": "Obtenga una pala de cobre", + "advancements.immersiveweapons.copper_hoe.title": "Herramientas de cobre: Hoe", + "advancements.immersiveweapons.copper_hoe.description": "Obtenga un cobre Hoe", + "advancements.immersiveweapons.copper_tools.title": "Lo suficiente como para herramientas de hierro", + "advancements.immersiveweapons.copper_tools.description": "Obtener un conjunto completo de herramientas de cobre", + "advancements.immersiveweapons.cobalt_ingot.title": "Metales simples: cobalto", + "advancements.immersiveweapons.cobalt_ingot.description": "Obtenga un ingot cobalto", + "advancements.immersiveweapons.cobalt_sword.title": "Herramientas de cobalto: Espada", + "advancements.immersiveweapons.cobalt_sword.description": "Obtenga una espada cobalto", + "advancements.immersiveweapons.cobalt_pickaxe.title": "Herramientas de cobalto: Pickaxe", + "advancements.immersiveweapons.cobalt_pickaxe.description": "Obtenga un pico cobalto", + "advancements.immersiveweapons.cobalt_axe.title": "Herramientas de cobalto: Axe", + "advancements.immersiveweapons.cobalt_axe.description": "Obtenga un Axe cobalto", + "advancements.immersiveweapons.cobalt_shovel.title": "Herramientas de cobalto: Shovel", + "advancements.immersiveweapons.cobalt_shovel.description": "Obtenga una pala de cobalto", + "advancements.immersiveweapons.cobalt_hoe.title": "Herramientas de cobalto: Hoe", + "advancements.immersiveweapons.cobalt_hoe.description": "Obtenga un cobalto Hoe", + "advancements.immersiveweapons.cobalt_tools.title": "¿Quién necesita herramientas de hierro", + "advancements.immersiveweapons.cobalt_tools.description": "Obtener un conjunto completo de herramientas de cobalto", + "advancements.immersiveweapons.gold_ingot.title": "Metales simples: oro", + "advancements.immersiveweapons.gold_ingot.description": "Obtenga un enigma de oro", + "advancements.immersiveweapons.netherite_ingot.title": "Los diamantes son para los campesinos", + "advancements.immersiveweapons.netherite_ingot.description": "Obtenga un enigma netherita", + "advancements.immersiveweapons.ingots.title": "¡Ingots!", + "advancements.immersiveweapons.ingots.description": "Obtenga cualquier ingot", + "advancements.immersiveweapons.nuggets.title": "Nuggets!", + "advancements.immersiveweapons.nuggets.description": "Obtenga cualquier nugget", + "advancements.immersiveweapons.planks.title": "¡Plantas!", + "advancements.immersiveweapons.planks.description": "Obtenga cualquier plank", + "advancements.immersiveweapons.mud.title": "¡Mud!", + "advancements.immersiveweapons.mud.description": "Obtenga un bloque de barro", + "advancements.immersiveweapons.bamboo.title": "Ladrón", + "advancements.immersiveweapons.bamboo.description": "Obtener bambú", + "advancements.immersiveweapons.cloud_marble.title": "Parece mejor que Diorite", + "advancements.immersiveweapons.cloud_marble.description": "Obtenga un bloque de mármol de la nube", + "advancements.immersiveweapons.biohazard_box.title": "¿Peligroso?", + "advancements.immersiveweapons.biohazard_box.description": "Obtenga una caja de biohazard (sin dolor) de una estación médica", + "advancements.immersiveweapons.cloud.title": "Alto en el cielo", + "advancements.immersiveweapons.cloud.description": "Camina a través de bloques de nubes en el aire", "biome.immersiveweapons.battlefield": "Battlefield", "loot.immersiveweapons.chest.village.battlefield.medic_station.iron_axe": "El Amputador", "immersiveweapons.boss.celestial_tower.waves": "Porcentajes de onda de %s", + "immersiveweapons.encyclopedia.landing": "Las armas inmersivas son ($m)a weapons mod($) más que un mod de armas que pretende aumentar tus habilidades de combate.$(br2)La enciclopedia es tu solución de ir a buscar información.", "config.immersiveweapons.tesla_armor_effect_sound": "Activar el sonido del efecto de armadura Tesla - Default true", + "config.immersiveweapons.panic_alarm_range": "Establecer el rango del sonido del Alarma Panic - Predeterminado 48", "config.immersiveweapons.max_smoke_bomb_particles": "Establecer el número máximo de partículas producidas por la bomba de humo - Predeterminado 96\nConfiguración de esto más alto puede hacer que los clientes perrito, configurando a 0 efectivamente deshabilitarlo", "config.immersiveweapons.bullets_break_glass": "Permitir las balas que rompen vidrio - Por defecto verdad", "config.immersiveweapons.tiltros_enabled": "Activar el portal de dimensión Tiltros - Default true", diff --git a/src/main/resources/assets/immersiveweapons/lang/ru_ru.json b/src/main/resources/assets/immersiveweapons/lang/ru_ru.json index 9223a50b7..e9f56c99d 100644 --- a/src/main/resources/assets/immersiveweapons/lang/ru_ru.json +++ b/src/main/resources/assets/immersiveweapons/lang/ru_ru.json @@ -17,7 +17,6 @@ "item.immersiveweapons.copper_axe": "Медь Axe", "item.immersiveweapons.copper_shovel": "Медный Шовел", "item.immersiveweapons.copper_hoe": "Медный Hoe", - "item.immersiveweapons.molten_plate": "Молтеновая тарелка", "item.immersiveweapons.molten_helmet": "Молтен Шлем", "item.immersiveweapons.molten_chestplate": "Молтен Честпл", "item.immersiveweapons.molten_leggings": "Молтен Леггинсы", @@ -35,7 +34,6 @@ "item.immersiveweapons.tesla_chestplate": "Тесла Chestplate", "item.immersiveweapons.tesla_leggings": "Tesla Леггинсы", "item.immersiveweapons.tesla_boots": "Tesla Сапоги", - "item.immersiveweapons.tesla_plate": "Tesla пластина", "item.immersiveweapons.iron_pike": "Железный поход", "item.immersiveweapons.iron_pike_head": "Железная головка Pike", "item.immersiveweapons.diamond_pike": "Алмазный пайк", @@ -45,20 +43,20 @@ "item.immersiveweapons.stone_pike": "Камень Pike", "item.immersiveweapons.stone_shard": "Каменный Шард", "item.immersiveweapons.stone_pike_head": "Каменная головка Pike", - "item.immersiveweapons.wood_pike": "Древесина Pike", - "item.immersiveweapons.wood_pike_head": "Wood Pike Голова", - "item.immersiveweapons.wood_shard": "Дерево Shard", + "item.immersiveweapons.wood_pike": "Деревянный поход", + "item.immersiveweapons.wood_pike_head": "Деревянная головка Pike", + "item.immersiveweapons.wood_shard": "Деревянный Шард", "item.immersiveweapons.gold_pike": "Золотой пайк", - "item.immersiveweapons.gold_pike_head": "Голая головка Gold Pike", + "item.immersiveweapons.gold_pike_head": "Голова Золотая похода", "item.immersiveweapons.iron_arrow": "Железная стрелка", "item.immersiveweapons.diamond_arrow": "Алмазная стрелка", - "item.immersiveweapons.gold_arrow": "Золотой стрелки", + "item.immersiveweapons.gold_arrow": "Золотой Стрел", "item.immersiveweapons.stone_arrow": "Каменная стрелка", - "item.immersiveweapons.wood_arrow": "Дерево Arrow", + "item.immersiveweapons.wood_arrow": "Деревянная стрелка", "item.immersiveweapons.netherite_arrow": "Netherite Стрелки", "item.immersiveweapons.flintlock_pistol": "Flintlock Пистолет", "item.immersiveweapons.copper_musket_ball": "Медный мушкетный бал", - "item.immersiveweapons.wood_musket_ball": "Дерево Мушкет Бал", + "item.immersiveweapons.wood_musket_ball": "Деревянный мушкетный бал", "item.immersiveweapons.stone_musket_ball": "Каменный мушкетный бал", "item.immersiveweapons.iron_musket_ball": "Железный мушкетный шар", "item.immersiveweapons.gold_musket_ball": "Золотой мушкетный бал", @@ -99,14 +97,14 @@ "item.immersiveweapons.dying_soldier_spawn_egg": "Dying Soldier Spawn Яйцо", "item.immersiveweapons.minuteman_spawn_egg": "Минутман Spawn Яйцо", "item.immersiveweapons.bandage": "Бандаж", - "item.immersiveweapons.mre": "Питание Ready-To-Eat (MRE)", + "item.immersiveweapons.mre": "Питание Ready-to-Eat (MRE)", "item.immersiveweapons.painkillers": "Пайникеры", "item.immersiveweapons.syringe": "Шприц", "item.immersiveweapons.morphine": "Морфина", "item.immersiveweapons.used_syringe": "Использованный Syringe", "item.immersiveweapons.first_aid_kit": "Первый набор помощи", "item.immersiveweapons.field_medic_spawn_egg": "Поле Медик Spawn Яйцо", - "item.immersiveweapons.raw_cobalt": "Сырье Cobalt", + "item.immersiveweapons.raw_cobalt": "Блок сырого кобальта", "item.immersiveweapons.cobalt_ingot": "Кобальт Ingot", "item.immersiveweapons.cobalt_sword": "Кобальт Меч", "item.immersiveweapons.cobalt_pickaxe": "Кобальт Pickaxe", @@ -143,9 +141,9 @@ "item.immersiveweapons.burned_oak_boat": "Сожженная дубовая лодка", "item.immersiveweapons.gauntlet_scaffolding": "Гаунтлет Scaffolding", "item.immersiveweapons.gauntlet_scaffolding_blueprint": "Гаунтлет Scaffolding Синий отпечаток", - "item.immersiveweapons.wood_gauntlet": "Дерево Gauntlet", + "item.immersiveweapons.wood_gauntlet": "Деревянный Гаунтлет", "item.immersiveweapons.stone_gauntlet": "Каменный гаунтлет", - "item.immersiveweapons.gold_gauntlet": "Золотой Гаунтлет", + "item.immersiveweapons.gold_gauntlet": "Золотой Гаунтетлет", "item.immersiveweapons.copper_gauntlet": "Медный Гаунтлет", "item.immersiveweapons.iron_gauntlet": "Железнодорожный Гаунтет", "item.immersiveweapons.cobalt_gauntlet": "Кобальт Гаунтлет", @@ -159,6 +157,7 @@ "item.immersiveweapons.sulfur": "Сульфур", "item.immersiveweapons.celestial_tower_spawn_egg": "Селесная башня Spawn Egg", "item.immersiveweapons.celestial_fragment": "Селесная Фрагмент", + "item.immersiveweapons.encyclopedia": "Энциклопедия", "block.immersiveweapons.molten_ore": "Молтен Оре", "block.immersiveweapons.molten_block": "Молтен Блок", "block.immersiveweapons.electric_ore": "Электрические Ore", @@ -195,7 +194,15 @@ "block.immersiveweapons.spotlight": "Spotlight", "block.immersiveweapons.wall_shelf": "Стена Shelf", "block.immersiveweapons.panic_alarm": "Panic Сигнал тревоги", - "block.immersiveweapons.wooden_table": "Деревянный стол", + "block.immersiveweapons.oak_table": "Дубовый стол", + "block.immersiveweapons.spruce_table": "Spruce стол", + "block.immersiveweapons.birch_table": "Стол Birch", + "block.immersiveweapons.jungle_table": "Стол джунглей", + "block.immersiveweapons.acacia_table": "Acacia Таблица", + "block.immersiveweapons.dark_oak_table": "Темный дубовый стол", + "block.immersiveweapons.crimson_table": "Таблица Crimson", + "block.immersiveweapons.warped_table": "Теплый стол", + "block.immersiveweapons.burned_oak_table": "Сожженный дубовый стол", "block.immersiveweapons.barbed_wire_fence": "Забор с барбекю", "block.immersiveweapons.wooden_spikes": "Деревянные походы", "block.immersiveweapons.biohazard_box": "Biohazard коробка", @@ -253,6 +260,7 @@ "block.immersiveweapons.celestial_lantern": "Селесный фонарь", "block.immersiveweapons.deepslate_cobalt_ore": "Глубокий кобальт Ore", "block.immersiveweapons.deepslate_sulfur_ore": "Глубокий серы Ore", + "block.immersiveweapons.raw_sulfur_block": "Блок сырой серы", "entity.immersiveweapons.dying_soldier": "Умирая солдат", "entity.immersiveweapons.minuteman": "Минутман", "entity.immersiveweapons.field_medic": "Поле Медик", @@ -260,7 +268,7 @@ "entity.immersiveweapons.hans": "Ханс Всемогущий", "entity.immersiveweapons.wood_arrow": "Дерево Arrow", "entity.immersiveweapons.stone_arrow": "Каменная стрелка", - "entity.immersiveweapons.gold_arrow": "Золотой стрелки", + "entity.immersiveweapons.gold_arrow": "Золотой Стрел", "entity.immersiveweapons.copper_arrow": "Медная стрелка", "entity.immersiveweapons.iron_arrow": "Железная стрелка", "entity.immersiveweapons.cobalt_arrow": "Кобальт Арро", @@ -286,12 +294,13 @@ "entity.immersiveweapons.rock_spider": "Рок Паук", "entity.immersiveweapons.celestial_tower": "Селесная башня", "effect.immersiveweapons.morphine": "Морфина", - "effect.immersiveweapons.bleeding": "Внутреннее стекло", + "effect.immersiveweapons.bleeding": "Блединг", "effect.immersiveweapons.alcohol": "Алкоголь", "container.immersiveweapons.small_parts_table": "Мелкие детали Crafting", "container.immersiveweapons.tesla_synthesizer": "Тесла Синтезирование", "gui.jei.category.small_parts": "Мелкие детали Crafting", "gui.jei.category.tesla_synthesizer": "Тесла Синтезирование", + "immersiveweapons.subtitle.armor.tesla.equip": "Tesla брони кланы", "immersiveweapons.subtitle.armor.tesla.effect": "Tesla брони заплата", "immersiveweapons.subtitle.armor.tesla.power_down": "Тесла броня отключается", "immersiveweapons.subtitle.armor.tesla.power_up": "Тесла броня поворачивает дальше", @@ -306,9 +315,8 @@ "immersiveweapons.subtitle.block.bear_trap_close": "Медведь ловушка закрывается", "immersiveweapons.subtitle.block.spike_trap_extend": "Шоу ловушку удлиняет", "immersiveweapons.subtitle.block.spike_trap_retract": "Шоу ловушку оттягивает", - "immersiveweapons.subtitle.block.alarm.alarm_1": "Звуки тревоги", - "immersiveweapons.subtitle.block.alarm.alarm_2": "Звуки тревоги", - "immersiveweapons.subtitle.block.alarm.alarm_3": "Звуки тревоги", + "immersiveweapons.subtitle.block.alarm.panic_alarm": "Звуки тревоги", + "immersiveweapons.subtitle.block.mortar.fire": "Мортарные пожары", "immersiveweapons.subtitle.entity.dying_soldier.ambient": "Солдат говоря", "immersiveweapons.subtitle.entity.dying_soldier.step": "Солдатные прогулки", "immersiveweapons.subtitle.entity.dying_soldier.death": "Солдат умер", @@ -336,9 +344,6 @@ "immersiveweapons.subtitle.entity.celestial_tower.death": "Селесная башня рухнет", "immersiveweapons.subtitle.entity.celestial_tower.summon": "Селесарные башни", "immersiveweapons.subtitle.entity.celestial_tower.vulnerable": "Селесная башня становится уязвимой", - "immersiveweapons.block.alarm.alarm1": "В настоящее время установка тревоги: аварийная оповещение", - "immersiveweapons.block.alarm.alarm2": "В настоящее время установлена сигнализация: местная оповещения", - "immersiveweapons.block.alarm.alarm3": "В настоящее время установка сигнализации: широкий район оповещения", "immersiveweapons.item.first_aid_kit": "Вы должны быть на или ниже половину здоровья, чтобы использовать это", "immersiveweapons.tooltip.molten_sword": "Убейте его с огнем", "immersiveweapons.tooltip.tesla_sword": "Обеспечивает довольно шокирующий опыт", @@ -372,7 +377,7 @@ "immersiveweapons.tooltip.smoke_bomb_blue": "Это один выпускает синий дым.", "immersiveweapons.tooltip.smoke_bomb_purple": "Это один выпускает фиолетовый дым.", "immersiveweapons.tooltip.smoke_bomb_yellow": "Это один выпускает желтый дым.", - "immersiveweapons.tooltip.molotov_cocktail": "Создает кольцо огня на удар. Самое лучшее используемое при бросить на плоской земле.", + "immersiveweapons.tooltip.molotov_cocktail": "Создает кольцо огня на удар.", "immersiveweapons.tooltip.bottle_of_alcohol": "Вы можете выпить это, но вы будете неприятными. Очень огнеопасный!", "immersiveweapons.tooltip.bottle_of_wine": "Расслабляющее сочетание сладких ягод", "immersiveweapons.tooltip.punji_sticks": "Обязательные военные преступления с использованием Вьетнамской войны тактики", @@ -391,14 +396,14 @@ "immersiveweapons.tooltip.hans_spawn_egg": "Суммон Ханс Всемогущий в этот мир", "immersiveweapons.tooltip.flare_gun": "Запустите яркие недостатки в небо", "immersiveweapons.tooltip.gauntlet": "Побить жизнь из ваших оппонентов.", - "immersiveweapons.tooltip.wood_gauntlet": "Имеет 15% шанс на причинение внутреннего кровотечения.", - "immersiveweapons.tooltip.stone_gauntlet": "Имеет 25% шанс на причинение внутреннего кровотечения.", - "immersiveweapons.tooltip.gold_gauntlet": "Имеет шанс 35% нанести Внутренний Блединг.", - "immersiveweapons.tooltip.copper_gauntlet": "Имеет шанс 45% нанести внутреннюю смелость.", - "immersiveweapons.tooltip.iron_gauntlet": "Имеет шанс 55% нанести внутреннюю смелость.", - "immersiveweapons.tooltip.cobalt_gauntlet": "Имеет 60% шанс на причинение внутреннего кровотечения.", - "immersiveweapons.tooltip.diamond_gauntlet": "Имеет шанс на 75% нанести внутреннюю слепую.", - "immersiveweapons.tooltip.netherite_gauntlet": "Имеет шанс на 85% нанести внутреннюю смелость.", + "immersiveweapons.tooltip.wood_gauntlet": "Имеет 15% шанс на причинение Bleeding.", + "immersiveweapons.tooltip.stone_gauntlet": "Имеет 25% шанс нанести Блединг.", + "immersiveweapons.tooltip.gold_gauntlet": "Имеет шанс 35% нанести Блединг.", + "immersiveweapons.tooltip.copper_gauntlet": "Имеет шанс 45% нанести Блединг.", + "immersiveweapons.tooltip.iron_gauntlet": "Имеет шанс 55% нанести Блединг.", + "immersiveweapons.tooltip.cobalt_gauntlet": "Имеет 60% шанс на причинение Bleeding.", + "immersiveweapons.tooltip.diamond_gauntlet": "Имеет 75% шанс на причинение слепых.", + "immersiveweapons.tooltip.netherite_gauntlet": "Имеет шанс 85% нанести Блединг.", "immersiveweapons.tooltip.bandage": "Обложка эти неприятные ломтики и ломы", "immersiveweapons.tooltip.painkillers": "Не чувствуйте никакой боли с скопирующим количеством таблеток", "immersiveweapons.tooltip.mre": "Вкусы отвратительные, но, по крайней мере, вы не будете голодны на некоторое время", @@ -433,13 +438,21 @@ "advancements.immersiveweapons.root.title": "Иммерсивное оружие", "advancements.immersiveweapons.root.description": "Проведите свои боевые навыки", "advancements.immersiveweapons.molten_shard.title": "Горячий металл", - "advancements.immersiveweapons.molten_shard.description": "Получить расплавленные сараи", + "advancements.immersiveweapons.molten_shard.description": "Получить Молтен бород", "advancements.immersiveweapons.molten_ingot.title": "Лава Фордж", - "advancements.immersiveweapons.molten_ingot.description": "Smelt расплавленный ingot", + "advancements.immersiveweapons.molten_ingot.description": "Smelt a Molten ingot", "advancements.immersiveweapons.molten_sword.title": "Убейте его с огнем", - "advancements.immersiveweapons.molten_sword.description": "Поделитесь мечом молтена", + "advancements.immersiveweapons.molten_sword.description": "Смелый меч", + "advancements.immersiveweapons.molten_pickaxe.title": "Молтен Инструменты: Pickaxe", + "advancements.immersiveweapons.molten_pickaxe.description": "Смелый пикакси", + "advancements.immersiveweapons.molten_axe.title": "Молтен Инструменты: Axe", + "advancements.immersiveweapons.molten_axe.description": "Ремесло a Molten axe", + "advancements.immersiveweapons.molten_shovel.title": "Молтен Инструменты: Shovel", + "advancements.immersiveweapons.molten_shovel.description": "Ремесло Молтен Шовель", + "advancements.immersiveweapons.molten_hoe.title": "Молтен Инструменты: Хой", + "advancements.immersiveweapons.molten_hoe.description": "Ремесло молтен туфель", "advancements.immersiveweapons.play_with_fire.title": "Играть с огнем", - "advancements.immersiveweapons.play_with_fire.description": "Получить каждый molten инструмент", + "advancements.immersiveweapons.play_with_fire.description": "Получите каждый инструмент Molten", "advancements.immersiveweapons.molten_plate.title": "Лава Блэксмит", "advancements.immersiveweapons.molten_plate.description": "Поделитесь моленой пластиной", "advancements.immersiveweapons.warm_and_toasty.title": "Теплый и тостый", @@ -453,17 +466,23 @@ "advancements.immersiveweapons.electric_ingot.title": "Электричество: Часть 2", "advancements.immersiveweapons.electric_ingot.description": "Получить электрическую ингот, редкий и мощный источник энергии", "advancements.immersiveweapons.tesla_ingot.title": "Электричество: Финальная Сага", - "advancements.immersiveweapons.tesla_ingot.description": "Получить tesla ingot, ответ на ваши требования к массовой энергии", + "advancements.immersiveweapons.tesla_ingot.description": "Получить Tesla ingot, ответ на ваши требования к энергии", "advancements.immersiveweapons.tesla_sword.title": "Шокирующий опыт", - "advancements.immersiveweapons.tesla_sword.description": "Получить меч tesla", + "advancements.immersiveweapons.tesla_sword.description": "Получить меч Тесла", + "advancements.immersiveweapons.tesla_pickaxe.title": "Инструменты Tesla: Pickaxe", + "advancements.immersiveweapons.tesla_pickaxe.description": "Получить Tesla pickaxe", + "advancements.immersiveweapons.tesla_axe.title": "Инструменты Tesla: Axe", + "advancements.immersiveweapons.tesla_axe.description": "Получить Tesla axe", + "advancements.immersiveweapons.tesla_shovel.title": "Инструменты Tesla: Шовель", + "advancements.immersiveweapons.tesla_shovel.description": "Получить Tesla shovel", + "advancements.immersiveweapons.tesla_hoe.title": "Инструменты Tesla: Хой", + "advancements.immersiveweapons.tesla_hoe.description": "Уничтожьте свое богатство, получив обувь Tesla", "advancements.immersiveweapons.energized.title": "Энергетика", - "advancements.immersiveweapons.energized.description": "Получить полный набор инструментов tesla", - "advancements.immersiveweapons.rich_no_more.title": "Не богатый больше", - "advancements.immersiveweapons.rich_no_more.description": "Уничтожьте свое богатство, получив tesla hoe", + "advancements.immersiveweapons.energized.description": "Получить полный набор инструментов Tesla", "advancements.immersiveweapons.tesla_coil.title": "Может быть, я катушка Tesla", - "advancements.immersiveweapons.tesla_coil.description": "Носите полный набор tesla armor", + "advancements.immersiveweapons.tesla_coil.description": "Носите полный набор брони Tesla", "advancements.immersiveweapons.tesla_synthesizer.title": "Я гений слишком", - "advancements.immersiveweapons.tesla_synthesizer.description": "Ремесло синтезатор tesla", + "advancements.immersiveweapons.tesla_synthesizer.description": "Ремесло синтезатор Тесла", "advancements.immersiveweapons.tool_rod.title": "Сильная палочка", "advancements.immersiveweapons.tool_rod.description": "Поверните деревянный стержень.", "advancements.immersiveweapons.pike.title": "Длинная дистанция стабинг", @@ -476,6 +495,16 @@ "advancements.immersiveweapons.blunderbuss.description": "Поделитесь с бродбами", "advancements.immersiveweapons.shards.title": "Шарп Шрапнель", "advancements.immersiveweapons.shards.description": "Получить любой бород", + "advancements.immersiveweapons.wood_shard.title": "Шарды: Wood", + "advancements.immersiveweapons.wood_shard.description": "Получить деревянный бокал", + "advancements.immersiveweapons.stone_shard.title": "Шарды: Stone", + "advancements.immersiveweapons.stone_shard.description": "Получить каменный бород", + "advancements.immersiveweapons.diamond_shard.title": "Шарды: Diamond", + "advancements.immersiveweapons.diamond_shard.description": "Получить алмазный щит", + "advancements.immersiveweapons.obsidian_shard.title": "Шарды: Obsidian", + "advancements.immersiveweapons.obsidian_shard.description": "Получить обсидианскую скорую", + "advancements.immersiveweapons.musket_ball.title": "Пов!", + "advancements.immersiveweapons.musket_ball.description": "Получить любой мускетный шар", "advancements.immersiveweapons.netherite_projectile.title": "Увеличить деньги", "advancements.immersiveweapons.netherite_projectile.description": "Получить сетевой стрелки и мушкет мяч", "advancements.immersiveweapons.smoke_bomb.title": "Достопримечательности Отклонить", @@ -493,17 +522,25 @@ "advancements.immersiveweapons.traps.title": "Продвинутый Warfare", "advancements.immersiveweapons.traps.description": "Получить любую ловушку", "advancements.immersiveweapons.ventus_shard.title": "Крутые Шарды", - "advancements.immersiveweapons.ventus_shard.description": "Получить ventus shards", + "advancements.immersiveweapons.ventus_shard.description": "Получить Вентус-хардс", "advancements.immersiveweapons.ventus_sword.title": "Кто", - "advancements.immersiveweapons.ventus_sword.description": "Поделитесь мечом ventus", + "advancements.immersiveweapons.ventus_sword.description": "Craft вентус меч", + "advancements.immersiveweapons.ventus_pickaxe.title": "Инструменты Ventus: Pickaxe", + "advancements.immersiveweapons.ventus_pickaxe.description": "Получить Ventus pickaxe", + "advancements.immersiveweapons.ventus_axe.title": "Инструменты Ventus: Axe", + "advancements.immersiveweapons.ventus_axe.description": "Получить Ventus axe", + "advancements.immersiveweapons.ventus_shovel.title": "Инструменты Ventus: Шовель", + "advancements.immersiveweapons.ventus_shovel.description": "Получить Вентус Шовель", + "advancements.immersiveweapons.ventus_hoe.title": "Инструменты Ventus: Хой", + "advancements.immersiveweapons.ventus_hoe.description": "Получить Вентус туфель", "advancements.immersiveweapons.pretty_windy.title": "Красота Windy", - "advancements.immersiveweapons.pretty_windy.description": "Получить полный набор инструментов ventus", + "advancements.immersiveweapons.pretty_windy.description": "Получить полный набор инструментов Ventus", "advancements.immersiveweapons.almost_flying.title": "Почти летать", - "advancements.immersiveweapons.almost_flying.description": "Носите полный набор ventus armor", + "advancements.immersiveweapons.almost_flying.description": "Носите полный набор брони Ventus", "advancements.immersiveweapons.ventus_staff_core.title": "Ветроэнергетика", - "advancements.immersiveweapons.ventus_staff_core.description": "Поделитесь ядро персонала ventus", + "advancements.immersiveweapons.ventus_staff_core.description": "Craft вентус сотрудники ядро", "advancements.immersiveweapons.ventus_staff.title": "Кость с ветром", - "advancements.immersiveweapons.ventus_staff.description": "Поделитесь вентусом персонала", + "advancements.immersiveweapons.ventus_staff.description": "Поделитесь персоналом Ventus", "advancements.immersiveweapons.gauntlet.title": "Правило с Железным Фистом", "advancements.immersiveweapons.gauntlet.description": "Поделитесь любой гаунтлетом", "advancements.immersiveweapons.tiltros.warrior_statue.title": "Портал для забытой земли", @@ -512,10 +549,60 @@ "advancements.immersiveweapons.tiltros.azul_keystone.description": "Поделитесь азульским камнем из фрагментов, разбросанных по всему миру", "advancements.immersiveweapons.tiltros.tiltros.title": "Добро пожаловать в Tiltros", "advancements.immersiveweapons.tiltros.tiltros.description": "Опустошенный пейзаж, потерянный в пространстве", + "advancements.immersiveweapons.copper_ingot.title": "Простые металлы: медь", + "advancements.immersiveweapons.copper_ingot.description": "Получить медный ингот", + "advancements.immersiveweapons.copper_sword.title": "Медные инструменты: Sword", + "advancements.immersiveweapons.copper_sword.description": "Получить медный меч", + "advancements.immersiveweapons.copper_pickaxe.title": "Медные инструменты: Pickaxe", + "advancements.immersiveweapons.copper_pickaxe.description": "Получить медный пикакси", + "advancements.immersiveweapons.copper_axe.title": "Медные инструменты: Axe", + "advancements.immersiveweapons.copper_axe.description": "Получить медную оси", + "advancements.immersiveweapons.copper_shovel.title": "Медные инструменты: Shovel", + "advancements.immersiveweapons.copper_shovel.description": "Получить медный шовель", + "advancements.immersiveweapons.copper_hoe.title": "Медные инструменты: Хой", + "advancements.immersiveweapons.copper_hoe.description": "Получить медь Хой", + "advancements.immersiveweapons.copper_tools.title": "Закрыть достаточно железных инструментов", + "advancements.immersiveweapons.copper_tools.description": "Получить полный набор медных инструментов", + "advancements.immersiveweapons.cobalt_ingot.title": "Простые металлы: Cobalt", + "advancements.immersiveweapons.cobalt_ingot.description": "Получить кобальтовый ingot", + "advancements.immersiveweapons.cobalt_sword.title": "Инструменты Cobalt: Меч", + "advancements.immersiveweapons.cobalt_sword.description": "Получить кобальтный меч", + "advancements.immersiveweapons.cobalt_pickaxe.title": "Инструменты кобальта: Pickaxe", + "advancements.immersiveweapons.cobalt_pickaxe.description": "Получить кобальт пикакс", + "advancements.immersiveweapons.cobalt_axe.title": "Инструменты кобальта: Axe", + "advancements.immersiveweapons.cobalt_axe.description": "Получить кобальт Axe", + "advancements.immersiveweapons.cobalt_shovel.title": "Инструменты Cobalt: Шовель", + "advancements.immersiveweapons.cobalt_shovel.description": "Получить кобальтовый шовель", + "advancements.immersiveweapons.cobalt_hoe.title": "Инструменты Cobalt: Хой", + "advancements.immersiveweapons.cobalt_hoe.description": "Получить кобальт Хой", + "advancements.immersiveweapons.cobalt_tools.title": "Кому нужны железные инструменты", + "advancements.immersiveweapons.cobalt_tools.description": "Получить полный набор кобальтных инструментов", + "advancements.immersiveweapons.gold_ingot.title": "Простые металлы: Золото", + "advancements.immersiveweapons.gold_ingot.description": "Получить золотой ingot", + "advancements.immersiveweapons.netherite_ingot.title": "Бриллианты для крестьян", + "advancements.immersiveweapons.netherite_ingot.description": "Получить чистый ингот", + "advancements.immersiveweapons.ingots.title": "Забыли!", + "advancements.immersiveweapons.ingots.description": "Получить любой ingot", + "advancements.immersiveweapons.nuggets.title": "Нугеты!", + "advancements.immersiveweapons.nuggets.description": "Получить любой nugget", + "advancements.immersiveweapons.planks.title": "Планки!", + "advancements.immersiveweapons.planks.description": "Получить любой планк", + "advancements.immersiveweapons.mud.title": "Муд!", + "advancements.immersiveweapons.mud.description": "Получить грязевой блок", + "advancements.immersiveweapons.bamboo.title": "Толстые травы", + "advancements.immersiveweapons.bamboo.description": "Получить бамбук", + "advancements.immersiveweapons.cloud_marble.title": "Выглядит лучше, чем Diorite", + "advancements.immersiveweapons.cloud_marble.description": "Получить блок облачного мрамора", + "advancements.immersiveweapons.biohazard_box.title": "Опасно?", + "advancements.immersiveweapons.biohazard_box.description": "Получить (безвредную) биоопасную коробку от медицинской станции", + "advancements.immersiveweapons.cloud.title": "Высокая в небе", + "advancements.immersiveweapons.cloud.description": "Прогулка через облачные блоки высоко в воздухе", "biome.immersiveweapons.battlefield": "Battlefield", "loot.immersiveweapons.chest.village.battlefield.medic_station.iron_axe": "Ампутатор", "immersiveweapons.boss.celestial_tower.waves": "Волна %s %s", + "immersiveweapons.encyclopedia.landing": "Иммерсивное Оружие ($м) мод оружия ($) больше, чем просто мод оружия, стремящийся подчеркнуть свои боевые навыки.$(br2)The Encyclopedia - ваше решение для поиска информации.", "config.immersiveweapons.tesla_armor_effect_sound": "Включите звук эффекта Tesla Armor - По умолчанию true", + "config.immersiveweapons.panic_alarm_range": "Установите диапазон звука Panic Alarm - По умолчанию 48", "config.immersiveweapons.max_smoke_bomb_particles": "Установите максимальное количество частиц, производимых дымовой бомбой - Default 96\nНастройка этого выше может сделать клиентов лагги, настройка для 0 эффективно отключает его", "config.immersiveweapons.bullets_break_glass": "Включить пули разбивного стекла - По умолчанию true", "config.immersiveweapons.tiltros_enabled": "Включите портал размеров Tiltros - По умолчанию true", diff --git a/src/main/resources/assets/immersiveweapons/models/armor/copper_boots.json b/src/main/resources/assets/immersiveweapons/models/armor/copper_boots.json deleted file mode 100644 index 76e0b69e1..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/copper_boots.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/copper_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/copper_chestplate.json b/src/main/resources/assets/immersiveweapons/models/armor/copper_chestplate.json deleted file mode 100644 index 76e0b69e1..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/copper_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/copper_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/copper_helmet.json b/src/main/resources/assets/immersiveweapons/models/armor/copper_helmet.json deleted file mode 100644 index 76e0b69e1..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/copper_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/copper_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/copper_leggings.json b/src/main/resources/assets/immersiveweapons/models/armor/copper_leggings.json deleted file mode 100644 index 8da30bbb4..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/copper_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/copper_layer_2" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/molten_boots.json b/src/main/resources/assets/immersiveweapons/models/armor/molten_boots.json deleted file mode 100644 index b4ce20c89..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/molten_boots.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/molten_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/molten_chestplate.json b/src/main/resources/assets/immersiveweapons/models/armor/molten_chestplate.json deleted file mode 100644 index b4ce20c89..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/molten_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/molten_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/molten_helmet.json b/src/main/resources/assets/immersiveweapons/models/armor/molten_helmet.json deleted file mode 100644 index b4ce20c89..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/molten_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/molten_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/molten_leggings.json b/src/main/resources/assets/immersiveweapons/models/armor/molten_leggings.json deleted file mode 100644 index 3ca53ad26..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/molten_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/molten_layer_2" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/tesla_boots.json b/src/main/resources/assets/immersiveweapons/models/armor/tesla_boots.json deleted file mode 100644 index b66dfc885..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/tesla_boots.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/tesla_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/tesla_chestplate.json b/src/main/resources/assets/immersiveweapons/models/armor/tesla_chestplate.json deleted file mode 100644 index b66dfc885..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/tesla_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/tesla_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/tesla_helmet.json b/src/main/resources/assets/immersiveweapons/models/armor/tesla_helmet.json deleted file mode 100644 index b66dfc885..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/tesla_helmet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/tesla_layer_1" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/armor/tesla_leggings.json b/src/main/resources/assets/immersiveweapons/models/armor/tesla_leggings.json deleted file mode 100644 index 2f7997902..000000000 --- a/src/main/resources/assets/immersiveweapons/models/armor/tesla_leggings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "immersiveweapons:armor/tesla_layer_2" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/acacia_table.json b/src/main/resources/assets/immersiveweapons/models/block/acacia_table.json new file mode 100644 index 000000000..c8c2cc5fe --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/acacia_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/acacia_planks", + "particle": "minecraft:block/acacia_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/birch_table.json b/src/main/resources/assets/immersiveweapons/models/block/birch_table.json new file mode 100644 index 000000000..76f42445c --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/birch_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/birch_planks", + "particle": "minecraft:block/birch_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/burned_oak_table.json b/src/main/resources/assets/immersiveweapons/models/block/burned_oak_table.json new file mode 100644 index 000000000..2d2525cb0 --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/burned_oak_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "immersiveweapons:block/burned_oak_planks", + "particle": "immersiveweapons:block/burned_oak_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel.json b/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel.json index c69391f70..35a941683 100644 --- a/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel.json +++ b/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel.json @@ -1,1141 +1,58 @@ { "credit": "Made with Blockbench", "textures": { - "0": "minecraft:block/iron_block", - "particle": "minecraft:block/iron_block" + "0": "immersiveweapons:block/corrugated_iron", + "particle": "immersiveweapons:block/corrugated_iron" }, "elements": [ { - "from": [ - 0, - 0, - 0.5 - ], - "to": [ - 16, - 16, - 1.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 8.5 - ] - }, + "from": [0, 0, 0.25], + "to": [16, 16, 1.75], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8.5]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 15, - 0, - 0 - ], - "to": [ - 16, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 23, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 1, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 3, - 0, - 0 - ], - "to": [ - 4, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 11, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 6, - 0, - 0 - ], - "to": [ - 7, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 14, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 9, - 0, - 0 - ], - "to": [ - 10, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 17, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 12, - 0, - 0 - ], - "to": [ - 13, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 20, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 15, - 0, - 1.5 - ], - "to": [ - 16, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 23, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 0, - 1.5 - ], - "to": [ - 1, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 3, - 0, - 1.5 - ], - "to": [ - 4, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 11, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 6, - 0, - 1.5 - ], - "to": [ - 7, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 14, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 9, - 0, - 1.5 - ], - "to": [ - 10, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 17, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 12, - 0, - 1.5 - ], - "to": [ - 13, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 20, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } + "north": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 1], "texture": "#0"} } } ], "display": { "thirdperson_righthand": { - "translation": [ - 0, - 0, - 3.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 0, 3.5], + "scale": [0.5, 0.5, 0.5] }, "thirdperson_lefthand": { - "translation": [ - 0, - 0, - 3.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 0, 3.5], + "scale": [0.5, 0.5, 0.5] }, "firstperson_righthand": { - "translation": [ - 6.5, - -6.75, - 0 - ] + "translation": [6.5, -6.75, 0] }, "firstperson_lefthand": { - "translation": [ - 6.5, - -6.75, - 0 - ] + "translation": [6.5, -6.75, 0] }, "ground": { - "translation": [ - 0, - 0.25, - 3.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 0.25, 3.5], + "scale": [0.5, 0.5, 0.5] }, "gui": { - "rotation": [ - -9.5, - 25.5, - 2 - ], - "translation": [ - 2.25, - 0.25, - 0 - ], - "scale": [ - 0.75, - 0.75, - 0.75 - ] + "rotation": [-9.5, 25.5, 2], + "translation": [2.25, 0.25, 0], + "scale": [0.75, 0.75, 0.75] }, "fixed": { - "translation": [ - 0, - 0, - 6 - ] + "translation": [0, 0, 6] } }, "groups": [ { "name": "main", - "origin": [ - 8, - 8, - 8 - ], - "children": [ - 0, - { - "name": "corrugation", - "origin": [ - 8, - 8, - 8 - ], - "children": [ - { - "name": "side", - "origin": [ - 20, - 8, - 14 - ], - "children": [ - 1, - 2, - 3, - 4, - 5, - 6 - ] - }, - { - "name": "side", - "origin": [ - 20, - 8, - 14 - ], - "children": [ - 7, - 8, - 9, - 10, - 11, - 12 - ] - } - ] - } - ] + "origin": [8, 8, 8], + "color": 0, + "children": [0] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_bars.json b/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_bars.json index beb5f5acd..73c90e78a 100644 --- a/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_bars.json +++ b/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_bars.json @@ -1,1327 +1,122 @@ { "credit": "Made with Blockbench", "textures": { - "0": "minecraft:block/iron_block", - "particle": "minecraft:block/iron_block" + "0": "immersiveweapons:block/corrugated_iron", + "particle": "immersiveweapons:block/corrugated_iron" }, "elements": [ { - "from": [ - 12, - 0, - 0.5 - ], - "to": [ - 16, - 16, - 1.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 8.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4, - 0, - 0.5 - ], - "to": [ - 12, - 3, - 1.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 4, - 8, - 8.5 - ] - }, + "from": [12, 0, 0.25], + "to": [16, 16, 1.75], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8.5]}, "faces": { - "north": { - "uv": [ - 1, - 13, - 15, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 1, - 13, - 15, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 0, - 12, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - } + "north": {"uv": [0, 0, 4, 16], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "south": {"uv": [12, 0, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 1], "texture": "#0"} } }, { - "from": [ - 4, - 13, - 0.5 - ], - "to": [ - 12, - 16, - 1.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 4, - 21, - 8.5 - ] - }, + "from": [4, 0, 0.25], + "to": [12, 3, 1.75], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 8.5]}, "faces": { - "north": { - "uv": [ - 1, - 0, - 15, - 3 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 1, - 0, - 15, - 3 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 0, - 12, - 1 - ], - "texture": "#0" - } + "north": {"uv": [4, 13, 12, 16], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "south": {"uv": [4, 13, 12, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "up": {"uv": [4, 0, 12, 1], "texture": "#0"}, + "down": {"uv": [4, 0, 12, 1], "texture": "#0"} } }, { - "from": [ - 0, - 0, - 0.5 - ], - "to": [ - 4, - 16, - 1.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - -3, - 8, - 8.5 - ] - }, + "from": [4, 13, 0.25], + "to": [12, 16, 1.75], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 21, 8.5]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - } + "north": {"uv": [4, 0, 12, 3], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "south": {"uv": [4, 0, 12, 3], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "up": {"uv": [4, 0, 12, 1], "texture": "#0"}, + "down": {"uv": [4, 0, 12, 1], "texture": "#0"} } }, { - "from": [ - 15, - 0, - 0 - ], - "to": [ - 16, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 23, - 8, - 7.5 - ] - }, + "from": [0, 0, 0.25], + "to": [4, 16, 1.75], + "rotation": {"angle": 0, "axis": "y", "origin": [-3, 8, 8.5]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } + "north": {"uv": [12, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 4, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "up": {"uv": [12, 0, 16, 1], "texture": "#0"}, + "down": {"uv": [12, 0, 16, 1], "texture": "#0"} } }, { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 1, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 7.5 - ] - }, + "from": [6, 3, 0.5], + "to": [7, 13, 1.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 8, 9]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } + "north": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [0, 0, 0.5, 16], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 0.5, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 0.5], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"} } }, { - "from": [ - 3, - 0, - 0 - ], - "to": [ - 4, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 11, - 8, - 7.5 - ] - }, + "from": [9, 3, 0.5], + "to": [10, 13, 1.5], + "rotation": {"angle": 0, "axis": "y", "origin": [17, 8, 9]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 6, - 0, - 0 - ], - "to": [ - 7, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 14, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 9, - 0, - 0 - ], - "to": [ - 10, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 17, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 12, - 0, - 0 - ], - "to": [ - 13, - 16, - 0.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 20, - 8, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 15, - 0, - 1.5 - ], - "to": [ - 16, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 23, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 0, - 1.5 - ], - "to": [ - 1, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 8, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 3, - 0, - 1.5 - ], - "to": [ - 4, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 11, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 6, - 0, - 1.5 - ], - "to": [ - 7, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 14, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 9, - 0, - 1.5 - ], - "to": [ - 10, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 17, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 12, - 0, - 1.5 - ], - "to": [ - 13, - 16, - 2 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 20, - 8, - 9 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - } + "north": {"uv": [0, 0, 1, 16], "texture": "#0"}, + "east": {"uv": [0, 0, 0.5, 16], "texture": "#0"}, + "south": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 0.5, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 0.5], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"} } } ], "display": { "thirdperson_righthand": { - "translation": [ - 0, - 0, - 3.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 0, 3.5], + "scale": [0.5, 0.5, 0.5] }, "thirdperson_lefthand": { - "translation": [ - 0, - 0, - 3.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 0, 3.5], + "scale": [0.5, 0.5, 0.5] }, "firstperson_righthand": { - "translation": [ - 6.5, - -6.75, - 0 - ] + "translation": [6.5, -6.75, 0] }, "firstperson_lefthand": { - "translation": [ - 6.5, - -6.75, - 0 - ] + "translation": [6.5, -6.75, 0] }, "ground": { - "translation": [ - 0, - 0.25, - 3.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 0.25, 3.5], + "scale": [0.5, 0.5, 0.5] }, "gui": { - "rotation": [ - -9.5, - 25.5, - 2 - ], - "translation": [ - 2.25, - 0.25, - 0 - ], - "scale": [ - 0.75, - 0.75, - 0.75 - ] + "rotation": [-9.5, 25.5, 2], + "translation": [2.25, 0.25, 0], + "scale": [0.75, 0.75, 0.75] }, "fixed": { - "translation": [ - 0, - 0, - 6 - ] + "translation": [0, 0, 6] } }, "groups": [ { "name": "main", - "origin": [ - 8, - 8, - 8 - ], + "origin": [8, 8, 8], + "color": 0, "children": [ 0, 1, @@ -1329,43 +124,20 @@ 3, { "name": "corrugation", - "origin": [ - 8, - 8, - 8 - ], + "origin": [8, 8, 8], + "color": 0, "children": [ { "name": "side", - "origin": [ - 20, - 8, - 14 - ], - "children": [ - 4, - 5, - 6, - 7, - 8, - 9 - ] + "origin": [20, 8, 14], + "color": 0, + "children": [] }, { "name": "side", - "origin": [ - 20, - 8, - 14 - ], - "children": [ - 10, - 11, - 12, - 13, - 14, - 15 - ] + "origin": [20, 8, 14], + "color": 0, + "children": [4, 5] } ] } diff --git a/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_flat.json b/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_flat.json index e7246f5bc..e398aafe7 100644 --- a/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_flat.json +++ b/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_flat.json @@ -1,1192 +1,57 @@ { "credit": "Made with Blockbench", "textures": { - "0": "minecraft:block/iron_block", - "particle": "minecraft:block/iron_block" + "0": "immersiveweapons:block/corrugated_iron", + "particle": "immersiveweapons:block/corrugated_iron" }, "elements": [ { - "from": [ - 0, - 0.5, - 0 - ], - "to": [ - 16, - 1.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, + "from": [0, 0, 0], + "to": [16, 1.5, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8.5]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 15, - 1.5, - 0 - ], - "to": [ - 16, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 1.5, - 0 - ], - "to": [ - 1, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 3, - 1.5, - 0 - ], - "to": [ - 4, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 6, - 1.5, - 0 - ], - "to": [ - 7, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 9, - 1.5, - 0 - ], - "to": [ - 10, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 12, - 1.5, - 0 - ], - "to": [ - 13, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 15, - 0, - 0 - ], - "to": [ - 16, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 1, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 3, - 0, - 0 - ], - "to": [ - 4, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 6, - 0, - 0 - ], - "to": [ - 7, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 9, - 0, - 0 - ], - "to": [ - 10, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 12, - 0, - 0 - ], - "to": [ - 13, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } + "north": {"uv": [0, 0, 16, 1], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 0, 16, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} } } ], "display": { "thirdperson_righthand": { - "translation": [ - 0, - 3.5, - -1 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 3.5, -1], + "scale": [0.5, 0.5, 0.5] }, "thirdperson_lefthand": { - "translation": [ - 0, - 3.5, - -1 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 3.5, -1], + "scale": [0.5, 0.5, 0.5] }, "firstperson_righthand": { - "translation": [ - 6.5, - 2.75, - 0 - ] + "translation": [6.5, 2.75, 0] }, "firstperson_lefthand": { - "translation": [ - 6.5, - 2.75, - 0 - ] + "translation": [6.5, 2.75, 0] }, "ground": { - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "scale": [0.5, 0.5, 0.5] }, "gui": { - "rotation": [ - 16.75, - 22, - 0 - ], - "translation": [ - 0, - 3.25, - 0 - ], - "scale": [ - 0.75, - 0.75, - 0.75 - ] + "rotation": [16.75, 22, 0], + "translation": [0, 3.25, 0], + "scale": [0.75, 0.75, 0.75] }, "fixed": { - "translation": [ - 0, - 0, - 4.5 - ] + "translation": [0, 0, 4.5] } }, "groups": [ { "name": "main", - "origin": [ - 8, - 8, - 8 - ], + "origin": [8, 8, 8], "color": 0, - "children": [ - 0, - { - "name": "corrugation", - "origin": [ - 8, - 8, - 8 - ], - "color": 0, - "children": [ - { - "name": "side", - "origin": [ - 20, - 8, - 14 - ], - "color": 0, - "children": [ - 1, - 2, - 3, - 4, - 5, - 6 - ] - }, - { - "name": "side", - "origin": [ - 20, - 8, - 14 - ], - "color": 0, - "children": [ - 7, - 8, - 9, - 10, - 11, - 12 - ] - } - ] - } - ] + "children": [0] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_flat_bars.json b/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_flat_bars.json index 45f5471f9..8f1d0ca90 100644 --- a/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_flat_bars.json +++ b/src/main/resources/assets/immersiveweapons/models/block/corrugated_iron_panel_flat_bars.json @@ -1,1386 +1,120 @@ { "credit": "Made with Blockbench", "textures": { - "0": "minecraft:block/iron_block", - "particle": "minecraft:block/iron_block" + "0": "immersiveweapons:block/corrugated_iron", + "particle": "immersiveweapons:block/corrugated_iron" }, "elements": [ { - "from": [ - 12, - 0.5, - 0 - ], - "to": [ - 16, - 1.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, + "from": [12, 0, 0], + "to": [16, 1.5, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0.75]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4, - 0.5, - 0 - ], - "to": [ - 12, - 1.5, - 3 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 0, - 12, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 1, - 13, - 15, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 1, - 13, - 15, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4, - 0.5, - 13 - ], - "to": [ - 12, - 1.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 4, - 0, - 12, - 1 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 1, - 0, - 15, - 3 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 1, - 0, - 15, - 3 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 0.5, - 0 - ], - "to": [ - 4, - 1.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 15, - 1.5, - 0 - ], - "to": [ - 16, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } + "north": {"uv": [0, 0, 4, 1], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 4, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [12, 0, 16, 16], "texture": "#0"} } }, { - "from": [ - 0, - 1.5, - 0 - ], - "to": [ - 1, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 3, - 1.5, - 0 - ], - "to": [ - 4, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, + "from": [4, 0, 0], + "to": [12, 1.5, 3], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0.75]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } + "north": {"uv": [4, 0, 12, 1], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [4, 0, 12, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 13, 12, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 13, 12, 16], "texture": "#0"} } }, { - "from": [ - 6, - 1.5, - 0 - ], - "to": [ - 7, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, + "from": [4, 0, 13], + "to": [12, 1.5, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0.75]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } + "north": {"uv": [4, 0, 12, 1], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [4, 0, 12, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 0, 12, 3], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 0, 12, 3], "texture": "#0"} } }, { - "from": [ - 9, - 1.5, - 0 - ], - "to": [ - 10, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, + "from": [0, 0, 0], + "to": [4, 1.5, 16], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0.75]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } + "north": {"uv": [12, 0, 16, 1], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 1, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [12, 0, 16, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [12, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 4, 16], "texture": "#0"} } }, { - "from": [ - 12, - 1.5, - 0 - ], - "to": [ - 13, - 2, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, + "from": [6, 0.25, 3], + "to": [7, 1.25, 13], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0.75]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } + "north": {"uv": [0, 0, 1, 0.5], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 0.5, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 0, 1, 0.5], "texture": "#0"}, + "west": {"uv": [0, 0, 0.5, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [15, 0, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 1, 16], "texture": "#0"} } }, { - "from": [ - 15, - 0, - 0 - ], - "to": [ - 16, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, + "from": [9, 0.25, 3], + "to": [10, 1.25, 13], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0.75]}, "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 1, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 3, - 0, - 0 - ], - "to": [ - 4, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 6, - 0, - 0 - ], - "to": [ - 7, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 9, - 0, - 0 - ], - "to": [ - 10, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 12, - 0, - 0 - ], - "to": [ - 13, - 0.5, - 16 - ], - "rotation": { - "angle": 0, - "axis": "x", - "origin": [ - 8, - 1, - 8 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 0.5, - 16 - ], - "rotation": 90, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "texture": "#0" - } + "north": {"uv": [0, 0, 1, 0.5], "rotation": 180, "texture": "#0"}, + "east": {"uv": [0, 0, 0.5, 16], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0, 0, 1, 0.5], "texture": "#0"}, + "west": {"uv": [0, 0, 0.5, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 1, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [15, 0, 16, 16], "texture": "#0"} } } ], "display": { "thirdperson_righthand": { - "translation": [ - 0, - 3.5, - 1.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 3.5, 1.5], + "scale": [0.5, 0.5, 0.5] }, "thirdperson_lefthand": { - "translation": [ - 0, - 3.5, - 1.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "translation": [0, 3.5, 1.5], + "scale": [0.5, 0.5, 0.5] }, "firstperson_righthand": { - "translation": [ - 6.5, - 2.75, - 0 - ] + "translation": [6.5, 2.75, 0] }, "firstperson_lefthand": { - "translation": [ - 6.5, - 2.75, - 0 - ] + "translation": [6.5, 2.75, 0] }, "ground": { - "scale": [ - 0.5, - 0.5, - 0.5 - ] + "scale": [0.5, 0.5, 0.5] }, "gui": { - "rotation": [ - 16.75, - 22, - 0 - ], - "translation": [ - 0, - 3.5, - 0 - ], - "scale": [ - 0.75, - 0.75, - 0.75 - ] + "rotation": [16.75, 22, 0], + "translation": [0, 3.5, 0], + "scale": [0.75, 0.75, 0.75] }, "fixed": { - "translation": [ - 0, - 0, - 6 - ] + "translation": [0, 0, 6] } }, "groups": [ { "name": "main", - "origin": [ - 8, - 8, - 8 - ], + "origin": [8, 8, 8], "color": 0, "children": [ 0, @@ -1389,46 +123,20 @@ 3, { "name": "corrugation", - "origin": [ - 8, - 8, - 8 - ], + "origin": [8, 8, 8], "color": 0, "children": [ { "name": "side", - "origin": [ - 20, - 8, - 14 - ], + "origin": [20, 8, 14], "color": 0, - "children": [ - 4, - 5, - 6, - 7, - 8, - 9 - ] + "children": [] }, { "name": "side", - "origin": [ - 20, - 8, - 14 - ], + "origin": [20, 8, 14], "color": 0, - "children": [ - 10, - 11, - 12, - 13, - 14, - 15 - ] + "children": [4, 5] } ] } diff --git a/src/main/resources/assets/immersiveweapons/models/block/crimson_table.json b/src/main/resources/assets/immersiveweapons/models/block/crimson_table.json new file mode 100644 index 000000000..d14f16ca8 --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/crimson_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/crimson_planks", + "particle": "minecraft:block/crimson_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/dark_oak_table.json b/src/main/resources/assets/immersiveweapons/models/block/dark_oak_table.json new file mode 100644 index 000000000..354425023 --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/dark_oak_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/dark_oak_planks", + "particle": "minecraft:block/dark_oak_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/jungle_table.json b/src/main/resources/assets/immersiveweapons/models/block/jungle_table.json new file mode 100644 index 000000000..5d76bb17e --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/jungle_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/jungle_planks", + "particle": "minecraft:block/jungle_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/oak_table.json b/src/main/resources/assets/immersiveweapons/models/block/oak_table.json new file mode 100644 index 000000000..a2e48df62 --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/oak_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/oak_planks", + "particle": "minecraft:block/oak_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/spruce_table.json b/src/main/resources/assets/immersiveweapons/models/block/spruce_table.json new file mode 100644 index 000000000..3f9d710bf --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/spruce_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/spruce_planks", + "particle": "minecraft:block/spruce_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/warped_table.json b/src/main/resources/assets/immersiveweapons/models/block/warped_table.json new file mode 100644 index 000000000..adbddf7be --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/block/warped_table.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/warped_planks", + "particle": "minecraft:block/warped_planks", + "overlay": "immersiveweapons:block/table_overlay" + }, + "elements": [ + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 3], + "to": [9, 0.5, 7], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 0.5, 13], + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#overlay"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "east": {"uv": [13, 0, 15, 16], "rotation": 90, "texture": "#overlay"}, + "south": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "west": {"uv": [13, 0, 15, 16], "rotation": 270, "texture": "#overlay"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#overlay"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#overlay"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#0"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#0"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [7, 0, 7], + "to": [9, 14, 9], + "faces": { + "north": {"uv": [12, 0, 13, 16], "texture": "#overlay"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#overlay"}, + "south": {"uv": [14, 0, 15, 16], "texture": "#overlay"}, + "west": {"uv": [13, 0, 14, 16], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#overlay"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 0, 7], + "to": [7, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [9, 0, 7], + "to": [13, 0.5, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0.25, 7.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 3, 1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#overlay"}, + "down": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#overlay"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "translation": [0, -0.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "translation": [2.25, 0, 0.5], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [17.75, 28.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + 1, + 2, + 3, + 4, + 5, + { + "name": "stand", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "top", + "origin": [0, 0, 0], + "color": 0, + "children": [11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/models/block/wooden_table.json b/src/main/resources/assets/immersiveweapons/models/block/wooden_table.json deleted file mode 100644 index e395abd85..000000000 --- a/src/main/resources/assets/immersiveweapons/models/block/wooden_table.json +++ /dev/null @@ -1,553 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [ - 32, - 32 - ], - "textures": { - "0": "immersiveweapons:block/wooden_table", - "particle": "immersiveweapons:block/wooden_table" - }, - "elements": [ - { - "from": [ - 7, - 0, - 7 - ], - "to": [ - 9, - 14, - 9 - ], - "faces": { - "north": { - "uv": [ - 8, - 0, - 9, - 8 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 8, - 0, - 9, - 8 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 8, - 0, - 9, - 8 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 8, - 0, - 9, - 8 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 2, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 2, - 2 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4, - 0, - 7 - ], - "to": [ - 7, - 0.5, - 9 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 10, - 0.25, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 2.66667, - 0.5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1.77778, - 0.5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 2.66667, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1.77778, - 0.5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1.77778, - 3 - ], - "rotation": 90, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1.77778, - 3 - ], - "rotation": 270, - "texture": "#0" - } - } - }, - { - "from": [ - 9, - 0, - 7 - ], - "to": [ - 12, - 0.5, - 9 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 10, - 0.25, - 7.5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 0, - 2.66667, - 0.5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1.77778, - 0.5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 2.66667, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1.77778, - 0.5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1.77778, - 3 - ], - "rotation": 90, - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1.77778, - 3 - ], - "rotation": 270, - "texture": "#0" - } - } - }, - { - "from": [ - 7, - 0, - 4 - ], - "to": [ - 9, - 0.5, - 7 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 1.77778, - 0.5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 2.66667, - 0.5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1.77778, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 2.66667, - 0.5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1.77778, - 3 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1.77778, - 3 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 7, - 0, - 9 - ], - "to": [ - 9, - 0.5, - 12 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 1.77778, - 0.5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 2.66667, - 0.5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 1.77778, - 0.5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 2.66667, - 0.5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 1.77778, - 3 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 1.77778, - 3 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 0, - 14, - 0 - ], - "to": [ - 16, - 16, - 16 - ], - "faces": { - "north": { - "uv": [ - 8, - 0, - 9, - 8 - ], - "rotation": 270, - "texture": "#0" - }, - "east": { - "uv": [ - 8, - 0, - 9, - 8 - ], - "rotation": 90, - "texture": "#0" - }, - "south": { - "uv": [ - 8, - 0, - 9, - 8 - ], - "rotation": 270, - "texture": "#0" - }, - "west": { - "uv": [ - 8, - 0, - 9, - 8 - ], - "rotation": 270, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 8, - 8 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 8, - 8 - ], - "texture": "#0" - } - } - } - ], - "display": { - "thirdperson_righthand": { - "translation": [ - 0, - -0.25, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "thirdperson_lefthand": { - "translation": [ - 0, - -0.25, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "firstperson_righthand": { - "translation": [ - 2.25, - 0, - 0.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "firstperson_lefthand": { - "translation": [ - 2.25, - 0, - 0.5 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "ground": { - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "gui": { - "rotation": [ - 17.75, - 28.25, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "fixed": { - "scale": [ - 0.5, - 0.5, - 0.5 - ] - } - }, - "groups": [ - { - "name": "stand", - "origin": [ - 8, - 8, - 8 - ], - "color": 0, - "children": [ - 0, - 1, - 2, - 3, - 4 - ] - }, - { - "name": "top", - "origin": [ - 0, - 0, - 0 - ], - "color": 0, - "children": [ - 5 - ] - } - ] -} \ 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 new file mode 100644 index 000000000..07d4bb4be --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/models/item/encyclopedia.json @@ -0,0 +1,100 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [196, 196], + "textures": { + "0": "immersiveweapons:item/encyclopedia", + "particle": "immersiveweapons:item/encyclopedia" + }, + "elements": [ + { + "name": "spine", + "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"} + } + }, + { + "name": "cover", + "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"} + } + }, + { + "name": "cover", + "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"} + } + }, + { + "name": "pages", + "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"} + } + } + ], + "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/particles/blood.json b/src/main/resources/assets/immersiveweapons/particles/blood.json index 4fec31fec..9a03bd40e 100644 --- a/src/main/resources/assets/immersiveweapons/particles/blood.json +++ b/src/main/resources/assets/immersiveweapons/particles/blood.json @@ -1,8 +1,8 @@ { "textures": [ - "immersiveweapons:blood_0", - "immersiveweapons:blood_1", - "immersiveweapons:blood_2", - "immersiveweapons:blood_3" + "immersiveweapons:blood/blood_0", + "immersiveweapons:blood/blood_1", + "immersiveweapons:blood/blood_2", + "immersiveweapons:blood/blood_3" ] } \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/particles/sand_cloud.json b/src/main/resources/assets/immersiveweapons/particles/sand_cloud.json new file mode 100644 index 000000000..ba83abadb --- /dev/null +++ b/src/main/resources/assets/immersiveweapons/particles/sand_cloud.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "immersiveweapons:sand_cloud/sand_cloud_0", + "immersiveweapons:sand_cloud/sand_cloud_1", + "immersiveweapons:sand_cloud/sand_cloud_2", + "immersiveweapons:sand_cloud/sand_cloud_3" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/immersiveweapons/sounds.json b/src/main/resources/assets/immersiveweapons/sounds.json index f7915fe43..446fd7037 100644 --- a/src/main/resources/assets/immersiveweapons/sounds.json +++ b/src/main/resources/assets/immersiveweapons/sounds.json @@ -3,7 +3,7 @@ "subtitle": "immersiveweapons.subtitle.armor.tesla.effect", "sounds": [ { - "name": "immersiveweapons:tesla_armor_effect", + "name": "immersiveweapons:armor/effect/tesla/tesla_armor_effect", "stream": true } ] @@ -12,7 +12,7 @@ "subtitle": "immersiveweapons.subtitle.armor.tesla.power_down", "sounds": [ { - "name": "immersiveweapons:tesla_armor_power_down", + "name": "immersiveweapons:armor/effect/tesla/tesla_armor_power_down", "stream": true } ] @@ -21,17 +21,37 @@ "subtitle": "immersiveweapons.subtitle.armor.tesla.power_up", "sounds": [ { - "name": "immersiveweapons:tesla_armor_power_up", + "name": "immersiveweapons:armor/effect/tesla/tesla_armor_power_up", "stream": true } ] }, + "tesla_armor_equip": { + "subtitle": "immersiveweapons.subtitle.armor.tesla.equip", + "sounds": [ + { + "name": "immersiveweapons:armor/equip/tesla/equip_0" + }, + { + "name": "immersiveweapons:armor/equip/tesla/equip_1" + },{ + "name": "immersiveweapons:armor/equip/tesla/equip_2" + } + ] + }, + "mortar_fire": { + "subtitle": "immersiveweapons.subtitle.block.mortar.fire", + "sounds": [ + { + "name": "immersiveweapons:block/mortar/fire/fire_0" + } + ] + }, "flintlock_pistol_fire": { "subtitle": "immersiveweapons.subtitle.item.gun.flintlock_fire", "sounds": [ { - "name": "immersiveweapons:flintlock_pistol_fire", - "stream": false + "name": "immersiveweapons:flintlock_pistol_fire" } ] }, @@ -39,16 +59,13 @@ "subtitle": "immersiveweapons.subtitle.item.gun.bullet_whizz", "sounds": [ { - "name": "immersiveweapons:bullet/bullet_whizz_1", - "stream": false + "name": "immersiveweapons:bullet/bullet_whizz_1" }, { - "name": "immersiveweapons:bullet/bullet_whizz_2", - "stream": false + "name": "immersiveweapons:bullet/bullet_whizz_2" }, { - "name": "immersiveweapons:bullet/bullet_whizz_3", - "stream": false + "name": "immersiveweapons:bullet/bullet_whizz_3" } ] }, @@ -56,8 +73,7 @@ "subtitle": "immersiveweapons.subtitle.item.gun.flintlock_misfire", "sounds": [ { - "name": "immersiveweapons:gunpowder_explosion", - "stream": false + "name": "immersiveweapons:gunpowder_explosion" } ] }, @@ -65,8 +81,7 @@ "subtitle": "immersiveweapons.subtitle.block.small_parts_table_used", "sounds": [ { - "name": "immersiveweapons:small_parts_table_used", - "stream": false + "name": "immersiveweapons:small_parts_table_used" } ] }, @@ -83,8 +98,7 @@ "subtitle": "immersiveweapons.subtitle.item.generic_whoosh", "sounds": [ { - "name": "immersiveweapons:generic_whoosh", - "stream": false + "name": "immersiveweapons:generic_whoosh" } ] }, @@ -92,8 +106,7 @@ "subtitle": "immersiveweapons.subtitle.item.gun.blunderbuss_fire", "sounds": [ { - "name": "immersiveweapons:blunderbuss_fire", - "stream": false + "name": "immersiveweapons:blunderbuss_fire" } ] }, @@ -101,8 +114,7 @@ "subtitle": "immersiveweapons.subtitle.block.barbed_wire_rattle", "sounds": [ { - "name": "immersiveweapons:barbed_wire_rattle", - "stream": false + "name": "immersiveweapons:barbed_wire_rattle" } ] }, @@ -110,8 +122,7 @@ "subtitle": "immersiveweapons.subtitle.block.bear_trap_close", "sounds": [ { - "name": "immersiveweapons:bear_trap_close", - "stream": false + "name": "immersiveweapons:bear_trap_close" } ] }, @@ -119,8 +130,7 @@ "subtitle": "immersiveweapons.subtitle.block.spike_trap_extend", "sounds": [ { - "name": "immersiveweapons:spike_trap_extend", - "stream": false + "name": "immersiveweapons:spike_trap_extend" } ] }, @@ -128,35 +138,15 @@ "subtitle": "immersiveweapons.subtitle.block.spike_trap_retract", "sounds": [ { - "name": "immersiveweapons:spike_trap_retract", - "stream": false + "name": "immersiveweapons:spike_trap_retract" } ] }, - "alarm_1": { - "subtitle": "immersiveweapons.subtitle.block.alarm.alarm_1", + "panic_alarm": { + "subtitle": "immersiveweapons.subtitle.block.alarm.panic_alarm", "sounds": [ { - "name": "immersiveweapons:alarm/alarm_1", - "stream": false - } - ] - }, - "alarm_2": { - "subtitle": "immersiveweapons.subtitle.block.alarm.alarm_2", - "sounds": [ - { - "name": "immersiveweapons:alarm/alarm_2", - "stream": true - } - ] - }, - "alarm_3": { - "subtitle": "immersiveweapons.subtitle.block.alarm.alarm_3", - "sounds": [ - { - "name": "immersiveweapons:alarm/alarm_3", - "stream": true + "name": "immersiveweapons:block/panic_alarm/alarm/panic_alarm" } ] }, @@ -164,16 +154,13 @@ "subtitle": "immersiveweapons.subtitle.entity.dying_soldier.ambient", "sounds": [ { - "name": "immersiveweapons:entity/dying_soldier/ambient/ambient_1", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/ambient/ambient_1" }, { - "name": "immersiveweapons:entity/dying_soldier/ambient/ambient_2", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/ambient/ambient_2" }, { - "name": "immersiveweapons:entity/dying_soldier/ambient/ambient_3", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/ambient/ambient_3" } ] }, @@ -181,20 +168,16 @@ "subtitle": "immersiveweapons.subtitle.entity.dying_soldier.step", "sounds": [ { - "name": "immersiveweapons:entity/dying_soldier/step/step_1", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/step/step_1" }, { - "name": "immersiveweapons:entity/dying_soldier/step/step_2", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/step/step_2" }, { - "name": "immersiveweapons:entity/dying_soldier/step/step_3", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/step/step_3" }, { - "name": "immersiveweapons:entity/dying_soldier/step/step_4", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/step/step_4" } ] }, @@ -202,8 +185,7 @@ "subtitle": "immersiveweapons.subtitle.entity.dying_soldier.death", "sounds": [ { - "name": "immersiveweapons:entity/dying_soldier/death/death", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/death/death" } ] }, @@ -211,16 +193,13 @@ "subtitle": "immersiveweapons.subtitle.entity.dying_soldier.hurt", "sounds": [ { - "name": "immersiveweapons:entity/dying_soldier/hurt/hurt_1", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/hurt/hurt_1" }, { - "name": "immersiveweapons:entity/dying_soldier/hurt/hurt_2", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/hurt/hurt_2" }, { - "name": "immersiveweapons:entity/dying_soldier/hurt/hurt_3", - "stream": false + "name": "immersiveweapons:entity/dying_soldier/hurt/hurt_3" } ] }, @@ -237,20 +216,16 @@ "subtitle": "immersiveweapons.subtitle.entity.field_medic.ambient", "sounds": [ { - "name": "immersiveweapons:entity/field_medic/ambient/ambient_1", - "stream": false + "name": "immersiveweapons:entity/field_medic/ambient/ambient_1" }, { - "name": "immersiveweapons:entity/field_medic/ambient/ambient_2", - "stream": false + "name": "immersiveweapons:entity/field_medic/ambient/ambient_2" }, { - "name": "immersiveweapons:entity/field_medic/ambient/ambient_3", - "stream": false + "name": "immersiveweapons:entity/field_medic/ambient/ambient_3" }, { - "name": "immersiveweapons:entity/field_medic/ambient/ambient_4", - "stream": false + "name": "immersiveweapons:entity/field_medic/ambient/ambient_4" } ] }, @@ -258,8 +233,7 @@ "subtitle": "immersiveweapons.subtitle.entity.field_medic.attack", "sounds": [ { - "name": "immersiveweapons:entity/field_medic/attack/attack", - "stream": false + "name": "immersiveweapons:entity/field_medic/attack/attack" } ] }, @@ -267,8 +241,7 @@ "subtitle": "immersiveweapons.subtitle.item.gun.flare_gun_fire", "sounds": [ { - "name": "immersiveweapons:flare_gun_fire", - "stream": false + "name": "immersiveweapons:flare_gun_fire" } ] }, @@ -276,12 +249,10 @@ "subtitle": "immersiveweapons.subtitle.entity.wandering_warrior.ambient", "sounds": [ { - "name": "immersiveweapons:entity/wandering_warrior/ambient/ambient_1", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/ambient/ambient_1" }, { - "name": "immersiveweapons:entity/wandering_warrior/ambient/ambient_2", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/ambient/ambient_2" } ] }, @@ -289,16 +260,13 @@ "subtitle": "immersiveweapons.subtitle.entity.wandering_warrior.hurt", "sounds": [ { - "name": "immersiveweapons:entity/wandering_warrior/hurt/hurt_1", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/hurt/hurt_1" }, { - "name": "immersiveweapons:entity/wandering_warrior/hurt/hurt_2", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/hurt/hurt_2" }, { - "name": "immersiveweapons:entity/wandering_warrior/hurt/hurt_3", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/hurt/hurt_3" } ] }, @@ -306,8 +274,7 @@ "subtitle": "immersiveweapons.subtitle.entity.wandering_warrior.death", "sounds": [ { - "name": "immersiveweapons:entity/wandering_warrior/death/death", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/death/death" } ] }, @@ -315,20 +282,16 @@ "subtitle": "immersiveweapons.subtitle.entity.wandering_warrior.step", "sounds": [ { - "name": "immersiveweapons:entity/wandering_warrior/step/step_1", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/step/step_1" }, { - "name": "immersiveweapons:entity/wandering_warrior/step/step_2", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/step/step_2" }, { - "name": "immersiveweapons:entity/wandering_warrior/step/step_3", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/step/step_3" }, { - "name": "immersiveweapons:entity/wandering_warrior/step/step_4", - "stream": false + "name": "immersiveweapons:entity/wandering_warrior/step/step_4" } ] }, @@ -336,16 +299,13 @@ "subtitle": "immersiveweapons.subtitle.entity.field_medic.hurt", "sounds": [ { - "name": "immersiveweapons:entity/field_medic/hurt/hurt_1", - "stream": false + "name": "immersiveweapons:entity/field_medic/hurt/hurt_1" }, { - "name": "immersiveweapons:entity/field_medic/hurt/hurt_2", - "stream": false + "name": "immersiveweapons:entity/field_medic/hurt/hurt_2" }, { - "name": "immersiveweapons:entity/field_medic/hurt/hurt_3", - "stream": false + "name": "immersiveweapons:entity/field_medic/hurt/hurt_3" } ] }, @@ -353,8 +313,7 @@ "subtitle": "immersiveweapons.subtitle.entity.field_medic.death", "sounds": [ { - "name": "immersiveweapons:entity/field_medic/death/death", - "stream": false + "name": "immersiveweapons:entity/field_medic/death/death" } ] }, @@ -362,20 +321,16 @@ "subtitle": "immersiveweapons.subtitle.entity.field_medic.step", "sounds": [ { - "name": "immersiveweapons:entity/field_medic/step/step_1", - "stream": false + "name": "immersiveweapons:entity/field_medic/step/step_1" }, { - "name": "immersiveweapons:entity/field_medic/step/step_2", - "stream": false + "name": "immersiveweapons:entity/field_medic/step/step_2" }, { - "name": "immersiveweapons:entity/field_medic/step/step_3", - "stream": false + "name": "immersiveweapons:entity/field_medic/step/step_3" }, { - "name": "immersiveweapons:entity/field_medic/step/step_4", - "stream": false + "name": "immersiveweapons:entity/field_medic/step/step_4" } ] }, @@ -392,16 +347,13 @@ "subtitle": "immersiveweapons.subtitle.entity.lava_revenant.ambient", "sounds": [ { - "name": "immersiveweapons:entity/lava_revenant/ambient/ambient_1", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/ambient/ambient_1" }, { - "name": "immersiveweapons:entity/lava_revenant/ambient/ambient_2", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/ambient/ambient_2" }, { - "name": "immersiveweapons:entity/lava_revenant/ambient/ambient_3", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/ambient/ambient_3" } ] }, @@ -409,16 +361,13 @@ "subtitle": "immersiveweapons.subtitle.entity.lava_revenant.hurt", "sounds": [ { - "name": "immersiveweapons:entity/lava_revenant/hurt/hurt_1", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/hurt/hurt_1" }, { - "name": "immersiveweapons:entity/lava_revenant/hurt/hurt_2", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/hurt/hurt_2" }, { - "name": "immersiveweapons:entity/lava_revenant/hurt/hurt_3", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/hurt/hurt_3" } ] }, @@ -426,16 +375,13 @@ "subtitle": "immersiveweapons.subtitle.entity.lava_revenant.death", "sounds": [ { - "name": "immersiveweapons:entity/lava_revenant/death/death_1", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/death/death_1" }, { - "name": "immersiveweapons:entity/lava_revenant/death/death_2", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/death/death_2" }, { - "name": "immersiveweapons:entity/lava_revenant/death/death_3", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/death/death_3" } ] }, @@ -443,28 +389,22 @@ "subtitle": "immersiveweapons.subtitle.entity.lava_revenant.flap", "sounds": [ { - "name": "immersiveweapons:entity/lava_revenant/flap/flap_1", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/flap/flap_1" }, { - "name": "immersiveweapons:entity/lava_revenant/flap/flap_2", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/flap/flap_2" }, { - "name": "immersiveweapons:entity/lava_revenant/flap/flap_3", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/flap/flap_3" }, { - "name": "immersiveweapons:entity/lava_revenant/flap/flap_4", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/flap/flap_4" }, { - "name": "immersiveweapons:entity/lava_revenant/flap/flap_5", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/flap/flap_5" }, { - "name": "immersiveweapons:entity/lava_revenant/flap/flap_6", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/flap/flap_6" } ] }, @@ -472,20 +412,16 @@ "subtitle": "immersiveweapons.subtitle.entity.lava_revenant.swoop", "sounds": [ { - "name": "immersiveweapons:entity/lava_revenant/swoop/swoop_1", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/swoop/swoop_1" }, { - "name": "immersiveweapons:entity/lava_revenant/swoop/swoop_2", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/swoop/swoop_2" }, { - "name": "immersiveweapons:entity/lava_revenant/swoop/swoop_3", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/swoop/swoop_3" }, { - "name": "immersiveweapons:entity/lava_revenant/swoop/swoop_4", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/swoop/swoop_4" } ] }, @@ -493,12 +429,10 @@ "subtitle": "immersiveweapons.subtitle.entity.lava_revenant.bite", "sounds": [ { - "name": "immersiveweapons:entity/lava_revenant/bite/bite_1", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/bite/bite_1" }, { - "name": "immersiveweapons:entity/lava_revenant/bite/bite_2", - "stream": false + "name": "immersiveweapons:entity/lava_revenant/bite/bite_2" } ] }, @@ -510,12 +444,10 @@ "stream": true }, { - "name": "immersiveweapons:entity/celestial_tower/ambient/ambient_2", - "stream": false + "name": "immersiveweapons:entity/celestial_tower/ambient/ambient_2" }, { - "name": "immersiveweapons:entity/celestial_tower/ambient/ambient_3", - "stream": false + "name": "immersiveweapons:entity/celestial_tower/ambient/ambient_3" } ] }, @@ -523,12 +455,10 @@ "subtitle": "immersiveweapons.subtitle.entity.celestial_tower.hurt", "sounds": [ { - "name": "immersiveweapons:entity/celestial_tower/hurt/hurt_1", - "stream": false + "name": "immersiveweapons:entity/celestial_tower/hurt/hurt_1" }, { - "name": "immersiveweapons:entity/celestial_tower/hurt/hurt_2", - "stream": false + "name": "immersiveweapons:entity/celestial_tower/hurt/hurt_2" } ] }, @@ -536,8 +466,7 @@ "subtitle": "immersiveweapons.subtitle.entity.celestial_tower.death", "sounds": [ { - "name": "immersiveweapons:entity/celestial_tower/death/death_1", - "stream": false + "name": "immersiveweapons:entity/celestial_tower/death/death_1" } ] }, @@ -545,8 +474,7 @@ "subtitle": "immersiveweapons.subtitle.entity.celestial_tower.summon", "sounds": [ { - "name": "immersiveweapons:entity/celestial_tower/summon/summon_1", - "stream": false + "name": "immersiveweapons:entity/celestial_tower/summon/summon_1" } ] }, @@ -554,8 +482,7 @@ "subtitle": "immersiveweapons.subtitle.entity.celestial_tower.vulnerable", "sounds": [ { - "name": "immersiveweapons:entity/celestial_tower/vulnerable/vulnerable_1", - "stream": false + "name": "immersiveweapons:entity/celestial_tower/vulnerable/vulnerable_1" } ] } diff --git a/src/main/resources/assets/immersiveweapons/sounds/alarm/alarm_1.ogg b/src/main/resources/assets/immersiveweapons/sounds/alarm/alarm_1.ogg deleted file mode 100644 index d8d1e09d521d5749f2e7db984e01b06b17f01352..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18814 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 diff --git a/src/main/resources/assets/immersiveweapons/sounds/alarm/alarm_2.ogg b/src/main/resources/assets/immersiveweapons/sounds/alarm/alarm_2.ogg deleted file mode 100644 index 2c2876a4b56a652e4e229cb7d7ea2a3c4668fbe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43632 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

N*?okk>)Sc{%L39Q* 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 F{{W`m(-i;! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/sounds/armor/equip/tesla/equip_2.ogg b/src/main/resources/assets/immersiveweapons/sounds/armor/equip/tesla/equip_2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1d9f5896b69061d69e5b3f069738a8a2f19e8213 GIT binary patch literal 8335 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/sounds/block/panic_alarm/alarm/panic_alarm.ogg b/src/main/resources/assets/immersiveweapons/sounds/block/panic_alarm/alarm/panic_alarm.ogg new file mode 100644 index 0000000000000000000000000000000000000000..69338bd14a8557022d5fb2a62d79052b7356b1ef GIT binary patch literal 18626 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 DXdPYb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/sounds/generic_whoosh.ogg b/src/main/resources/assets/immersiveweapons/sounds/generic_whoosh.ogg index 79d0ac12fe585c304f2004b5c23b9a5177875a2b..c8d037f3fa94d159cab0819a1623a5a647a18467 100644 GIT binary patch literal 5232 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 I{0RI%018z`MgRZ+ diff --git a/src/main/resources/assets/immersiveweapons/sounds/smoke_bomb_hiss.ogg b/src/main/resources/assets/immersiveweapons/sounds/smoke_bomb_hiss.ogg index 34666ce8ac0620504606a2c72c558574121b79b2..de4c7b73abaea66ffdc1dccae0d61b07b006986b 100644 GIT binary patch literal 30123 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 E2cFnR$^ZZW diff --git a/src/main/resources/assets/immersiveweapons/textures/block/corrugated_iron.png b/src/main/resources/assets/immersiveweapons/textures/block/corrugated_iron.png new file mode 100644 index 0000000000000000000000000000000000000000..ba7d8824a18cece6c62fceb4ec7b1a8689e8c49d GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#8529NiLAAj>1?3TDNh&25R21WCvD_9WFX?&FVN&Pq2#4}$*U{>=l^0oxG*^V zc}q}IMK|A~C5x_Y`?2h_wBGX%_uf6ZW6HyveN3)@g#nL=FLOh2-lW&N*cQCDTD6L4 z!TaByVGNHg?4m#GD8+LId98S0Yv{&sFLkNN!D^Ql3FU*;P8{ExPP3+VH*L~kwAi1L z{r2uwjSEqWw;oIT{rBMpU&bHnK4_fSm@ZnBlgy)JbZ}niiH+vkXI|>;I%GZ9HT=ht u&!0ubY%eiimH7PM{npmpYG2KbWqATOUVNN3$>lcCR}7x6elF{r5}E*wAb7_B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/textures/block/raw_sulfur_block.png b/src/main/resources/assets/immersiveweapons/textures/block/raw_sulfur_block.png new file mode 100644 index 0000000000000000000000000000000000000000..6f67d9baa2bdda887c81eaae150678fee31a4e16 GIT binary patch literal 1302 zcmV+x1?l>UP)EX>4Tx04R}tkv&MmKpe$iQ%glE4ptCxh)|s@h>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0Yam~RI_UWP&La) z#baVNw<-o-As~bS1TZ2oQ%|H9Gw>W=_we!cF3PjK&;2=imAuISpGZ8%bi*RvAfDN@ zbk6(4VOEk9;&bA0gDyz?$aUG}H_ki6e@tQNECM zS>e3JS*_Gq>z@3Dp}e+|<~q$`#Ib|~k`N)IhB7L!5T#Wk#YBqsV;=q?$DbsZOs+B* zITlcb3d!+<|H1EW&BD~An-q!xffw8U7zKj6K(lV!-^aGyJOTXAz?IhaR~x|WC+YRJ z7C8d?wtax3sE8QB%SQ0Bs9+V+Mlp&bC?$(VTWB?gBtnTM-6^FD z3wEI(Vx9h+caaCW}MADbqN zpN#|1YPC50e3S2fu=wqFf$#VEXs*xHTY|AYHsb1!59{?C2`*ghpmdx{rNYjQjEpcd z<*~RjO0(G{5{V#%qExPu$zW^Znu%qXq5ZzX|ZrhQz#TLjR8_@Qz#TzIHh^v70JhQ8^mHU%H=ZE zS{={x_~3Yp6YrsnL?Utg*pW7GylbJ9V)1mqaNMC(NwM8BICi8>Jg%91tidx+_W1sC zh}C5u+tS2i3X#obwGe_xB+SZ!ORYXYsW7?OVWQC}rBaFW=X`>oPrGB{3=5up@lLgL zI*ll99Mso;3GvmX2)AyVtS;5)b^|O+Vi{6tUsvD5WM#09wN5OQwUVDL4NNscPM% z(P&Vq8Jt}+09aWlv9??_Q>mnCG#c#R*G5W7x7)?CEIvK6C2iXdL^hk%u~>{C2ymQX zLLrM{vB(#ncL8?6cF;PV4s-7}k+Mg6%s{46DICYa^E{MN_`bh8_Pq{YuJ#Z@@X5&m z2k!T99EbHA3DRQ*p4UhI^Jy9l7u&X(&Q0+0(J=tD8nCvsMP~1S#}C!X=kr{+*dYiM zN(toClTpUU$NBo3QO=z3$mjF4S}kU#JS;nkGz>za2wH3Q-qk0Q$*^>K8@FlF?%2qC z@2=sxE^ESk@&vAbzP=rY_49nm|qU_H~zMS$&4dy*#H0l M07*qoM6N<$g5yYR>i_@% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/textures/block/table_overlay.png b/src/main/resources/assets/immersiveweapons/textures/block/table_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..7079845728b9823ed33134dd9881adc86d76f44d GIT binary patch literal 5504 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 Z{s1e^J?Q0$Z%qII002ovPDHLkV1f&QP`3a8 diff --git a/src/main/resources/assets/immersiveweapons/textures/item/encyclopedia.png b/src/main/resources/assets/immersiveweapons/textures/item/encyclopedia.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4e1b91599ab65076f29454c435785ed08f8346 GIT binary patch literal 5577 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 X#Z7hEiT`qx00000NkvXXu0mjfilW{a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/textures/item/molten_plate.png b/src/main/resources/assets/immersiveweapons/textures/item/molten_plate.png deleted file mode 100644 index 894a395e7d14adf13b921abe70e5cd319f505ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#86$_NwSMK~2eW`er#xL8Lo7}wCnzx0++O>4eq+ps-0k1~yUvpNUnqIV!{hV& zrT!0Vu4QDh>0Mu~Q8nX3X58d*@k5mi3$H!7d-MaJvZ0xBbFX^6L5ojN+wK<5^=Cb{ z9d6if$$l85Q7`dG_Ge}`Ha1qaH8nH5B`)TE6Myb-wT1Zr(-h8|Y4yb`p0V@Hh^uJW zAZckP@z88`aY9t{J64^*lSiIbO*KrJWOUBKnXfkIC4(`~hMg?#N{43V*jsV@`9Fi< q;Ezd$*IHbBJ}tFiHViQ4W@gyi+QDD*TkAj2R}7x6elF{r5}E*fDRLM9 diff --git a/src/main/resources/assets/immersiveweapons/textures/item/tesla_plate.png b/src/main/resources/assets/immersiveweapons/textures/item/tesla_plate.png deleted file mode 100644 index ebaea0f2d2253e75a43de68f53c7d306587590e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F3${@^GvDCf{D9B#o z>Fdh=jFCf(+2Enm`?EkH$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj3+dRJ+&uXvuMU%Za!&;A?^ZoS#Y6OJVPJZErb#=}zrvkTiA6`8k} z2jsNf%&PqU=YRK7B@I1?GEU{Tvy!_XvYi7eIw1RXp5nCkJZbCW#StKW@rkyEB{ZN^7n4x@MP6|WU<^;cXOX<7TFE$?Nc*B$uJz;Ot)wG<2 z{UG+nn?2VBo?LM6FP|hV=sD|Rtkbl#q)i4!z<|=Y>A>|Y{u$8644$rjF6*2UngErE BjCue7 diff --git a/src/main/resources/assets/immersiveweapons/textures/particle/blood_0.png b/src/main/resources/assets/immersiveweapons/textures/particle/blood/blood_0.png similarity index 100% rename from src/main/resources/assets/immersiveweapons/textures/particle/blood_0.png rename to src/main/resources/assets/immersiveweapons/textures/particle/blood/blood_0.png diff --git a/src/main/resources/assets/immersiveweapons/textures/particle/blood_1.png b/src/main/resources/assets/immersiveweapons/textures/particle/blood/blood_1.png similarity index 100% rename from src/main/resources/assets/immersiveweapons/textures/particle/blood_1.png rename to src/main/resources/assets/immersiveweapons/textures/particle/blood/blood_1.png diff --git a/src/main/resources/assets/immersiveweapons/textures/particle/blood_2.png b/src/main/resources/assets/immersiveweapons/textures/particle/blood/blood_2.png similarity index 100% rename from src/main/resources/assets/immersiveweapons/textures/particle/blood_2.png rename to src/main/resources/assets/immersiveweapons/textures/particle/blood/blood_2.png diff --git a/src/main/resources/assets/immersiveweapons/textures/particle/blood_3.png b/src/main/resources/assets/immersiveweapons/textures/particle/blood/blood_3.png similarity index 100% rename from src/main/resources/assets/immersiveweapons/textures/particle/blood_3.png rename to src/main/resources/assets/immersiveweapons/textures/particle/blood/blood_3.png diff --git a/src/main/resources/assets/immersiveweapons/textures/particle/sand_cloud/sand_cloud_0.png b/src/main/resources/assets/immersiveweapons/textures/particle/sand_cloud/sand_cloud_0.png new file mode 100644 index 0000000000000000000000000000000000000000..76d3d32b73bd04f5649b58ee545a8b00bceca5f9 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#850|mG<*7%D_4L*PM$7~ArhC96BcOgs7kq2&&I~q*1dbzzvR$@*MA=Uw@{rZ zdeA2+0SH{SKRUl%p9ciyESkiV)wZ!G!dKzsLx#O3vgwI|&dY(OF?hQAxvX{XE z)7O>#850|mw8&$wsUQPfJzX3_BrYc>EYR9fTKBP@jg75swfnNa$5%agv~Jyh1J4;r zJa@&*OaHo0OK~x83=Wy}@cZ@iJoWo(6EBo&JD+%LGE0DgVeT_6?W=N`Oh5w}JYD@< J);T3K0RV$(Gs*w} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/textures/particle/sand_cloud/sand_cloud_2.png b/src/main/resources/assets/immersiveweapons/textures/particle/sand_cloud/sand_cloud_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a3305387ae9018fa78a9f4c08594de06c3d8be49 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#850|moZ;2VtsqT_o-U3d5|@(`6hvcejo#Xabw)oI|G$67>eu!?yu#@&*Z)4h zEzVZE-RM~N?p^;j7kpGunNX@6eYhj`DP`RIujot0@4r%xO@ ldUyel?zp{XE z)7O>#850|myt4i6uZ%#U3{Mxw5Q)pl2@Xu#&*}d=-@qGl=jvDa$csl~WB(h9+_&2Q zzopr08v#)p8x;= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/sand_camouflaged_landmine.png b/src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/sand_camouflaged_landmine.png new file mode 100644 index 0000000000000000000000000000000000000000..1b198760798cf9a9bbc6e7bf264fc310605dab44 GIT binary patch literal 31451 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


Xx`@846) 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/sandbag_fort.png b/src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/sandbag_fort.png new file mode 100644 index 0000000000000000000000000000000000000000..916b370da072b186578d7d7e23586c46b466d9ea GIT binary patch literal 44989 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/showcase_base.png b/src/main/resources/assets/immersiveweapons/textures/patchouli/encyclopedia/showcase_base.png new file mode 100644 index 0000000000000000000000000000000000000000..553b26f2f4db31d4476445c729c7ce0bdc92d8f5 GIT binary patch literal 58008 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 Q0p8}5f`)vZtXb&)051ajeE%l5axHe;?~TX} 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 Date: Thu, 14 Apr 2022 22:30:10 -0400 Subject: [PATCH 2/3] 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 zcmeHKdsLHGwx4P#y>f-FDS}iUoofe*Ee3q>Ce+(e%E&{ZN+pmWC@2DvXCTiaSLw*B zGns*CcvzvLMoA&^3M5e}a4Rn%Jd8Y|B7`Imgb)G=Uoz(lAad)P-gWPE-FB_ZANjts zzjOB4XaDy8{SH=HZ~sR3r|lRP6f zXMgvb-d_*u{XXY|aNB_2+cN0?W(s}4nQEOpTWz$rZLF~i!}y>kz52Mc_ESSELvL|T zQHEdCL-EcQ9y7(Qs8ce4QZO_6F#1JMG}|1}+IN+uig+k+D{l8Iwv#aDwb+LO&Skp= zU#Vw`8>czp&MmYiH#V~TuKN!A2EA*jFuYzQ^X{BMJ2~CVn3l02@r$tBP3@y$DWB+B zC%2YeqxBk7FNX&N`b1y!_I0>nYrVI*3{C5m9^QxWk(~D)&>4O_E3}-}Ye8i*nW7C; zcEtMStFwWFKD&wY-W+?eYxC=Ok{ZLSmFUc^aRE3VNv`*>!wok$E}71K#H&W3^qnT( ze>?@OgA5&pUblLkORn&D7wB;O>o!<71%#q+5k7RO$b=ObX1V3Z;jGP8W*9m=CL9mI zwa2Bu%;9Ph0^uxj3=Qzd0}wuJKZn<+VkMnc$zOGk82qDzD(bG7S}X3Cbsc^kaMx%_ zMd5JHG*?AgTXExuvjn#G9kK?y$lAL}20qNYlUr!ybOFL1)WM+_TP;m!r5ohVw4!rx zy5-mJ?rFfGd}{B`ZOV=fpbrnWlkdfD-qgM?-Q{1qtlAH!r zdR&oP37ugP=#@|#J0eC~1^b@Fw?5KT3pgF{FKN&)+}EKd_E;bsmvO{k{@&(CH7D0h zNxUnz)*NI+k90Tuh^eg_h{~Qi+HXunmpIg*1k2{-uST2J3JH9w&aNDO0Jg2IdZmiV zhaOr`x!U_>(>!}n;w0^PZz1J)%pjOE2bt=|!wzDRoo#R(ZRw{Ph*ynMe{b~PuWgdFe+=!Le!M5nj6sQsJ90Q@bgp)& ze?0!NkK9>}ieuEq7dl389P{{*J@I%17Exr{!p2&bcRWfH#H&!bth5rPK`sk(w$QRR zC~R`3a&&Twc{vzr@<(F`M8`bV6l|MuHlZbj&efWOg`XlLcRr%-HnagS zq~RvOkS;p_b~}?XRv!(S0HRF#)BtX2f}SiboK+o8@AU3XXJZXsD}oucV$K} zp)U8Oj$@Yz74Tlg>M(hwwA)KJuux&3#98VB6!-}WhJWCBM@WYqQ13EfE zt5Nt^Zbf*HbO+2XKmZK*lZq)5J~0&X%R0@iAlEj7jhW45U7xKsGzd)T)E;(F*|B^Y zP^Z&6RX}n!A`hNTZT#^l~yq{L(1kZE8XsA%%~M0!}$*4;Fhx24B!Z-=_$JA&yM}1 z-y&k$*K14|vk_*UFK+=kqkR6*BEs#@$*qt4PONmM?yctCW4P?8Kfu(*#BAH-BjIv8 zHbkKQk}N8S_3kgi+;HQ?9ITQp{c(8lBy0_mjMz=U98lu~FZ2aF5~#rI2=KaU;sgPn zS)rp!&JV8;)9M;3Th6ofU0b1>j)2|4g%g9VLN8%)fy)Nqf2ACBZ(t{mJ=h5@DByf~ zHf@f5(VNLwh8Qddr>5UhU%3KE+*-$2tD&urR;eomiwOE(!3nHSf_S{ap<)BTp>i5< zbx;s27m`1M>|*HJ;z%GMjE{g34wQ^!1)K7qZ6QCg~6hHBWAYWczOz_=Qoj3NuE7u1W*s5xL;BZ;MSu} z&RUlQ0&_*$R;_3_Tc&Wf)QwCV|nFvv~qfiunR7%<*UkT>s+HIgZ1!#wxCBr zfudl+Ke}f6AGa-&u~j{-{;BK3a)8VKxBg-zmzfUh<=(GBf$`qb(d{R&xW4xpNDXEq zEUstXhsE`$4);sEK@CJIJ1F{ZP&FQU*;A(g&Tf|h^tqA4YM3QU;UleD%P35f2tpzF zY#9ZqV9z|^7*mU;G%Y~s5T?!fuKHOIbWTc;t?wAia$(x0O~T9fM-pf0V-t&KlLEEk7-WMv8fit|g)VF#FK-$ZBrFh9JVLVl zi~BIQv`f#8)I~B%_D)7;0;Hyd+U3i;Q(cRTjVLajx5xd-bI(&9T}ZP}1*fX6ljlw} zn)|lcNO_#%{>T8K$nCII*wU?FbbHi*$W%&kbwf6w3w!f6zA$23p^JzKhlQG!?e)Q~ zuG_jKy!wId^>s+AEy%wJzwrER0mJh`YbmSwRGRX$&4 zrsf?^GOpKqud5y5Kajzm8+coDO|qnE)%alO)WV2es3hP}13^MVbF{xlUI zARK<0>TnBtBlzP3auLpG+^9cORd=n#&y?C7)pv4lsG;W#e81g3|o@1)I{eA- zl1V=#Jqcf{9Bs>CkV88BB|@BVH$^_z$~t`{<(W3MK$BU}bQ(IBfJAW)eH_)~ovfB5 zIMPdk7;-FnPn1-s9K?`Six@k7?EHzvk%if+%ZQeeBTju2H_5q_)LjiXF;`3cm|fDu zorJe}st3}xvo67VDl)Ypl$qz@#KjnQiwZ*zG&$a~ihyk6rr>(%-AgxJN$jm9{un~p zi0afXx3qb2k_#HCotjvxj+&4-B?ntRoMu|FD7P!wW*C7j{6v7J4jK3RJ=}VKsYlh!JgOxQ20{uaWuHX2^jur3bSuYJV5|Lb zjjAVAsWbOZ4*t-Gh#nOv!kyV69_c1IRCOoA=o1o78s&3@CuEL{^+zoz#?1`1#}}|H zvA<`X@RFlvkaigAoI6XB=1?0L2_6u%5bYdH+Ov3Uw4JMvT(T2&VTJwgl`E=q_^JYN zOmNE42BYa(#VtqKoMhubBl1w6Gt-VY&1s=No%ccB7TzjnHA8;mZ~RFXU6@^bq=_N$ ztyUpNW#4nF-pUfkXddvT(1FYbo8!*)M#%RN(u0+g&kZfn5}7O8Y@k3Oh)HsBx9C7s z?7dI24+&{U*Z0ew73WFRL^O}o*~(hXvziY`c<};{2^LDCMw=Jr-#bP6_npjgessA1 zf8rc3L-;)&MWOw|4Sy}_?QUX_7G-9*Pzsp?S&oez8zzO*gUSbN+QwaY!bRB`5wTG< zpOzZnYn>Cg)Y4*0c6Y15d^wFHGY@P_QU#T&0+m(4`ys-}&21%hevze%SMhk)Vy55H zd|M6*KUTt<9n8(MQMjFfLhq^Cgk1IPSWIQA=FXoCUG;gFyCg>U+v2OQchzxEVT*Bi z#7JH3@ZH5mP0fsWMzUR~YQtd3+mBk!fswv(mSTV>Bo103ZvG%CeeSqW)Ine$Au;3Y z(x5*)a(~=nn~XR>Wp$270{bTuc!{ZjUNrwmMY)DwAgXtr%IZEs;v&ez1ajrj^kh*E znz(%c#rY~UrXe%OtC9J#r24dC{V2vlEta?E_K2dA6cwr>&U4D!;Z&@t`~-1l)2TZ^5ZcBWn`aJn?zzOijc ziEf;IvmWYDew>j;jFOa3tE_mO_-d`o^gMJhA2Xb(;N0XrE#cwQg~c8D(uTA)y8&ee z`WW|pr=<@(o*8i$r}7qCvLy7O^F2Y-t2R&Rn0rP9Y&|E7Qv6#b9;>DbXBkl%QR7&q zr{V!t`($3=d86}kfiTNPC^CTzlI4_}FYFKsqq?a~o`^&)8PiNK@!0uigG&p&DF_*) z;VH%&+C&O!7|x|(hue$rU9M#Q##;9{rTg=?C`HM0S)8T%8|6Zu>5Ss`#}bO;jT+L$ zM(Efy#}ImECin7~(-3Qjm2oL4_KulG9(Stnj6&&x-6ZzV-CeB-qi-< 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 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 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", From e77ddebc07d75c2b178b7f63fd8e83ed05df3eec Mon Sep 17 00:00:00 2001 From: Anonymous Hacker Date: Thu, 14 Apr 2022 22:42:23 -0400 Subject: [PATCH 3/3] Attempt to make CodeFactor happier Move some stuff around to try and make CodeFactor happier. --- .../data/models/BlockModelGenerator.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/BlockModelGenerator.java b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/BlockModelGenerator.java index 3f1b8f067..5b9acb887 100644 --- a/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/BlockModelGenerator.java +++ b/src/main/java/com/anonymoushacker1279/immersiveweapons/data/models/BlockModelGenerator.java @@ -21,18 +21,18 @@ public class BlockModelGenerator { - final Consumer blockStateOutput; - final BiConsumer> modelOutput; + private final Consumer blockStateOutput; + private final BiConsumer> modelOutput; private final Consumer skippedAutoModelsOutput; - final List nonOrientableTrapdoor = ImmutableList.of(Blocks.OAK_TRAPDOOR, Blocks.DARK_OAK_TRAPDOOR, + private final List nonOrientableTrapdoor = ImmutableList.of(Blocks.OAK_TRAPDOOR, Blocks.DARK_OAK_TRAPDOOR, Blocks.IRON_TRAPDOOR); - final Map fullBlockModelCustomGenerators = ImmutableMap. builder() + private final Map fullBlockModelCustomGenerators = ImmutableMap. builder() .put(Blocks.STONE, BlockModelGenerator::createMirroredCubeGenerator) .put(Blocks.DEEPSLATE, BlockModelGenerator::createMirroredColumnGenerator).build(); - final Map texturedModels = ImmutableMap. builder().build(); + private final Map texturedModels = ImmutableMap. builder().build(); public BlockModelGenerator(Consumer pBlockStateOutput, BiConsumer> pModelOutput, Consumer pSkippedAutoModelsOutput) { @@ -181,7 +181,7 @@ static MultiVariantGenerator createSimpleBlock(Block pBlock, ResourceLocation pM return MultiVariantGenerator.multiVariant(pBlock, Variant.variant().with(VariantProperties.MODEL, pModelLocation)); } - void createDoor(Block pDoorBlock) { + private void createDoor(Block pDoorBlock) { TextureMapping door = TextureMapping.door(pDoorBlock); ResourceLocation resourceLocation = ModelTemplates.DOOR_BOTTOM.create(pDoorBlock, door, modelOutput); ResourceLocation resourceLocation1 = ModelTemplates.DOOR_BOTTOM_HINGE.create(pDoorBlock, door, modelOutput); @@ -238,7 +238,7 @@ private static BlockStateGenerator createDoor(Block pDoorBlock, ResourceLocation DoubleBlockHalf.UPPER, pTopHalfModelLocation, pTopHalfRightHingeModelLocation)); } - void createSimpleFlatItemModel(Item pFlatItem) { + private void createSimpleFlatItemModel(Item pFlatItem) { ModelTemplates.FLAT_ITEM.create(ModelLocationUtils.getModelLocation(pFlatItem), TextureMapping.layer0(pFlatItem), modelOutput); } @@ -309,7 +309,7 @@ void createSimpleFlatItemModel(Item pFlatItem) { .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)); } - static BlockStateGenerator createAxisAlignedPillarBlock(Block pAxisAlignedPillarBlock, ResourceLocation pModelLocation) { + private static BlockStateGenerator createAxisAlignedPillarBlock(Block pAxisAlignedPillarBlock, ResourceLocation pModelLocation) { return MultiVariantGenerator.multiVariant(pAxisAlignedPillarBlock, Variant.variant() .with(VariantProperties.MODEL, pModelLocation)).with(createRotatedPillar()); } @@ -321,7 +321,7 @@ private static PropertyDispatch createRotatedPillar() { .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)); } - static BlockStateGenerator createRotatedPillarWithHorizontalVariant(Block pRotatedPillarBlock, ResourceLocation pModelLocation + private static BlockStateGenerator createRotatedPillarWithHorizontalVariant(Block pRotatedPillarBlock, ResourceLocation pModelLocation , ResourceLocation pHorizontalModelLocation) { return MultiVariantGenerator.multiVariant(pRotatedPillarBlock) .with(PropertyDispatch.property(BlockStateProperties.AXIS) @@ -338,12 +338,12 @@ private WoodProvider woodProvider(Block pLogBlock) { return new WoodProvider(TextureMapping.logColumn(pLogBlock)); } - void delegateItemModel(Block pBlock, ResourceLocation pDelegateModelLocation) { + private void delegateItemModel(Block pBlock, ResourceLocation pDelegateModelLocation) { modelOutput.accept(ModelLocationUtils.getModelLocation(pBlock.asItem()), new DelegatedModel(pDelegateModelLocation)); } - static BlockStateGenerator createButton(Block pButtonBlock, ResourceLocation pUnpoweredModelLocation, - ResourceLocation pPoweredModelLocation) { + private static BlockStateGenerator createButton(Block pButtonBlock, ResourceLocation pUnpoweredModelLocation, + ResourceLocation pPoweredModelLocation) { return MultiVariantGenerator.multiVariant(pButtonBlock) .with(PropertyDispatch.property(BlockStateProperties.POWERED) @@ -401,8 +401,8 @@ static BlockStateGenerator createButton(Block pButtonBlock, ResourceLocation pUn .with(VariantProperties.X_ROT, VariantProperties.Rotation.R180))); } - static BlockStateGenerator createWall(Block pWallBlock, ResourceLocation pPostModelLocation, - ResourceLocation pLowSideModelLocation, ResourceLocation pTallSideModelLocation) { + private static BlockStateGenerator createWall(Block pWallBlock, ResourceLocation pPostModelLocation, + ResourceLocation pLowSideModelLocation, ResourceLocation pTallSideModelLocation) { return MultiPartGenerator.multiPart(pWallBlock) .with(Condition.condition().term(BlockStateProperties.UP, true), @@ -448,8 +448,8 @@ static BlockStateGenerator createWall(Block pWallBlock, ResourceLocation pPostMo .with(VariantProperties.UV_LOCK, true)); } - static BlockStateGenerator createFence(Block pFenceBlock, ResourceLocation pFencePostModelLocation, - ResourceLocation pFenceSideModelLocation) { + private static BlockStateGenerator createFence(Block pFenceBlock, ResourceLocation pFencePostModelLocation, + ResourceLocation pFenceSideModelLocation) { return MultiPartGenerator.multiPart(pFenceBlock) .with(Variant.variant() @@ -474,10 +474,10 @@ static BlockStateGenerator createFence(Block pFenceBlock, ResourceLocation pFenc .with(VariantProperties.UV_LOCK, true)); } - static BlockStateGenerator createFenceGate(Block pFenceGateBlock, ResourceLocation pOpenModelLocation, - ResourceLocation pClosedModelLocation, - ResourceLocation pWallOpenModelLocation, - ResourceLocation pWallClosedModelLocation) { + private static BlockStateGenerator createFenceGate(Block pFenceGateBlock, ResourceLocation pOpenModelLocation, + ResourceLocation pClosedModelLocation, + ResourceLocation pWallOpenModelLocation, + ResourceLocation pWallClosedModelLocation) { return MultiVariantGenerator.multiVariant(pFenceGateBlock, Variant.variant() @@ -512,8 +512,8 @@ private static PropertyDispatch createHorizontalFacingDispatchAlt() { .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)); } - static BlockStateGenerator createPressurePlate(Block pPressurePlateBlock, ResourceLocation pUnpoweredModelLocation, - ResourceLocation pPoweredModelLocation) { + private static BlockStateGenerator createPressurePlate(Block pPressurePlateBlock, ResourceLocation pUnpoweredModelLocation, + ResourceLocation pPoweredModelLocation) { return MultiVariantGenerator.multiVariant(pPressurePlateBlock) .with(createBooleanModelDispatch(BlockStateProperties.POWERED, pPoweredModelLocation, @@ -530,12 +530,12 @@ private static PropertyDispatch createBooleanModelDispatch(BooleanProperty pProp .select(false, Variant.variant().with(VariantProperties.MODEL, pFalseModelLocation)); } - void skipAutoItemBlock(Block pBlock) { + private void skipAutoItemBlock(Block pBlock) { skippedAutoModelsOutput.accept(pBlock.asItem()); } - static BlockStateGenerator createSlab(Block pSlabBlock, ResourceLocation pBottomHalfModelLocation, - ResourceLocation pTopHalfModelLocation, ResourceLocation pDoubleModelLocation) { + private static BlockStateGenerator createSlab(Block pSlabBlock, ResourceLocation pBottomHalfModelLocation, + ResourceLocation pTopHalfModelLocation, ResourceLocation pDoubleModelLocation) { return MultiVariantGenerator.multiVariant(pSlabBlock) .with(PropertyDispatch.property(BlockStateProperties.SLAB_TYPE) @@ -550,9 +550,9 @@ static BlockStateGenerator createSlab(Block pSlabBlock, ResourceLocation pBottom .with(VariantProperties.MODEL, pDoubleModelLocation))); } - static BlockStateGenerator createStairs(Block pStairsBlock, ResourceLocation pInnerModelLocation, - ResourceLocation pStraightModelLocation, - ResourceLocation pOuterModelLocation) { + private static BlockStateGenerator createStairs(Block pStairsBlock, ResourceLocation pInnerModelLocation, + ResourceLocation pStraightModelLocation, + ResourceLocation pOuterModelLocation) { return MultiVariantGenerator.multiVariant(pStairsBlock) .with(PropertyDispatch @@ -765,7 +765,7 @@ static BlockStateGenerator createStairs(Block pStairsBlock, ResourceLocation pIn .with(VariantProperties.UV_LOCK, true))); } - void createTrapdoor(Block pTrapdoorBlock) { + private void createTrapdoor(Block pTrapdoorBlock) { TextureMapping textureMapping = TextureMapping.defaultTexture(pTrapdoorBlock); ResourceLocation resourceLocation = ModelTemplates.TRAPDOOR_TOP.create(pTrapdoorBlock, textureMapping, modelOutput); ResourceLocation resourceLocation1 = ModelTemplates.TRAPDOOR_BOTTOM.create(pTrapdoorBlock, textureMapping, modelOutput); @@ -837,7 +837,7 @@ private static BlockStateGenerator createTrapdoor(Block pTrapdoorBlock, Resource .with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))); } - void createOrientableTrapdoor(Block pOrientableTrapdoorBlock) { + private void createOrientableTrapdoor(Block pOrientableTrapdoorBlock) { TextureMapping textureMapping = TextureMapping.defaultTexture(pOrientableTrapdoorBlock); ResourceLocation resourceLocation = ModelTemplates.ORIENTABLE_TRAPDOOR_TOP .create(pOrientableTrapdoorBlock, textureMapping, modelOutput);

)CLais@iakF(xqVoR7jF#QW6dn-VmD7C=9Nn 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 z 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 rz%|w*NQ#cIY7 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