From 56271c4cf4dac908367248a95b557ceccf1c98d5 Mon Sep 17 00:00:00 2001 From: Chakyl Date: Tue, 16 Jun 2026 17:48:36 -0400 Subject: [PATCH 01/12] I managed to mess up every recipe but it's compiling --- .../unusualfishmod/UnusualFishMod.java | 31 +- .../unusualfishmod/client/ClientEvents.java | 49 +-- .../unusualfishmod/client/UFModelLayers.java | 6 +- .../geo/DemonHerringGlowRenderLayer.java | 7 +- .../client/geo/GenericGeoModel.java | 8 +- .../client/geo/UFGlowRenderLayer.java | 4 +- .../misc/render/AbyssalBlastRenderer.java | 30 +- .../client/misc/render/RootballRenderer.java | 5 +- .../client/misc/render/SeaSpikeRenderer.java | 5 +- .../render/ThrownPrismarineSpearRenderer.java | 8 +- .../render/model/PrismarineSpearModel.java | 4 +- .../misc/render/model/RootballModel.java | 8 +- .../unusualfishmod/common/CommonEvents.java | 144 +++---- .../common/block/SeaBoomBlock.java | 16 +- .../common/block/VoltDetectorBlock.java | 6 + .../block_entity/VoltDetectorBlockEntity.java | 7 +- .../enchantment/UnusualCatchEnchantment.java | 39 -- .../common/entity/AeroMono.java | 12 +- .../common/entity/AmberGoby.java | 12 +- .../common/entity/BarkAngelfish.java | 10 +- .../common/entity/BeakedHerring.java | 12 +- .../common/entity/BlackCapSnail.java | 26 +- .../common/entity/BlindSailfin.java | 12 +- .../common/entity/BlizzardfinTuna.java | 10 +- .../common/entity/BrickSnail.java | 12 +- .../common/entity/CelestialFish.java | 10 +- .../common/entity/CircusFish.java | 12 +- .../common/entity/ClownthornShark.java | 10 +- .../common/entity/CopperflameAnthias.java | 35 +- .../common/entity/CrimsonshellSquid.java | 29 +- .../common/entity/DeepCrawler.java | 16 +- .../common/entity/DemonHerring.java | 33 +- .../common/entity/DroopingGourami.java | 12 +- .../common/entity/DualityDamselfish.java | 30 +- .../common/entity/EyelashFish.java | 34 +- .../common/entity/Forkfish.java | 12 +- .../common/entity/FreshwaterMantis.java | 19 +- .../unusualfishmod/common/entity/Gnasher.java | 17 +- .../common/entity/HatchetFish.java | 13 +- .../unusualfishmod/common/entity/Kalappa.java | 17 +- .../common/entity/LobedSkipper.java | 44 +-- .../common/entity/ManaJellyfish.java | 10 +- .../common/entity/Mossthorn.java | 10 +- .../common/entity/MuddytopSnail.java | 12 +- .../common/entity/Picklefish.java | 12 +- .../common/entity/PinkfinIdol.java | 10 +- .../common/entity/PorcupineLobster.java | 16 +- .../unusualfishmod/common/entity/Prawn.java | 24 +- .../common/entity/RhinoTetra.java | 32 +- .../unusualfishmod/common/entity/Ripper.java | 17 +- .../common/entity/Rootball.java | 19 +- .../common/entity/RoughbackGuitarfish.java | 10 +- .../common/entity/SailorBarb.java | 10 +- .../common/entity/SeaMosquito.java | 10 +- .../common/entity/SeaPancake.java | 18 +- .../common/entity/SeaSpider.java | 16 +- .../common/entity/Shockcat.java | 12 +- .../unusualfishmod/common/entity/Skrimp.java | 48 +-- .../common/entity/SneepSnorp.java | 10 +- .../common/entity/SnowflakeTailFish.java | 10 +- .../common/entity/Spindlefish.java | 12 +- .../common/entity/SpoonShark.java | 10 +- .../common/entity/Squoddle.java | 16 +- .../common/entity/StoutBichir.java | 10 +- .../common/entity/TigerJungleShark.java | 16 +- .../common/entity/TigerPuffer.java | 24 +- .../unusualfishmod/common/entity/Tribble.java | 16 +- .../common/entity/TripleTwirlPleco.java | 10 +- .../common/entity/TrumpetSquid.java | 33 +- .../common/entity/VoltAngler.java | 10 +- .../common/entity/ZebraCornetfish.java | 10 +- .../item/AbstractMovingBlockEntity.java | 20 +- .../common/entity/item/AbyssalBlast.java | 19 +- .../entity/item/FallingTreeBlockEntity.java | 19 +- .../common/entity/item/SeaSpike.java | 5 + .../entity/item/ThrownPrismarineSpear.java | 45 ++- .../util/base/BreedableWaterAnimal.java | 9 +- .../base/BucketableSchoolingWaterAnimal.java | 2 +- .../util/base/BucketableWaterAnimal.java | 20 +- .../entity/util/goal/BottomStrollGoal.java | 7 +- .../entity/util/goal/SquidLayEggsGoal.java | 4 +- .../entity/util/misc/MovingBlockData.java | 2 +- .../common/entity/util/misc/UFAnimations.java | 2 +- .../util/movement/SnailMoveControl.java | 4 +- .../util/movement/SquidMoveControl.java | 4 +- .../common/item/DepthScytheItem.java | 26 +- .../common/item/PrismarineSpearItem.java | 51 ++- .../common/item/RipsawItem.java | 49 +-- .../common/item/UFFishBucketItem.java | 2 +- .../common/item/WeatherShellItem.java | 13 +- .../loot/BuriedTreasureLootModifier.java | 14 +- .../loot/UnderwaterRuinsLootModifier.java | 11 +- .../common/loot/UnusualCatchLootModifier.java | 61 +-- .../core/registry/UFBlockEntities.java | 12 +- .../core/registry/UFBlocks.java | 74 ++-- .../core/registry/UFEnchantments.java | 13 +- .../core/registry/UFEntities.java | 125 +++--- .../core/registry/UFFoodProperties.java | 82 ++-- .../unusualfishmod/core/registry/UFItems.java | 374 +++++++++--------- .../core/registry/UFLootModifiers.java | 20 +- .../core/registry/UFSounds.java | 36 +- .../unusualfishmod/core/registry/UFTabs.java | 12 +- .../unusualfishmod/core/registry/UFTags.java | 11 +- .../unusualfishmod/core/registry/UFTiers.java | 8 + .../resources/META-INF/accesstransformer.cfg | 2 - src/main/resources/META-INF/mods.toml | 70 ---- .../entity/duality_damselfish.animation.json | 2 +- .../entity/freshwater_mantis.animation.json | 2 +- .../entity/sea_pancake.animation.json | 2 +- .../models/item/depth_scythe.json | 4 +- .../models/item/prismarine_spear.json | 4 +- .../item/prismarine_spear_handheld_using.json | 4 +- .../items => c/tags/item}/cooked_fishes.json | 0 .../tags/item}/foods/cooked_fishes.json | 0 .../tags/item}/foods/raw_fishes.json | 0 .../items => c/tags/item}/raw_fishes.json | 0 .../{blocks => block}/mineable/pickaxe.json | 0 .../tags/{blocks => block}/slabs.json | 0 .../tags/{blocks => block}/stairs.json | 0 .../tags/{blocks => block}/walls.json | 0 .../tags/{items => item}/fishes.json | 0 .../minecraft/tags/{items => item}/slabs.json | 0 .../tags/{items => item}/stairs.json | 0 .../minecraft/tags/{items => item}/walls.json | 0 .../minecraft/tags/items/music_discs.json | 6 - .../loot_modifiers/global_loot_modifiers.json | 0 .../enchantment/unusual_catch.json | 23 ++ .../loot_modifiers/buried_treasure_glm.json | 2 +- .../loot_modifiers/underwater_ruins_glm.json | 2 +- .../loot_modifiers/unusual_catch_glm.json | 2 +- .../biome_modifier/aero_mono.json | 2 +- .../biome_modifier/amber_goby.json | 2 +- .../biome_modifier/bark_angelfish.json | 2 +- .../biome_modifier/beaked_herring.json | 2 +- .../biome_modifier/blackcap_snail.json | 2 +- .../biome_modifier/blind_sailfin.json | 2 +- .../biome_modifier/blizzardfin_tuna.json | 2 +- .../biome_modifier/brick_snail.json | 2 +- .../biome_modifier/celestial_fish.json | 2 +- .../biome_modifier/circus_fish.json | 2 +- .../biome_modifier/clownthorn_shark.json | 2 +- .../biome_modifier/copperflame_anthias.json | 2 +- .../biome_modifier/coral_skrimp.json | 2 +- .../biome_modifier/crimsonshell_squid.json | 2 +- .../biome_modifier/deep_crawler.json | 2 +- .../biome_modifier/demon_herring.json | 2 +- .../biome_modifier/drooping_gourami.json | 2 +- .../biome_modifier/duality_damselfish.json | 2 +- .../biome_modifier/eyelash_fish.json | 2 +- .../biome_modifier/forkfish.json | 2 +- .../biome_modifier/freshwater_mantis.json | 2 +- .../biome_modifier/gnasher.json | 2 +- .../biome_modifier/hatchet_fish.json | 2 +- .../biome_modifier/kalappa.json | 2 +- .../biome_modifier/lobed_skipper.json | 2 +- .../biome_modifier/mossthorn.json | 2 +- .../biome_modifier/muddytop_snail.json | 2 +- .../biome_modifier/picklefish.json | 2 +- .../biome_modifier/pinkfin.json | 2 +- .../biome_modifier/porcupine_lobster.json | 2 +- .../biome_modifier/prawn.json | 2 +- .../remove_deep_dark_spawns.json | 2 +- .../biome_modifier/rhino_tetra.json | 2 +- .../biome_modifier/ripper.json | 2 +- .../biome_modifier/roughback_guitarfish.json | 2 +- .../biome_modifier/sailor_barb.json | 2 +- .../biome_modifier/sea_mosquito.json | 2 +- .../biome_modifier/sea_pancake.json | 2 +- .../biome_modifier/sea_spider.json | 2 +- .../biome_modifier/shockcat.json | 2 +- .../biome_modifier/sneep_snorp.json | 2 +- .../biome_modifier/snowflake_tail_fish.json | 2 +- .../biome_modifier/spindlefish.json | 2 +- .../biome_modifier/spoon_shark.json | 2 +- .../biome_modifier/squoddle.json | 2 +- .../biome_modifier/stout_bichir.json | 2 +- .../biome_modifier/tiger_jungle_shark.json | 2 +- .../biome_modifier/tiger_puffer.json | 2 +- .../biome_modifier/tribble.json | 2 +- .../biome_modifier/triple_twirl_pleco.json | 2 +- .../biome_modifier/trumpet_squid.json | 2 +- .../biome_modifier/volt_angler.json | 2 +- .../biome_modifier/wizard_jelly.json | 2 +- .../biome_modifier/zebra_cornetfish.json | 2 +- .../ancient_weapon_smithing_template.json | 25 -- .../recipes/chiseled_crimson_bricks.json | 16 - .../chiseled_crimson_bricks_from_tiles.json | 16 - ...rimson_bricks_from_tiles_stonecutting.json | 8 - .../chiseled_crimson_bricks_stonecutting.json | 8 - .../recipes/chiseled_relucent_bricks.json | 16 - .../chiseled_relucent_bricks_from_tiles.json | 16 - ...lucent_bricks_from_tiles_stonecutting.json | 8 - ...chiseled_relucent_bricks_stonecutting.json | 8 - .../recipes/cooked_aero_mono_stick.json | 9 - ...aero_mono_stick_from_campfire_cooking.json | 9 - .../cooked_aero_mono_stick_from_smoking.json | 9 - .../recipes/cooked_blizzard_tuna.json | 9 - ...d_blizzard_tuna_from_campfire_cooking.json | 9 - .../cooked_blizzard_tuna_from_smoking.json | 9 - .../unusualfishmod/recipes/cooked_fillet.json | 9 - .../cooked_fillet_from_campfire_cooking.json | 9 - .../recipes/cooked_fillet_from_smoking.json | 9 - .../recipes/cooked_lobster.json | 9 - .../cooked_lobster_from_campfire_cooking.json | 9 - .../recipes/cooked_lobster_from_smoking.json | 9 - .../recipes/cooked_mossthorn.json | 9 - ...ooked_mossthorn_from_campfire_cooking.json | 9 - .../cooked_mossthorn_from_smoking.json | 9 - .../recipes/cooked_shockcat.json | 9 - ...cooked_shockcat_from_campfire_cooking.json | 9 - .../recipes/cooked_shockcat_from_smoking.json | 9 - .../recipes/copper_antenna.json | 19 - .../recipes/crimson_brick_slab.json | 15 - .../crimson_brick_slab_stonecutting.json | 8 - .../recipes/crimson_brick_stairs.json | 17 - .../crimson_brick_stairs_stonecutting.json | 8 - .../recipes/crimson_brick_wall.json | 16 - .../crimson_brick_wall_stonecutting.json | 8 - .../recipes/crimson_bricks.json | 16 - .../recipes/crimson_tile_slab.json | 15 - ...son_tile_slab_from_tiles_stonecutting.json | 8 - .../crimson_tile_slab_stonecutting.json | 8 - .../recipes/crimson_tile_stairs.json | 17 - ...n_tile_stairs_from_tiles_stonecutting.json | 8 - .../crimson_tile_stairs_stonecutting.json | 8 - .../recipes/crimson_tile_wall.json | 16 - ...son_tile_wall_from_tiles_stonecutting.json | 8 - .../crimson_tile_wall_stonecutting.json | 8 - .../unusualfishmod/recipes/crimson_tiles.json | 16 - .../recipes/crimson_tiles_stonecutting.json | 8 - .../recipes/depth_scythe_smithing.json | 15 - .../unusualfishmod/recipes/lobster_roll.json | 15 - .../unusualfishmod/recipes/nautical_lamp.json | 26 -- .../recipes/odd_fishsticks.json | 15 - .../unusualfishmod/recipes/pickledish.json | 25 -- .../recipes/prismarine_spear.json | 20 - .../recipes/raw_aero_mono_stick.json | 15 - .../recipes/relucent_brick_slab.json | 15 - .../relucent_brick_slab_stonecutting.json | 8 - .../recipes/relucent_brick_stairs.json | 17 - .../relucent_brick_stairs_stonecutting.json | 8 - .../recipes/relucent_brick_wall.json | 16 - .../relucent_brick_wall_stonecutting.json | 8 - .../recipes/relucent_bricks.json | 16 - .../recipes/relucent_tile_slab.json | 15 - ...ent_tile_slab_from_tiles_stonecutting.json | 8 - .../relucent_tile_slab_stonecutting.json | 8 - .../recipes/relucent_tile_stairs.json | 17 - ...t_tile_stairs_from_tiles_stonecutting.json | 8 - .../relucent_tile_stairs_stonecutting.json | 8 - .../recipes/relucent_tile_wall.json | 16 - ...ent_tile_wall_from_tiles_stonecutting.json | 8 - .../relucent_tile_wall_stonecutting.json | 8 - .../recipes/relucent_tiles.json | 16 - .../recipes/relucent_tiles_stonecutting.json | 8 - .../recipes/ripsaw_smithing.json | 15 - .../data/unusualfishmod/recipes/sea_boom.json | 23 -- .../unusualfishmod/recipes/strange_broth.json | 29 -- .../recipes/unusual_sandwich.json | 23 -- .../unusualfishmod/recipes/volt_detector.json | 26 -- .../recipes/weird_goldfish.json | 21 - .../tags/{blocks => block}/squid_eggs.json | 0 .../tags/{blocks => block}/unchoppable.json | 1 + .../cephalopods.json | 0 .../crustaceans.json | 1 + .../{entity_types => entity_type}/snails.json | 1 + .../tiger_puffer_prey.json | 0 .../volt_undetected.json | 1 + .../{items => item}/cooked_unusual_fish.json | 1 + .../{items => item}/raw_unusual_fish.json | 1 + .../tags/{items => item}/unusual_catch.json | 1 + src/main/resources/pack.mcmeta | 2 +- 272 files changed, 1355 insertions(+), 2328 deletions(-) delete mode 100644 src/main/java/codyhuh/unusualfishmod/common/enchantment/UnusualCatchEnchantment.java delete mode 100644 src/main/resources/META-INF/accesstransformer.cfg delete mode 100644 src/main/resources/META-INF/mods.toml rename src/main/resources/data/{forge/tags/items => c/tags/item}/cooked_fishes.json (100%) rename src/main/resources/data/{forge/tags/items => c/tags/item}/foods/cooked_fishes.json (100%) rename src/main/resources/data/{forge/tags/items => c/tags/item}/foods/raw_fishes.json (100%) rename src/main/resources/data/{forge/tags/items => c/tags/item}/raw_fishes.json (100%) rename src/main/resources/data/minecraft/tags/{blocks => block}/mineable/pickaxe.json (100%) rename src/main/resources/data/minecraft/tags/{blocks => block}/slabs.json (100%) rename src/main/resources/data/minecraft/tags/{blocks => block}/stairs.json (100%) rename src/main/resources/data/minecraft/tags/{blocks => block}/walls.json (100%) rename src/main/resources/data/minecraft/tags/{items => item}/fishes.json (100%) rename src/main/resources/data/minecraft/tags/{items => item}/slabs.json (100%) rename src/main/resources/data/minecraft/tags/{items => item}/stairs.json (100%) rename src/main/resources/data/minecraft/tags/{items => item}/walls.json (100%) delete mode 100644 src/main/resources/data/minecraft/tags/items/music_discs.json rename src/main/resources/data/{forge => neoforge}/loot_modifiers/global_loot_modifiers.json (100%) create mode 100644 src/main/resources/data/unusualfishmod/enchantment/unusual_catch.json rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/aero_mono.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/amber_goby.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/bark_angelfish.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/beaked_herring.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/blackcap_snail.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/blind_sailfin.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/blizzardfin_tuna.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/brick_snail.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/celestial_fish.json (81%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/circus_fish.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/clownthorn_shark.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/copperflame_anthias.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/coral_skrimp.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/crimsonshell_squid.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/deep_crawler.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/demon_herring.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/drooping_gourami.json (84%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/duality_damselfish.json (84%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/eyelash_fish.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/forkfish.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/freshwater_mantis.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/gnasher.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/hatchet_fish.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/kalappa.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/lobed_skipper.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/mossthorn.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/muddytop_snail.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/picklefish.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/pinkfin.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/porcupine_lobster.json (84%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/prawn.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/remove_deep_dark_spawns.json (86%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/rhino_tetra.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/ripper.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/roughback_guitarfish.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/sailor_barb.json (85%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/sea_mosquito.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/sea_pancake.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/sea_spider.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/shockcat.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/sneep_snorp.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/snowflake_tail_fish.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/spindlefish.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/spoon_shark.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/squoddle.json (84%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/stout_bichir.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/tiger_jungle_shark.json (82%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/tiger_puffer.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/tribble.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/triple_twirl_pleco.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/trumpet_squid.json (84%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/volt_angler.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/wizard_jelly.json (83%) rename src/main/resources/data/unusualfishmod/{forge => neoforge}/biome_modifier/zebra_cornetfish.json (83%) delete mode 100644 src/main/resources/data/unusualfishmod/recipes/ancient_weapon_smithing_template.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_from_tiles.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_from_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_from_tiles.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_from_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick_from_campfire_cooking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick_from_smoking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna_from_campfire_cooking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna_from_smoking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_fillet.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_fillet_from_campfire_cooking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_fillet_from_smoking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_lobster.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_lobster_from_campfire_cooking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_lobster_from_smoking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn_from_campfire_cooking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn_from_smoking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_shockcat.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_shockcat_from_campfire_cooking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/cooked_shockcat_from_smoking.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/copper_antenna.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_brick_slab.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_brick_slab_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_brick_stairs.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_brick_stairs_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_brick_wall.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_brick_wall_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_bricks.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab_from_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs_from_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall_from_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tiles.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/crimson_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/depth_scythe_smithing.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/lobster_roll.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/nautical_lamp.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/odd_fishsticks.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/pickledish.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/prismarine_spear.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/raw_aero_mono_stick.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_brick_slab.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_brick_slab_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_brick_stairs.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_brick_stairs_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_brick_wall.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_brick_wall_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_bricks.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab_from_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs_from_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall_from_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tiles.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/relucent_tiles_stonecutting.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/ripsaw_smithing.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/sea_boom.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/strange_broth.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/unusual_sandwich.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/volt_detector.json delete mode 100644 src/main/resources/data/unusualfishmod/recipes/weird_goldfish.json rename src/main/resources/data/unusualfishmod/tags/{blocks => block}/squid_eggs.json (100%) rename src/main/resources/data/unusualfishmod/tags/{blocks => block}/unchoppable.json (51%) rename src/main/resources/data/unusualfishmod/tags/{entity_types => entity_type}/cephalopods.json (100%) rename src/main/resources/data/unusualfishmod/tags/{entity_types => entity_type}/crustaceans.json (94%) rename src/main/resources/data/unusualfishmod/tags/{entity_types => entity_type}/snails.json (85%) rename src/main/resources/data/unusualfishmod/tags/{entity_types => entity_type}/tiger_puffer_prey.json (100%) rename src/main/resources/data/unusualfishmod/tags/{entity_types => entity_type}/volt_undetected.json (51%) rename src/main/resources/data/unusualfishmod/tags/{items => item}/cooked_unusual_fish.json (91%) rename src/main/resources/data/unusualfishmod/tags/{items => item}/raw_unusual_fish.json (97%) rename src/main/resources/data/unusualfishmod/tags/{items => item}/unusual_catch.json (94%) diff --git a/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java b/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java index bd677d5..98a7e38 100644 --- a/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java +++ b/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java @@ -1,29 +1,30 @@ package codyhuh.unusualfishmod; import codyhuh.unusualfishmod.core.registry.*; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraft.core.MappedRegistry; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.NeoForge; @Mod(UnusualFishMod.MOD_ID) public class UnusualFishMod { public static final String MOD_ID = "unusualfishmod"; + public UnusualFishMod(IEventBus bus, ModContainer modContainer) { - public UnusualFishMod() { - IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); - - UFItems.ITEMS.register(bus); - UFEntities.ENTITIES.register(bus); - UFBlocks.BLOCKS.register(bus); - UFEnchantments.ENCHANTMENTS.register(bus); UFSounds.SOUND_EVENTS.register(bus); + UFBlocks.BLOCKS.register(bus); UFBlockEntities.BLOCK_ENTITIES.register(bus); - UFLootModifiers.LOOT_MODIFIERS.register(bus); + UFEntities.ENTITIES.register(bus); + UFItems.ITEMS.register(bus); UFTabs.CREATIVE_TABS.register(bus); + UFLootModifiers.LOOT_MODIFIERS.register(bus); + +// NeoForge.EVENT_BUS.register(this); + } - MinecraftForge.EVENT_BUS.register(this); + public static ResourceLocation loc(String path) { + return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); } } diff --git a/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java b/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java index 1503637..e85fd1e 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java +++ b/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java @@ -16,28 +16,29 @@ import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; import java.util.ArrayList; -@Mod.EventBusSubscriber(modid = UnusualFishMod.MOD_ID, bus = Bus.MOD, value = Dist.CLIENT) +import static codyhuh.unusualfishmod.UnusualFishMod.loc; + +@EventBusSubscriber(modid = UnusualFishMod.MOD_ID, value = Dist.CLIENT) public final class ClientEvents { @SubscribeEvent public static void clientSetup(FMLClientSetupEvent e) { - ItemProperties.register(UFItems.CLEMENT_SHELL.get(), new ResourceLocation("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); - ItemProperties.register(UFItems.FLUVIAL_SHELL.get(), new ResourceLocation("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); - ItemProperties.register(UFItems.THUNDEROUS_SHELL.get(), new ResourceLocation("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); - ItemProperties.register(UFItems.PRISMARINE_SPEAR.get(), new ResourceLocation("using"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); + ItemProperties.register(UFItems.CLEMENT_SHELL.get(), loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); + ItemProperties.register(UFItems.FLUVIAL_SHELL.get(),loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); + ItemProperties.register(UFItems.THUNDEROUS_SHELL.get(), loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); + ItemProperties.register(UFItems.PRISMARINE_SPEAR.get(), loc("using"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); ///ItemProperties.register(UFItems.RIPSAW.get(), new ResourceLocation("sawing"), (stack, level, player, i) -> player != null && player.isUsingItem() && stack.hasTag() ? stack.getOrCreateTag().getFloat("SawingProgress") : 0.0F); - ItemProperties.register(UFItems.CORAL_SKRIMP_BUCKET.get(), new ResourceLocation(UnusualFishMod.MOD_ID, "variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); - ItemProperties.register(UFItems.COPPERFLAME_BUCKET.get(), new ResourceLocation(UnusualFishMod.MOD_ID, "variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); - ItemProperties.register(UFItems.DEMON_HERRING_BUCKET.get(), new ResourceLocation(UnusualFishMod.MOD_ID, "variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); +// ItemProperties.register(UFItems.CORAL_SKRIMP_BUCKET.get(), loc("variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); +// ItemProperties.register(UFItems.COPPERFLAME_BUCKET.get(), loc("variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); +// ItemProperties.register(UFItems.DEMON_HERRING_BUCKET.get(), loc("variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); } private static void make(EntityType type, String name){ @@ -68,7 +69,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { TextureVariantModel model = new TextureVariantModel<>("duality_damselfish"); ArrayList textures = new ArrayList<>(); for (int i = 1; i <= 2; i++) { - textures.add(new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/duality_damselfish/duality_damselfish_" + i + ".png")); + textures.add(loc("textures/entity/duality_damselfish/duality_damselfish_" + i + ".png")); } model.setTextures(DualityDamselfish::getVariant, textures); return model; @@ -83,7 +84,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { TextureVariantModel model = new TextureVariantModel<>("copperflame"); ArrayList textures = new ArrayList<>(); for (int i = 1; i <= 2; i++) { - textures.add(new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/copperflame_anthias/copperflame_" + i + ".png")); + textures.add(loc("textures/entity/copperflame_anthias/copperflame_" + i + ".png")); } model.setTextures(CopperflameAnthias::getVariant, textures); return model; @@ -96,7 +97,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { TextureVariantModel model = new TextureVariantModel<>("demon_herring"); ArrayList textures = new ArrayList<>(); for (int i = 1; i <= 3; i++) { - textures.add(new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/demon_herring/demon_herring_" + i + ".png")); + textures.add(loc("textures/entity/demon_herring/demon_herring_" + i + ".png")); } model.setTextures(DemonHerring::getVariant, textures); return model; @@ -107,7 +108,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { e.registerEntityRenderer(UFEntities.GNASHER.get(), (ctx) -> { GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("gnasher"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/glow/gnasher.png"))); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/gnasher.png"))); return render; }); @@ -116,7 +117,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { TextureVariantModel model = new TextureVariantModel<>("eyelash_fish"); ArrayList textures = new ArrayList<>(); for (int i = 1; i <= 15; i++) { - textures.add(new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/eyelash_fish/eyelash_fish_" + i + ".png")); + textures.add(loc("textures/entity/eyelash_fish/eyelash_fish_" + i + ".png")); } model.setTextures(EyelashFish::getVariant, textures); return model; @@ -126,7 +127,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { e.registerEntityRenderer(UFEntities.HATCHET_FISH.get(), (ctx) -> { GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("hatchet_fish"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/glow/hatchet_fish.png"))); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/hatchet_fish.png"))); return render; }); @@ -134,7 +135,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { e.registerEntityRenderer(UFEntities.PICKLEFISH.get(), (ctx) -> { GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("picklefish"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/glow/picklefish.png"))); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/picklefish.png"))); return render; }); @@ -143,7 +144,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { TextureVariantModel model = new TextureVariantModel<>("skrimp"); ArrayList textures = new ArrayList<>(); for (int i = 1; i <= 15; i++) { - textures.add(new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/skrimp/skrimp_" + i + ".png")); + textures.add(loc("textures/entity/skrimp/skrimp_" + i + ".png")); } model.setTextures(Skrimp::getVariant, textures); return model; @@ -153,13 +154,13 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { e.registerEntityRenderer(UFEntities.SHOCKCAT.get(), (ctx) -> { GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("shockcat"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/glow/shockcat.png"))); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/shockcat.png"))); return render; }); e.registerEntityRenderer(UFEntities.VOLT_ANGLER.get(), (ctx) -> { GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("volt_angler"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/glow/volt_angler.png"))); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/volt_angler.png"))); return render; }); diff --git a/src/main/java/codyhuh/unusualfishmod/client/UFModelLayers.java b/src/main/java/codyhuh/unusualfishmod/client/UFModelLayers.java index e937c63..88fdf3a 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/UFModelLayers.java +++ b/src/main/java/codyhuh/unusualfishmod/client/UFModelLayers.java @@ -1,15 +1,15 @@ package codyhuh.unusualfishmod.client; -import codyhuh.unusualfishmod.UnusualFishMod; import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.resources.ResourceLocation; + +import static codyhuh.unusualfishmod.UnusualFishMod.loc; public class UFModelLayers { public static final ModelLayerLocation ROOTBALL = create("rootball"); public static final ModelLayerLocation PRISMARINE_SPEAR = create("prismarine_spear"); private static ModelLayerLocation create(String name) { - return new ModelLayerLocation(new ResourceLocation(UnusualFishMod.MOD_ID, name), "main"); + return new ModelLayerLocation(loc(name), "main"); } } diff --git a/src/main/java/codyhuh/unusualfishmod/client/geo/DemonHerringGlowRenderLayer.java b/src/main/java/codyhuh/unusualfishmod/client/geo/DemonHerringGlowRenderLayer.java index d01686d..0db7dd2 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/geo/DemonHerringGlowRenderLayer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/geo/DemonHerringGlowRenderLayer.java @@ -14,6 +14,9 @@ import software.bernie.geckolib.renderer.GeoRenderer; import software.bernie.geckolib.renderer.layer.GeoRenderLayer; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; +import static net.minecraft.util.FastColor.ARGB32.color; + public class DemonHerringGlowRenderLayer extends GeoRenderLayer { public DemonHerringGlowRenderLayer(GeoRenderer layer) { @@ -23,10 +26,10 @@ public DemonHerringGlowRenderLayer(GeoRenderer layer) { @Override public void render(PoseStack poseStack, T animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { int i = animatable.getVariant() + 1; - VertexConsumer vertexconsumer = bufferSource.getBuffer(RenderType.dragonExplosionAlpha(new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/glow/demon_herring_" + i + ".png"))); + VertexConsumer vertexconsumer = bufferSource.getBuffer(RenderType.dragonExplosionAlpha(loc("textures/entity/glow/demon_herring_" + i + ".png"))); if (!animatable.isInvisible()) { - this.getRenderer().reRender(bakedModel, poseStack, bufferSource, animatable, renderType, vertexconsumer, partialTick, packedLight, LivingEntityRenderer.getOverlayCoords(animatable, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); + this.getRenderer().reRender(bakedModel, poseStack, bufferSource, animatable, renderType, vertexconsumer, partialTick, packedLight, LivingEntityRenderer.getOverlayCoords(animatable, 0.0F), color(255, 255, 255, 255)); } } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoModel.java b/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoModel.java index f966b03..d242cc3 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoModel.java +++ b/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoModel.java @@ -6,6 +6,8 @@ import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.model.GeoModel; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; + public class GenericGeoModel extends GeoModel { private final String model; private final String texture; @@ -24,16 +26,16 @@ public GenericGeoModel(String model, String texture, String anim) { @Override public ResourceLocation getModelResource(E object) { - return new ResourceLocation(UnusualFishMod.MOD_ID, "geo/entity/" + model + ".geo.json"); + return loc("geo/entity/" + model + ".geo.json"); } @Override public ResourceLocation getTextureResource(E object) { - return new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/" + texture + ".png"); + return loc("textures/entity/" + texture + ".png"); } @Override public ResourceLocation getAnimationResource(E object) { - return new ResourceLocation(UnusualFishMod.MOD_ID, "animations/entity/" + anim + ".animation.json"); + return loc("animations/entity/" + anim + ".animation.json"); } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/client/geo/UFGlowRenderLayer.java b/src/main/java/codyhuh/unusualfishmod/client/geo/UFGlowRenderLayer.java index bb76002..c04c352 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/geo/UFGlowRenderLayer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/geo/UFGlowRenderLayer.java @@ -12,6 +12,8 @@ import software.bernie.geckolib.renderer.GeoRenderer; import software.bernie.geckolib.renderer.layer.GeoRenderLayer; +import static net.minecraft.util.FastColor.ARGB32.color; + public class UFGlowRenderLayer extends GeoRenderLayer { private final ResourceLocation glowLayer; @@ -25,7 +27,7 @@ public void render(PoseStack poseStack, T animatable, BakedGeoModel bakedModel, VertexConsumer vertexconsumer = bufferSource.getBuffer(RenderType.dragonExplosionAlpha(glowLayer)); if (!animatable.isInvisible()) { - this.getRenderer().reRender(bakedModel, poseStack, bufferSource, animatable, renderType, vertexconsumer, partialTick, packedLight, LivingEntityRenderer.getOverlayCoords(animatable, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); + this.getRenderer().reRender(bakedModel, poseStack, bufferSource, animatable, renderType, vertexconsumer, partialTick, packedLight, LivingEntityRenderer.getOverlayCoords(animatable, 0.0F), color(255, 255, 255, 255)); } } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java index c7afbcc..2363902 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java @@ -1,6 +1,5 @@ package codyhuh.unusualfishmod.client.misc.render; -import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.common.entity.item.AbyssalBlast; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -12,14 +11,15 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import org.joml.Matrix3f; import org.joml.Matrix4f; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; + public class AbyssalBlastRenderer extends EntityRenderer { - private static final ResourceLocation TEXTURE_0 = new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/abyssalblast/abyssal_blast_0.png"); - private static final ResourceLocation TEXTURE_1 = new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/abyssalblast/abyssal_blast_1.png"); - private static final ResourceLocation TEXTURE_2 = new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/abyssalblast/abyssal_blast_2.png"); - private static final ResourceLocation TEXTURE_3 = new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/abyssalblast/abyssal_blast_3.png"); + private static final ResourceLocation TEXTURE_0 = loc("textures/entity/abyssalblast/abyssal_blast_0.png"); + private static final ResourceLocation TEXTURE_1 = loc("textures/entity/abyssalblast/abyssal_blast_1.png"); + private static final ResourceLocation TEXTURE_2 = loc("textures/entity/abyssalblast/abyssal_blast_2.png"); + private static final ResourceLocation TEXTURE_3 = loc("textures/entity/abyssalblast/abyssal_blast_3.png"); public AbyssalBlastRenderer(EntityRendererProvider.Context renderManagerIn) { super(renderManagerIn); @@ -54,13 +54,12 @@ private void renderArc(PoseStack matrixStackIn, MultiBufferSource bufferIn, int res = getEntityTexture(age); } VertexConsumer ivertexbuilder = bufferIn.getBuffer(RenderType.entityCutoutNoCull(res)); - PoseStack.Pose lvt_19_1_ = matrixStackIn.last(); - Matrix4f lvt_20_1_ = lvt_19_1_.pose(); - Matrix3f lvt_21_1_ = lvt_19_1_.normal(); - this.drawVertex(lvt_20_1_, lvt_21_1_, ivertexbuilder, -1, 0, -1, 0, 0, 1, 0, 1, 240); - this.drawVertex(lvt_20_1_, lvt_21_1_, ivertexbuilder, -1, 0, 1, 0, 1, 1, 0, 1, 240); - this.drawVertex(lvt_20_1_, lvt_21_1_, ivertexbuilder, 1, 0, 1, 1, 1, 1, 0, 1, 240); - this.drawVertex(lvt_20_1_, lvt_21_1_, ivertexbuilder, 1, 0, -1, 1, 0, 1, 0, 1, 240); + PoseStack.Pose pose = matrixStackIn.last(); + Matrix4f matrix4f = pose.pose(); + this.drawVertex(matrix4f, pose, ivertexbuilder, -1, 0, -1, 0, 0, 1, 0, 1, 240); + this.drawVertex(matrix4f, pose, ivertexbuilder, -1, 0, 1, 0, 1, 1, 0, 1, 240); + this.drawVertex(matrix4f, pose, ivertexbuilder, 1, 0, 1, 1, 1, 1, 0, 1, 240); + this.drawVertex(matrix4f, pose, ivertexbuilder, 1, 0, -1, 1, 0, 1, 0, 1, 240); matrixStackIn.popPose(); } @@ -69,8 +68,9 @@ public ResourceLocation getTextureLocation(AbyssalBlast entity) { return TEXTURE_0; } - public void drawVertex(Matrix4f p_229039_1_, Matrix3f p_229039_2_, VertexConsumer p_229039_3_, int p_229039_4_, int p_229039_5_, int p_229039_6_, float p_229039_7_, float p_229039_8_, int p_229039_9_, int p_229039_10_, int p_229039_11_, int p_229039_12_) { - p_229039_3_.vertex(p_229039_1_, (float) p_229039_4_, (float) p_229039_5_, (float) p_229039_6_).color(255, 255, 255, 255).uv(p_229039_7_, p_229039_8_).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(p_229039_12_).normal(p_229039_2_, (float) p_229039_9_, (float) p_229039_11_, (float) p_229039_10_).endVertex(); + // TODO: Chakyl test + public void drawVertex(Matrix4f matrixPos, PoseStack.Pose pose, VertexConsumer buffer, int x, int y, int z, float u, float v, int normalX, int normalY, int normalZ, int packedLight) { + buffer.addVertex(matrixPos, (float) x, (float) y, (float) z).setColor(255, 255, 255, 255).setUv(u, v).setOverlay(OverlayTexture.NO_OVERLAY).setLight(packedLight).setNormal(pose, (float) normalX, (float) normalY, (float) normalZ); } public ResourceLocation getEntityTexture(int age) { diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/RootballRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/RootballRenderer.java index 54ec9bb..d00b5b7 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/RootballRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/RootballRenderer.java @@ -1,6 +1,5 @@ package codyhuh.unusualfishmod.client.misc.render; -import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.client.UFModelLayers; import codyhuh.unusualfishmod.client.misc.render.model.RootballModel; import codyhuh.unusualfishmod.common.entity.Rootball; @@ -10,8 +9,10 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; + public class RootballRenderer extends MobRenderer> { - protected static final ResourceLocation TEXTURE = new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/rootball.png"); + protected static final ResourceLocation TEXTURE = loc("textures/entity/rootball.png"); public RootballRenderer(EntityRendererProvider.Context renderManagerIn) { super(renderManagerIn, new RootballModel<>(renderManagerIn.bakeLayer(UFModelLayers.ROOTBALL)), 0.2F); diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/SeaSpikeRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/SeaSpikeRenderer.java index f29965a..207c18b 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/SeaSpikeRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/SeaSpikeRenderer.java @@ -1,13 +1,14 @@ package codyhuh.unusualfishmod.client.misc.render; -import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.common.entity.item.SeaSpike; import net.minecraft.client.renderer.entity.ArrowRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.resources.ResourceLocation; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; + public class SeaSpikeRenderer extends ArrowRenderer { - public static final ResourceLocation LOCATION = new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/item/sea_spike.png"); + public static final ResourceLocation LOCATION = loc("textures/entity/item/sea_spike.png"); public SeaSpikeRenderer(EntityRendererProvider.Context p_174399_) { super(p_174399_); diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/ThrownPrismarineSpearRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/ThrownPrismarineSpearRenderer.java index 2e00849..4510084 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/ThrownPrismarineSpearRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/ThrownPrismarineSpearRenderer.java @@ -1,6 +1,5 @@ package codyhuh.unusualfishmod.client.misc.render; -import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.client.UFModelLayers; import codyhuh.unusualfishmod.client.misc.render.model.PrismarineSpearModel; import codyhuh.unusualfishmod.common.entity.item.ThrownPrismarineSpear; @@ -13,8 +12,11 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; +import static net.minecraft.util.FastColor.ARGB32.color; + public class ThrownPrismarineSpearRenderer extends EntityRenderer { - public static final ResourceLocation LOC = new ResourceLocation(UnusualFishMod.MOD_ID, "textures/entity/item/prismarine_spear.png"); + public static final ResourceLocation LOC = loc("textures/entity/item/prismarine_spear.png"); private final PrismarineSpearModel model; public ThrownPrismarineSpearRenderer(EntityRendererProvider.Context p_174420_) { @@ -28,7 +30,7 @@ public void render(ThrownPrismarineSpear spear, float p_116112_, float p_116113_ stack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(p_116113_, spear.yRotO, spear.getYRot()) - 90.0F)); stack.mulPose(Axis.ZP.rotationDegrees(Mth.lerp(p_116113_, spear.xRotO, spear.getXRot()) + 90.0F)); - this.model.renderToBuffer(stack, buffer.getBuffer(this.model.renderType(this.getTextureLocation(spear))), p_116116_, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + this.model.renderToBuffer(stack, buffer.getBuffer(this.model.renderType(this.getTextureLocation(spear))), p_116116_, OverlayTexture.NO_OVERLAY, color(255, 255, 255, 255)); stack.popPose(); super.render(spear, p_116112_, p_116113_, stack, buffer, p_116116_); diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/PrismarineSpearModel.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/PrismarineSpearModel.java index c14dbe1..ba5f1e2 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/PrismarineSpearModel.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/PrismarineSpearModel.java @@ -31,7 +31,7 @@ public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ag } @Override - public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - spear.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + spear.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/RootballModel.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/RootballModel.java index 16fe1f2..214f00e 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/RootballModel.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/RootballModel.java @@ -46,9 +46,9 @@ public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ag } @Override - public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - Body.render(poseStack, buffer, packedLight, packedOverlay); - Leg1.render(poseStack, buffer, packedLight, packedOverlay); - Leg2.render(poseStack, buffer, packedLight, packedOverlay); + public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, int color) { + Body.render(poseStack, buffer, packedLight, packedOverlay, color); + Leg1.render(poseStack, buffer, packedLight, packedOverlay, color); + Leg2.render(poseStack, buffer, packedLight, packedOverlay, color); } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java b/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java index 3a04c8d..bf8bbc4 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java +++ b/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java @@ -6,7 +6,8 @@ import codyhuh.unusualfishmod.core.registry.UFEntities; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.Position; -import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior; +import net.minecraft.core.dispenser.ProjectileDispenseBehavior; +import net.minecraft.world.entity.SpawnPlacementTypes; import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Projectile; @@ -14,83 +15,86 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraftforge.event.entity.EntityAttributeCreationEvent; -import net.minecraftforge.event.entity.SpawnPlacementRegisterEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; +import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; -@Mod.EventBusSubscriber(modid = UnusualFishMod.MOD_ID, bus = Bus.MOD) +@EventBusSubscriber(modid = UnusualFishMod.MOD_ID) public class CommonEvents { @SubscribeEvent public static void commonSetup(FMLCommonSetupEvent e) { - DispenserBlock.registerBehavior(UFItems.PRISMARINE_SPEAR.get(), new AbstractProjectileDispenseBehavior() { - protected Projectile getProjectile(Level level, Position pos, ItemStack stack) { - ThrownPrismarineSpear arrow = new ThrownPrismarineSpear(UFEntities.PRISMARINE_SPEAR.get(), pos.x(), pos.y(), pos.z(), level); - arrow.pickup = AbstractArrow.Pickup.ALLOWED; - return arrow; - } - }); + // TODO: chakyl dispense +// e.enqueueWork(() -> { +// DispenserBlock.registerBehavior(UFItems.PRISMARINE_SPEAR.get(), new ProjectileDispenseBehavior(UFItems.PRISMARINE_SPEAR.get()) { +// @Override +// protected Projectile getProjectile(Level level, Position pos, ItemStack stack) { +// ThrownPrismarineSpear spear = new ThrownPrismarineSpear(UFEntities.PRISMARINE_SPEAR.get(), pos.x(), pos.y(), pos.z(), level); +// spear.pickup = AbstractArrow.Pickup.ALLOWED; +// return spear; +// } +// }); +// }); } @SubscribeEvent - public static void registerSpawnPlacements(SpawnPlacementRegisterEvent e) { - e.register(UFEntities.AERO_MONO.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, AeroMono::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.PINKFIN.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, PinkfinIdol::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.CLOWNTHORN_SHARK.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, ClownthornShark::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.DUALITY_DAMSELFISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, DualityDamselfish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.DROOPING_GOURAMI.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, DroopingGourami::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.MOSSTHORN.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, Mossthorn::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.RHINO_TETRA.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, RhinoTetra::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.RIPPER.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, Ripper::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SAILOR_BARB.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, SailorBarb::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SPINDLEFISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, Spindlefish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.ZEBRA_CORNETFISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, ZebraCornetfish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.TIGER_PUFFER.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, TigerPuffer::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SNEEPSNORP.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, SneepSnorp::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.WIZARD_JELLY.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, ManaJellyfish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.TRUMPET_SQUID.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, TrumpetSquid::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.BARK_ANGELFISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, BarkAngelfish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.STOUT_BICHIR.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, StoutBichir::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.KALAPPA.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.WORLD_SURFACE, Kalappa::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.LOBED_SKIPPER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.WORLD_SURFACE, LobedSkipper::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.BEAKED_HERRING.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, BeakedHerring::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.PICKLEFISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, Picklefish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.DEMON_HERRING.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, DemonHerring::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.AMBER_GOBY.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, AmberGoby::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.COPPERFLAME.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, CopperflameAnthias::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.ROOTBALL.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.WORLD_SURFACE, Rootball::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.CELESTIAL_FISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, CelestialFish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.PRAWN.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.WORLD_SURFACE, Prawn::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SEA_MOSQUITO.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, SeaMosquito::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.FORKFISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, Forkfish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SPOON_SHARK.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, SpoonShark::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.CIRCUS_FISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, CircusFish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.BLIZZARDFIN_TUNA.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, BlizzardfinTuna::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.TIGER_JUNGLE_SHARK.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, TigerJungleShark::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SNOWFLAKE.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, SnowflakeTailFish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.EYELASH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, EyelashFish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.CRIMSONSHELL_SQUID.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, CrimsonshellSquid::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.VOLT_ANGLER.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.WORLD_SURFACE, VoltAngler::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.TRIBBLE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.WORLD_SURFACE, Tribble::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.CORAL_SKRIMP.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, Skrimp::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SQUODDLE.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, Squoddle::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.GNASHER.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, Gnasher::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.HATCHET_FISH.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, HatchetFish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.BLIND_SAILFIN.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, BlindSailfin::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SHOCKCAT.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, Shockcat::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.MUDDYTOP_SNAIL.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, MuddytopSnail::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.BRICK_SNAIL.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, BrickSnail::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.BLACKCAP_SNAIL.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, BlackCapSnail::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.DEEP_CRAWLER.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, DeepCrawler::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.FRESHWATER_MANTIS.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, FreshwaterMantis::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.PORCUPINE_LOBSTA.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, PorcupineLobster::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.TRIPLE_TWIRL_PLECO.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, TripleTwirlPleco::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SEA_PANCAKE.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, SeaPancake::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.SEA_SPIDER.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, SeaSpider::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); - e.register(UFEntities.ROUGHBACK.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, RoughbackGuitarfish::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); + public static void registerSpawnPlacements(RegisterSpawnPlacementsEvent e) { + e.register(UFEntities.AERO_MONO.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, AeroMono::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.PINKFIN.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, PinkfinIdol::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.CLOWNTHORN_SHARK.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, ClownthornShark::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.DUALITY_DAMSELFISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, DualityDamselfish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.DROOPING_GOURAMI.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, DroopingGourami::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.MOSSTHORN.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, Mossthorn::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.RHINO_TETRA.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, RhinoTetra::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.RIPPER.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, Ripper::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SAILOR_BARB.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, SailorBarb::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SPINDLEFISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, Spindlefish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.ZEBRA_CORNETFISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, ZebraCornetfish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.TIGER_PUFFER.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, TigerPuffer::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SNEEPSNORP.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, SneepSnorp::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.WIZARD_JELLY.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, ManaJellyfish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.TRUMPET_SQUID.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, TrumpetSquid::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.BARK_ANGELFISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, BarkAngelfish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.STOUT_BICHIR.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, StoutBichir::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.KALAPPA.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.WORLD_SURFACE, Kalappa::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.LOBED_SKIPPER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.WORLD_SURFACE, LobedSkipper::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.BEAKED_HERRING.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, BeakedHerring::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.PICKLEFISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, Picklefish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.DEMON_HERRING.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, DemonHerring::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.AMBER_GOBY.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, AmberGoby::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.COPPERFLAME.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, CopperflameAnthias::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.ROOTBALL.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.WORLD_SURFACE, Rootball::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.CELESTIAL_FISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, CelestialFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.PRAWN.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.WORLD_SURFACE, Prawn::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SEA_MOSQUITO.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, SeaMosquito::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.FORKFISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, Forkfish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SPOON_SHARK.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, SpoonShark::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.CIRCUS_FISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, CircusFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.BLIZZARDFIN_TUNA.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, BlizzardfinTuna::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.TIGER_JUNGLE_SHARK.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, TigerJungleShark::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SNOWFLAKE.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, SnowflakeTailFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.EYELASH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, EyelashFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.CRIMSONSHELL_SQUID.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, CrimsonshellSquid::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.VOLT_ANGLER.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, VoltAngler::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.TRIBBLE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.WORLD_SURFACE, Tribble::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.CORAL_SKRIMP.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, Skrimp::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SQUODDLE.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, Squoddle::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.GNASHER.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, Gnasher::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.HATCHET_FISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, HatchetFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.BLIND_SAILFIN.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, BlindSailfin::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SHOCKCAT.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, Shockcat::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.MUDDYTOP_SNAIL.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, MuddytopSnail::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.BRICK_SNAIL.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, BrickSnail::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.BLACKCAP_SNAIL.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, BlackCapSnail::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.DEEP_CRAWLER.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, DeepCrawler::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.FRESHWATER_MANTIS.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, FreshwaterMantis::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.PORCUPINE_LOBSTA.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, PorcupineLobster::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.TRIPLE_TWIRL_PLECO.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, TripleTwirlPleco::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SEA_PANCAKE.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, SeaPancake::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.SEA_SPIDER.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, SeaSpider::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.ROUGHBACK.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.OCEAN_FLOOR, RoughbackGuitarfish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); } @SubscribeEvent diff --git a/src/main/java/codyhuh/unusualfishmod/common/block/SeaBoomBlock.java b/src/main/java/codyhuh/unusualfishmod/common/block/SeaBoomBlock.java index 6dd39d9..e3b523d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/block/SeaBoomBlock.java +++ b/src/main/java/codyhuh/unusualfishmod/common/block/SeaBoomBlock.java @@ -3,6 +3,7 @@ import codyhuh.unusualfishmod.common.block_entity.SeaBoomBlockEntity; import codyhuh.unusualfishmod.core.registry.UFBlockEntities; import codyhuh.unusualfishmod.core.registry.UFItems; +import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -12,7 +13,9 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; @@ -34,7 +37,6 @@ public SeaBoomBlock(Properties p_49795_) { super(p_49795_); this.registerDefaultState(this.stateDefinition.any().setValue(LOADED, false).setValue(HOSTILE_ONLY, false)); } - @Override public RenderShape getRenderShape(BlockState p_49232_) { return RenderShape.MODEL; @@ -47,17 +49,21 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { } @Override - public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult p_60508_) { - if (player.getItemInHand(hand).is(UFItems.RAW_DUALITY_DAMSELFISH.get())) { + protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { + if (stack.is(UFItems.RAW_DUALITY_DAMSELFISH.get())) { level.setBlock(pos, state.setValue(LOADED, state.getValue(LOADED)).setValue(HOSTILE_ONLY, !state.getValue(HOSTILE_ONLY)), 3); if (!player.getAbilities().instabuild) { - player.getItemInHand(hand).shrink(1); + stack.shrink(1); } player.swing(hand); level.playSound(null, pos, SoundEvents.BEACON_DEACTIVATE, SoundSource.BLOCKS, 0.5F, 2.0F); } - return super.use(state, level, pos, player, hand, p_60508_); + return super.useItemOn(stack, state, level, pos, player, hand, hitResult); + } + @Override + protected MapCodec codec() { + return null; } @Override diff --git a/src/main/java/codyhuh/unusualfishmod/common/block/VoltDetectorBlock.java b/src/main/java/codyhuh/unusualfishmod/common/block/VoltDetectorBlock.java index 9d3be9d..6c8a01c 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/block/VoltDetectorBlock.java +++ b/src/main/java/codyhuh/unusualfishmod/common/block/VoltDetectorBlock.java @@ -2,6 +2,7 @@ import codyhuh.unusualfishmod.common.block_entity.VoltDetectorBlockEntity; import codyhuh.unusualfishmod.core.registry.UFBlockEntities; +import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -27,6 +28,11 @@ public VoltDetectorBlock(Properties p_49795_) { this.registerDefaultState(this.stateDefinition.any().setValue(ANGLERS, 0)); } + @Override + protected MapCodec codec() { + return null; + } + @Override protected void createBlockStateDefinition(StateDefinition.Builder p_49915_) { p_49915_.add(ANGLERS); diff --git a/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java index 9d5750d..caa41b3 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java @@ -56,9 +56,10 @@ public static void serverTick(Level level, BlockPos pos, BlockState state, VoltD private static void nearDetector(Level level, BlockPos pos, double radius) { AABB aabb = new AABB(pos); - currentList = level.getEntitiesOfClass(LivingEntity.class, aabb.inflate(radius), e -> { - return !e.getType().is(UFTags.VOLT_UNDETECTED) && !e.isCrouching(); - }); + // TODO: Tag fix +// currentList = level.getEntitiesOfClass(LivingEntity.class, aabb.inflate(radius), e -> { +// return !e.getType().is(UFTags.VOLT_UNDETECTED) && !e.isCrouching(); +// }); BlockPos blockpos = new BlockPos((int) (aabb.minX - radius), (int) (aabb.minY - radius), (int) (aabb.minZ - radius)); BlockPos blockpos1 = new BlockPos((int) (aabb.maxX + radius), (int) (aabb.maxY + radius), (int) (aabb.maxZ + radius)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/enchantment/UnusualCatchEnchantment.java b/src/main/java/codyhuh/unusualfishmod/common/enchantment/UnusualCatchEnchantment.java deleted file mode 100644 index 3cf0fdc..0000000 --- a/src/main/java/codyhuh/unusualfishmod/common/enchantment/UnusualCatchEnchantment.java +++ /dev/null @@ -1,39 +0,0 @@ -package codyhuh.unusualfishmod.common.enchantment; - -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.FishingRodItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class UnusualCatchEnchantment extends Enchantment { - - public UnusualCatchEnchantment(Rarity rarityIn, EquipmentSlot... slots) { - super(rarityIn, EnchantmentCategory.FISHING_ROD, slots); - } - - @Override - public boolean canApplyAtEnchantingTable(ItemStack stack) { - return stack.getItem() instanceof FishingRodItem; - } - - @Override - public int getMaxLevel() { - return 1; - } - - @Override - public boolean isTradeable() { - return true; - } - - @Override - public boolean isDiscoverable() { - return true; - } - - @Override - public boolean isAllowedOnBooks() { - return true; - } -} diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/AeroMono.java b/src/main/java/codyhuh/unusualfishmod/common/entity/AeroMono.java index 5b8083f..391f338 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/AeroMono.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/AeroMono.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class AeroMono extends BucketableSchoolingWaterAnimal implements GeoEntity { @@ -112,7 +112,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/AmberGoby.java b/src/main/java/codyhuh/unusualfishmod/common/entity/AmberGoby.java index 9da811d..120c439 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/AmberGoby.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/AmberGoby.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class AmberGoby extends BucketableSchoolingWaterAnimal implements GeoEntity { @@ -118,7 +118,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BarkAngelfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BarkAngelfish.java index 1884df2..dcd4f62 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BarkAngelfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BarkAngelfish.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class BarkAngelfish extends BucketableSchoolingWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BeakedHerring.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BeakedHerring.java index 876443f..08c3cf9 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BeakedHerring.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BeakedHerring.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class BeakedHerring extends BucketableSchoolingWaterAnimal implements GeoEntity { @@ -119,7 +119,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BlackCapSnail.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BlackCapSnail.java index ac72329..a58667f 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BlackCapSnail.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BlackCapSnail.java @@ -4,6 +4,7 @@ import codyhuh.unusualfishmod.common.entity.util.movement.SnailMoveControl; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -29,14 +30,15 @@ import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class BlackCapSnail extends WaterAnimal implements Bucketable, GeoEntity { @@ -45,7 +47,7 @@ public class BlackCapSnail extends WaterAnimal implements Bucketable, GeoEntity public BlackCapSnail(EntityType type, Level world) { super(type, world); this.moveControl = new SnailMoveControl(this); - this.setMaxUpStep(1.0F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); } public static AttributeSupplier.Builder createAttributes() { @@ -73,9 +75,9 @@ public void handleAirSupply(int p_209207_1_) { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(FROM_BUCKET, false); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(FROM_BUCKET, false); } public void addAdditionalSaveData(CompoundTag compound) { @@ -97,9 +99,9 @@ public boolean fromBucket() { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putFloat("Health", this.getHealth()); - + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); } public boolean requiresCustomPersistence() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BlindSailfin.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BlindSailfin.java index d90aa1c..10505b5 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BlindSailfin.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BlindSailfin.java @@ -36,11 +36,11 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class BlindSailfin extends BucketableWaterAnimal implements GeoEntity { @@ -124,7 +124,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BlizzardfinTuna.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BlizzardfinTuna.java index ad8a51d..0553323 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BlizzardfinTuna.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BlizzardfinTuna.java @@ -24,11 +24,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class BlizzardfinTuna extends BucketableSchoolingWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BrickSnail.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BrickSnail.java index ace0633..cba2bd1 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BrickSnail.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BrickSnail.java @@ -34,11 +34,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class BrickSnail extends BucketableWaterAnimal implements GeoEntity { @@ -46,7 +46,7 @@ public class BrickSnail extends BucketableWaterAnimal implements GeoEntity { public BrickSnail(EntityType type, Level world) { super(type, world); this.moveControl = new SnailMoveControl(this); - this.setMaxUpStep(1.0F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); } public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CelestialFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CelestialFish.java index 9d3b40c..701798a 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CelestialFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CelestialFish.java @@ -26,11 +26,11 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.material.Fluids; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class CelestialFish extends WaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CircusFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CircusFish.java index d731a88..33fd013 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CircusFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CircusFish.java @@ -26,11 +26,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class CircusFish extends BucketableWaterAnimal implements GeoEntity { @@ -93,7 +93,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/ClownthornShark.java b/src/main/java/codyhuh/unusualfishmod/common/entity/ClownthornShark.java index 1b54a24..607ca2b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/ClownthornShark.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/ClownthornShark.java @@ -35,11 +35,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java index 6e4efb0..005378c 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java @@ -5,6 +5,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -25,18 +26,20 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; +import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.ServerLevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -118,11 +121,11 @@ protected SoundEvent getFlopSound() { return SoundEvents.COD_FLOP; } - @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(VARIANT, 0); - } + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, 0); + } @Override public void addAdditionalSaveData(CompoundTag compound) { @@ -138,9 +141,13 @@ public void readAdditionalSaveData(CompoundTag compound) { @Override public void saveToBucketTag(ItemStack bucket) { - super.saveToBucketTag(bucket); - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putInt("Variant", this.getVariant()); + Bucketable.saveDefaultDataToBucketTag(this, bucket); + if (this.hasCustomName()) { + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); + } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + }); } public int getVariant() { @@ -175,7 +182,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java index 102133b..728cd2d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java @@ -10,6 +10,7 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFTags; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; @@ -44,15 +45,16 @@ import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -100,7 +102,9 @@ public boolean canUse() { @Override public boolean isFood(ItemStack stack) { - return stack.is(UFTags.RAW_UNUSUAL_FISH); + return true; + // TODO: tag +// return stack.is(UFTags.RAW_UNUSUAL_FISH); } @Nullable @@ -169,9 +173,9 @@ protected SoundEvent getFlopSound() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(FROM_BUCKET, false); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(FROM_BUCKET, false); } public void addAdditionalSaveData(CompoundTag tag) { @@ -191,8 +195,9 @@ public boolean fromBucket() { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putFloat("Health", this.getHealth()); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); } public boolean requiresCustomPersistence() { @@ -262,7 +267,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DeepCrawler.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DeepCrawler.java index 13e018a..a713c05 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DeepCrawler.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DeepCrawler.java @@ -27,11 +27,11 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class DeepCrawler extends BucketableWaterAnimal implements GeoEntity { @@ -39,7 +39,7 @@ public class DeepCrawler extends BucketableWaterAnimal implements GeoEntity { public DeepCrawler(EntityType type, Level world) { super(type, world); this.moveControl = new DeepCrawler.MoveHelperController(this); - this.setMaxUpStep(1.0F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); } public static AttributeSupplier.Builder createAttributes() { @@ -128,8 +128,8 @@ public void tick() { double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); d1 = d1 / d3; float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.spider.yRot = this.rotlerp(this.spider.yRot, f, 90.0F); - this.spider.yBodyRot = this.spider.yRot; + this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); + this.spider.yBodyRot = this.spider.getYRot(); float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java index cd86958..1e2a91f 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java @@ -5,6 +5,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -25,18 +26,20 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; +import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.ServerLevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -118,11 +121,11 @@ protected SoundEvent getFlopSound() { return SoundEvents.COD_FLOP; } - @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(VARIANT, 0); - } + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, 0); + } public int getVariant() { return this.entityData.get(VARIANT); @@ -144,12 +147,14 @@ public void readAdditionalSaveData(CompoundTag compound) { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putFloat("Health", this.getHealth()); - compoundnbt.putInt("Variant", this.getVariant()); + Bucketable.saveDefaultDataToBucketTag(this, bucket); if (this.hasCustomName()) { - bucket.setHoverName(this.getCustomName()); + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + tag.putFloat("Health", this.getHealth()); + }); } @Nullable diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DroopingGourami.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DroopingGourami.java index dd76038..541c644 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DroopingGourami.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DroopingGourami.java @@ -24,11 +24,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class DroopingGourami extends BucketableSchoolingWaterAnimal implements GeoEntity { @@ -103,7 +103,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java index df5077c..b8bfae5 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java @@ -6,6 +6,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -26,18 +27,20 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; +import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.ServerLevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -125,16 +128,17 @@ public static boolean canSpawn(EntityType p_223364_0_, LevelA @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag tag = bucket.getOrCreateTag(); - tag.putInt("Variant", this.getVariant()); - super.saveToBucketTag(bucket); + Bucketable.saveDefaultDataToBucketTag(this, bucket); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + }); } - @Override - public void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(VARIANT, 0); - } + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, 0); + } @Override public boolean hasVariant() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java index 5463f8f..9ad944e 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java @@ -5,6 +5,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -18,6 +19,7 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.Brain; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.SmoothSwimmingLookControl; @@ -25,21 +27,25 @@ import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; import net.minecraft.world.entity.ai.goal.RandomSwimmingGoal; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; +import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; +import net.minecraft.world.entity.animal.axolotl.Axolotl; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.pathfinder.Path; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -138,19 +144,21 @@ protected SoundEvent getFlopSound() { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putInt("Variant", this.getVariant()); + Bucketable.saveDefaultDataToBucketTag(this, bucket); if (this.hasCustomName()) { - bucket.setHoverName(this.getCustomName()); + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); } - compoundnbt.putFloat("Health", this.getHealth()); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + tag.putFloat("Health", this.getHealth()); + }); } @Override - public void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(VARIANT, 0); - this.entityData.define(ESCAPING, false); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, 0); + builder.define(ESCAPING, false); } public int getVariant() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Forkfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Forkfish.java index e2da484..3d4ad12 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Forkfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Forkfish.java @@ -35,11 +35,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Forkfish extends BucketableWaterAnimal implements GeoEntity { @@ -114,7 +114,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java b/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java index 328babd..5f3ffc1 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java @@ -28,11 +28,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class FreshwaterMantis extends BucketableWaterAnimal implements GeoEntity { @@ -40,7 +40,7 @@ public class FreshwaterMantis extends BucketableWaterAnimal implements GeoEntity public FreshwaterMantis(EntityType type, Level world) { super(type, world); this.moveControl = new FreshwaterMantis.MoveHelperController(this); - this.setMaxUpStep(1.1F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.1F); } public static AttributeSupplier.Builder createAttributes() { @@ -53,7 +53,8 @@ protected void registerGoals() { this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.8D)); this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 1.0F)); this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, e -> e.getType().is(UFTags.SNAILS))); + // TODO: Tag fix +// this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, e -> e.getType().is(UFTags.SNAILS))); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AeroMono.class, true)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, SneepSnorp.class, true)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, RhinoTetra.class, true)); @@ -160,8 +161,8 @@ public void tick() { double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); d1 = d1 / d3; float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.mantis.yRot = this.rotlerp(this.mantis.yRot, f, 90.0F); - this.mantis.yBodyRot = this.mantis.yRot; + this.mantis.setYRot(this.rotlerp(this.mantis.getYRot(), f, 90.0F)); + this.mantis.yBodyRot = this.mantis.getYRot(); float f1 = (float) (this.speedModifier * this.mantis.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.mantis.setSpeed(Mth.lerp(0.125F, this.mantis.getSpeed(), f1)); this.mantis.setDeltaMovement(this.mantis.getDeltaMovement().add(0.0D, (double) this.mantis.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Gnasher.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Gnasher.java index a7de480..c8e1b80 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Gnasher.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Gnasher.java @@ -4,6 +4,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFSounds; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Mth; @@ -24,16 +25,16 @@ import net.minecraft.world.entity.monster.RangedAttackMob; import net.minecraft.world.entity.npc.Villager; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Gnasher extends WaterAnimal implements RangedAttackMob, GeoEntity { @@ -92,10 +93,10 @@ public boolean doHurtTarget(Entity entityIn) { this.level().broadcastEntityEvent(this, (byte)4); float f = this.getAttackDamage(); float f1 = (int)f > 0 ? f / 2.0F + (float)this.random.nextInt((int)f) : f; - boolean flag = entityIn.hurt(damageSources().mobAttack(this), f1); + boolean flag = this.level() instanceof ServerLevel && entityIn.hurt(damageSources().mobAttack(this), f1); if (flag) { entityIn.setDeltaMovement(entityIn.getDeltaMovement().add(0.0D, (double)0.4F, 0.0D)); - this.doEnchantDamageEffects(this, entityIn); + EnchantmentHelper.doPostAttackEffects((ServerLevel) this.level(), entityIn, this.damageSources().mobAttack(this)); } return flag; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/HatchetFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/HatchetFish.java index 3c144fc..8096019 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/HatchetFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/HatchetFish.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class HatchetFish extends BucketableSchoolingWaterAnimal implements GeoEntity { @@ -123,10 +123,9 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } - if (isInWater()) { if (event.isMoving()) { event.setAnimation(UFAnimations.SWIM); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Kalappa.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Kalappa.java index 3537bfa..494b81f 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Kalappa.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Kalappa.java @@ -20,11 +20,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Kalappa extends PathfinderMob implements GeoEntity { @@ -44,10 +44,13 @@ protected void registerGoals() { this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 0.65D, true) { @Override - protected double getAttackReachSqr(LivingEntity p_25556_) { - return (this.mob.getBbWidth() * 1.0D * this.mob.getBbWidth() * 1.0D + p_25556_.getBbWidth()); + protected void checkAndPerformAttack(LivingEntity target) { + if (this.mob.isWithinMeleeAttackRange(target) && this.isTimeToAttack()) { + this.mob.doHurtTarget(target); + } } }); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 0.65D)); this.targetSelector.addGoal(1, (new HurtByTargetGoal(this))); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Mob.class, 5, false, false, (p_28879_) -> { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/LobedSkipper.java b/src/main/java/codyhuh/unusualfishmod/common/entity/LobedSkipper.java index cb69603..e389550 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/LobedSkipper.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/LobedSkipper.java @@ -4,6 +4,7 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFSounds; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -27,19 +28,19 @@ import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.network.NetworkHooks; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nonnull; @@ -52,7 +53,7 @@ public LobedSkipper(EntityType entityType, Level level) this.jumpControl = new SkipperJumpController(); this.moveControl = new SkipperMoveController(); this.setMovementSpeed(0.0D); - this.setMaxUpStep(1.1F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.1F); } public static AttributeSupplier.Builder createAttributes() { @@ -84,11 +85,6 @@ public boolean causeFallDamage(float distance, float damageMultiplier, DamageSou return false; } - @Override - protected float getStandingEyeHeight(@Nonnull Pose pose, EntityDimensions size) { - return 0.2f * size.height; - } - @Override public void tick() { @@ -177,7 +173,7 @@ private void checkLandingDelay() { } @Override - protected void jumpFromGround() { + public void jumpFromGround() { super.jumpFromGround(); double d0 = this.moveControl.getSpeedModifier(); @@ -221,12 +217,6 @@ public void handleEntityEvent(byte id) { } } - @Nonnull - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - public class SkipperJumpController extends JumpControl { private boolean canJump; @@ -256,9 +246,9 @@ public void tick() { } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(FROM_BUCKET, false); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(FROM_BUCKET, false); } public void addAdditionalSaveData(CompoundTag compound) { @@ -282,8 +272,10 @@ public void setFromBucket(boolean p_203706_1_) { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putFloat("Health", this.getHealth()); + Bucketable.saveDefaultDataToBucketTag(this, bucket); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); } public boolean requiresCustomPersistence() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/ManaJellyfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/ManaJellyfish.java index a8b5616..e20170e 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/ManaJellyfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/ManaJellyfish.java @@ -28,11 +28,11 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.material.Fluids; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class ManaJellyfish extends BucketableSchoolingWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Mossthorn.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Mossthorn.java index e52b507..f80dab0 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Mossthorn.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Mossthorn.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Mossthorn extends BucketableSchoolingWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/MuddytopSnail.java b/src/main/java/codyhuh/unusualfishmod/common/entity/MuddytopSnail.java index f107d79..ce872e3 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/MuddytopSnail.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/MuddytopSnail.java @@ -29,11 +29,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class MuddytopSnail extends BucketableWaterAnimal implements GeoEntity { @@ -42,7 +42,7 @@ public class MuddytopSnail extends BucketableWaterAnimal implements GeoEntity { public MuddytopSnail(EntityType type, Level world) { super(type, world); this.moveControl = new SnailMoveControl(this); - this.setMaxUpStep(1.0F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); } @Override diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Picklefish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Picklefish.java index 5de52f7..dc58e2c 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Picklefish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Picklefish.java @@ -33,11 +33,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Picklefish extends BucketableWaterAnimal implements GeoEntity { @@ -112,7 +112,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/PinkfinIdol.java b/src/main/java/codyhuh/unusualfishmod/common/entity/PinkfinIdol.java index 2fd0a48..257569d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/PinkfinIdol.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/PinkfinIdol.java @@ -29,11 +29,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class PinkfinIdol extends BucketableWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/PorcupineLobster.java b/src/main/java/codyhuh/unusualfishmod/common/entity/PorcupineLobster.java index 487034c..6c3780b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/PorcupineLobster.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/PorcupineLobster.java @@ -40,11 +40,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class PorcupineLobster extends BucketableWaterAnimal implements GeoEntity { @@ -53,7 +53,7 @@ public class PorcupineLobster extends BucketableWaterAnimal implements GeoEntity public PorcupineLobster(EntityType type, Level world) { super(type, world); this.moveControl = new PorcupineLobster.MoveHelperController(this); - this.setMaxUpStep(1.5F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); } public static AttributeSupplier.Builder createAttributes() { @@ -164,8 +164,8 @@ public void tick() { double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); d1 = d1 / d3; float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.lobsta.yRot = this.rotlerp(this.lobsta.yRot, f, 90.0F); - this.lobsta.yBodyRot = this.lobsta.yRot; + this.lobsta.setYRot(this.rotlerp(this.lobsta.getYRot(), f, 90.0F)); + this.lobsta.yBodyRot = this.lobsta.getYRot(); float f1 = (float) (this.speedModifier * this.lobsta.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.lobsta.setSpeed(Mth.lerp(0.125F, this.lobsta.getSpeed(), f1)); this.lobsta.setDeltaMovement(this.lobsta.getDeltaMovement().add(0.0D, (double) this.lobsta.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Prawn.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Prawn.java index d0f46fc..0c9ee89 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Prawn.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Prawn.java @@ -3,6 +3,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFSounds; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; @@ -18,15 +19,16 @@ import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Prawn extends Monster implements GeoEntity { @@ -46,8 +48,10 @@ protected void registerGoals() { this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, true) { @Override - protected double getAttackReachSqr(LivingEntity p_25556_) { - return this.mob.getBbWidth() * 2.0F * this.mob.getBbWidth() * 1.0F + p_25556_.getBbWidth(); + protected void checkAndPerformAttack(LivingEntity target) { + if (this.mob.isWithinMeleeAttackRange(target) && this.isTimeToAttack()) { + this.mob.doHurtTarget(target); + } } }); this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 0.6D)); @@ -57,9 +61,9 @@ protected double getAttackReachSqr(LivingEntity p_25556_) { @Override public boolean doHurtTarget(Entity entityIn) { - boolean flag = entityIn.hurt(damageSources().mobAttack(this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE)); + boolean flag = this.level() instanceof ServerLevel && entityIn.hurt(damageSources().mobAttack(this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE)); if (flag) { - this.doEnchantDamageEffects(this, entityIn); + EnchantmentHelper.doPostAttackEffects((ServerLevel) this.level(), entityIn, this.damageSources().mobAttack(this)); } return flag; @@ -91,7 +95,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java b/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java index 7728969..7422933 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java @@ -5,6 +5,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; @@ -34,16 +35,17 @@ import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -208,12 +210,12 @@ protected SoundEvent getFlopSound() { return SoundEvents.COD_FLOP; } - @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(REMAINING_ANGER_TIME, 0); - } - + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(REMAINING_ANGER_TIME, 0); + } + public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); this.stunnedTick = compound.getInt("StunTick"); @@ -228,11 +230,13 @@ public void addAdditionalSaveData(CompoundTag compound) { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putFloat("Health", this.getHealth()); + Bucketable.saveDefaultDataToBucketTag(this, bucket); if (this.hasCustomName()) { - bucket.setHoverName(this.getCustomName()); + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); } public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Ripper.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Ripper.java index 8454f54..d22291b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Ripper.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Ripper.java @@ -6,6 +6,7 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFSounds; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; @@ -25,16 +26,17 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.material.Fluids; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Ripper extends BucketableSchoolingWaterAnimal implements GeoEntity { @@ -86,8 +88,9 @@ public boolean doHurtTarget(Entity entityIn) { boolean flag = entityIn.hurt(damageSources().mobAttack(this), f1); if (flag) { entityIn.setDeltaMovement(entityIn.getDeltaMovement().add(0.0D, 0.4F, 0.0D)); - this.doEnchantDamageEffects(this, entityIn); - + if (this.level() instanceof ServerLevel serverLevel) { + EnchantmentHelper.doPostAttackEffects((ServerLevel) this.level(), entityIn, this.damageSources().generic()); + } if (random.nextFloat() > 0.9F) { ItemEntity item = EntityType.ITEM.create(level()); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Rootball.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Rootball.java index 8b51e8a..0f5ec71 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Rootball.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Rootball.java @@ -30,11 +30,11 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.gameevent.GameEvent; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -85,10 +85,11 @@ public boolean causeFallDamage(float p_149687_, float p_149688_, DamageSource p_ return flag; } - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(DATA_SWELL_DIR, -1); - this.entityData.define(DATA_IS_IGNITED, false); + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(DATA_SWELL_DIR, -1); + builder.define(DATA_IS_IGNITED, false); } public void addAdditionalSaveData(CompoundTag compound) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/RoughbackGuitarfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/RoughbackGuitarfish.java index dca5c58..f92172e 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/RoughbackGuitarfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/RoughbackGuitarfish.java @@ -23,11 +23,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class RoughbackGuitarfish extends WaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SailorBarb.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SailorBarb.java index c601ae0..da1df64 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SailorBarb.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SailorBarb.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class SailorBarb extends BucketableSchoolingWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java index 997b690..c3a555c 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java @@ -36,11 +36,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class SeaMosquito extends BucketableWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaPancake.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaPancake.java index 21f2c82..893408a 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaPancake.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaPancake.java @@ -7,6 +7,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ItemParticleOption; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; @@ -38,17 +40,19 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import java.util.List; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; + public class SeaPancake extends WaterAnimal implements GeoEntity { - public static final ResourceLocation FEED_REWARD = new ResourceLocation(UnusualFishMod.MOD_ID, "gameplay/sea_pancake_search"); + public static final ResourceLocation FEED_REWARD = loc("gameplay/sea_pancake_search"); protected int attackCooldown = 0; public SeaPancake(EntityType entityType, Level level) { @@ -89,7 +93,7 @@ protected InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack stack = player.getItemInHand(hand); if (stack.is(UFItems.RAW_LOBSTER.get()) && level() instanceof ServerLevel serverlevel) { - LootTable loottable = serverlevel.getServer().getLootData().getLootTable(FEED_REWARD); + LootTable loottable = serverlevel.registryAccess().lookupOrThrow(Registries.LOOT_TABLE).getOrThrow(ResourceKey.create(Registries.LOOT_TABLE, FEED_REWARD)).value(); List list = loottable.getRandomItems(new LootParams.Builder(serverlevel).withParameter(LootContextParams.ORIGIN, position()).withParameter(LootContextParams.THIS_ENTITY, this).withLuck(random.nextFloat()).create(LootContextParamSets.PIGLIN_BARTER)); if (!list.isEmpty() && random.nextBoolean()) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaSpider.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaSpider.java index 43e1da3..ca2f32f 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaSpider.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaSpider.java @@ -37,11 +37,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class SeaSpider extends BucketableWaterAnimal implements GeoEntity { @@ -49,7 +49,7 @@ public class SeaSpider extends BucketableWaterAnimal implements GeoEntity { public SeaSpider(EntityType type, Level world) { super(type, world); this.moveControl = new SeaSpider.MoveHelperController(this); - this.setMaxUpStep(1.5F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); } public static AttributeSupplier.Builder createAttributes() { @@ -141,8 +141,8 @@ public void tick() { double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); d1 = d1 / d3; float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.spider.yRot = this.rotlerp(this.spider.yRot, f, 90.0F); - this.spider.yBodyRot = this.spider.yRot; + this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); + this.spider.yBodyRot = this.spider.getYRot(); float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Shockcat.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Shockcat.java index ba0d913..dc34aa3 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Shockcat.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Shockcat.java @@ -32,11 +32,11 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Shockcat extends BucketableWaterAnimal implements GeoEntity { @@ -138,7 +138,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java index 42bd1ae..63d946d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java @@ -6,6 +6,7 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFSounds; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -36,16 +37,17 @@ import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; @@ -56,7 +58,7 @@ public class Skrimp extends BucketableWaterAnimal implements GeoEntity { public Skrimp(EntityType type, Level world) { super(type, world); this.moveControl = new Skrimp.MoveHelperController(this); - this.setMaxUpStep(1.5F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); } public static AttributeSupplier.Builder createAttributes() { @@ -101,15 +103,17 @@ protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putInt("Variant", this.getVariant()); + Bucketable.saveDefaultDataToBucketTag(this, bucket); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + }); } - @Override - public void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(VARIANT, 0); - } + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, 0); + } public int getVariant() { return this.entityData.get(VARIANT); @@ -133,18 +137,14 @@ public void readAdditionalSaveData(CompoundTag compound) { @Nullable @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { - spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - if (dataTag == null) { - setVariant(random.nextInt(3)); - } else { - if (dataTag.contains("Variant", 3)){ - this.setVariant(dataTag.getInt("Variant")); - } + public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn) { + spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn); + if (reason == MobSpawnType.NATURAL || reason == MobSpawnType.SPAWN_EGG || reason == MobSpawnType.STRUCTURE) { + this.setVariant(this.random.nextInt(3)); } + return spawnDataIn; } - @Override public ItemStack getBucketStack() { return new ItemStack(UFItems.CORAL_SKRIMP_BUCKET.get()); @@ -196,8 +196,8 @@ public void tick() { double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); d1 = d1 / d3; float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.spider.yRot = this.rotlerp(this.spider.yRot, f, 90.0F); - this.spider.yBodyRot = this.spider.yRot; + this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); + this.spider.yBodyRot = this.spider.getYRot(); float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SneepSnorp.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SneepSnorp.java index 0df4f6f..6b24e3d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SneepSnorp.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SneepSnorp.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class SneepSnorp extends BucketableSchoolingWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SnowflakeTailFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SnowflakeTailFish.java index 49e4fa9..e52b611 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SnowflakeTailFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SnowflakeTailFish.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class SnowflakeTailFish extends BucketableSchoolingWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Spindlefish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Spindlefish.java index a3a7831..b8e11ef 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Spindlefish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Spindlefish.java @@ -38,11 +38,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Spindlefish extends BucketableWaterAnimal implements GeoEntity { @@ -138,7 +138,7 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller } private PlayState predicate(AnimationState event) { - if (!isAddedToWorld()) { + if (this.isRemoved()) { return PlayState.STOP; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SpoonShark.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SpoonShark.java index 900b421..240fc0a 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SpoonShark.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SpoonShark.java @@ -34,11 +34,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class SpoonShark extends BucketableWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Squoddle.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Squoddle.java index c219320..2579fbe 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Squoddle.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Squoddle.java @@ -41,11 +41,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Squoddle extends BucketableWaterAnimal implements GeoEntity { @@ -54,7 +54,7 @@ public class Squoddle extends BucketableWaterAnimal implements GeoEntity { public Squoddle(EntityType type, Level world) { super(type, world); this.moveControl = new Squoddle.MoveHelperController(this); - this.setMaxUpStep(1.5F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); } public static AttributeSupplier.Builder createAttributes() { @@ -162,8 +162,8 @@ public void tick() { double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); d1 = d1 / d3; float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.squoddle.yRot = this.rotlerp(this.squoddle.yRot, f, 90.0F); - this.squoddle.yBodyRot = this.squoddle.yRot; + this.squoddle.setYRot(this.rotlerp(this.squoddle.getYRot(), f, 90.0F)); + this.squoddle.yBodyRot = this.squoddle.getYRot(); float f1 = (float) (this.speedModifier * this.squoddle.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.squoddle.setSpeed(Mth.lerp(0.125F, this.squoddle.getSpeed(), f1)); this.squoddle.setDeltaMovement(this.squoddle.getDeltaMovement().add(0.0D, (double) this.squoddle.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/StoutBichir.java b/src/main/java/codyhuh/unusualfishmod/common/entity/StoutBichir.java index 43bc9d2..53489a4 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/StoutBichir.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/StoutBichir.java @@ -25,11 +25,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class StoutBichir extends BucketableWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerJungleShark.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerJungleShark.java index b2940ec..667ca9b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerJungleShark.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerJungleShark.java @@ -2,6 +2,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; @@ -20,14 +21,15 @@ import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class TigerJungleShark extends WaterAnimal implements GeoEntity { @@ -78,10 +80,10 @@ public boolean doHurtTarget(Entity entityIn) { this.level().broadcastEntityEvent(this, (byte)4); float f = this.getAttackDamage(); float f1 = (int)f > 0 ? f / 2.0F + (float)this.random.nextInt((int)f) : f; - boolean flag = entityIn.hurt(damageSources().mobAttack(this), f1); + boolean flag = this.level() instanceof ServerLevel && entityIn.hurt(damageSources().mobAttack(this), f1); if (flag) { entityIn.setDeltaMovement(entityIn.getDeltaMovement().add(0.0D, 0.4D, 0.0D)); - this.doEnchantDamageEffects(this, entityIn); + EnchantmentHelper.doPostAttackEffects((ServerLevel) this.level(), entityIn, this.damageSources().mobAttack(this)); } return flag; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java index a68d4e4..670fdbb 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java @@ -28,11 +28,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class TigerPuffer extends BucketableWaterAnimal implements GeoEntity { @@ -57,14 +57,11 @@ public void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true) { @Override - protected void checkAndPerformAttack(LivingEntity p_25557_, double p_25558_) { - double d0 = this.getAttackReachSqr(p_25557_); - - if (p_25558_ <= d0 && this.getTicksUntilNextAttack() <= 0) { - this.resetAttackCooldown(); + protected void checkAndPerformAttack(LivingEntity target) { + if (this.mob.isWithinMeleeAttackRange(target) && this.isTimeToAttack()) { this.mob.swing(InteractionHand.MAIN_HAND); - this.mob.doHurtTarget(p_25557_); - this.mob.playSound(SoundEvents.TURTLE_EGG_CRACK); + this.mob.doHurtTarget(target); + this.mob.playSound(SoundEvents.TURTLE_EGG_CRACK, 1.0F, 1.0F); } } }); @@ -83,7 +80,8 @@ public boolean canUse() { return !this.mob.isInWater() && super.canUse(); } }); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, false, e -> e.getType().is(UFTags.TIGER_PUFFER_PREY))); + // TODO: Tag fix +// this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, false, e -> e.getType().is(UFTags.TIGER_PUFFER_PREY))); } public void aiStep() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Tribble.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Tribble.java index 1130a5d..5f71c6c 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Tribble.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Tribble.java @@ -30,11 +30,11 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluids; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class Tribble extends BucketableWaterAnimal implements GeoEntity { @@ -42,7 +42,7 @@ public class Tribble extends BucketableWaterAnimal implements GeoEntity { public Tribble(EntityType entityType, Level level) { super(entityType, level); this.moveControl = new Tribble.MoveHelperController(this); - this.setMaxUpStep(1.0F); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); } @Override @@ -115,8 +115,8 @@ public void tick() { double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); d1 = d1 / d3; float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.spider.yRot = this.rotlerp(this.spider.yRot, f, 90.0F); - this.spider.yBodyRot = this.spider.yRot; + this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); + this.spider.yBodyRot = this.spider.getYRot(); float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TripleTwirlPleco.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TripleTwirlPleco.java index e2e614e..809e6cf 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TripleTwirlPleco.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TripleTwirlPleco.java @@ -34,11 +34,11 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class TripleTwirlPleco extends BucketableWaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java index 1294810..820ff19 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java @@ -10,6 +10,7 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFTags; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; @@ -42,18 +43,19 @@ import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class TrumpetSquid extends BreedableWaterAnimal implements Bucketable, GeoEntity { @@ -106,7 +108,9 @@ public void aiStep() { @Override public boolean isFood(ItemStack stack) { - return stack.is(UFTags.RAW_UNUSUAL_FISH); + // todo: tag +// return stack.is(UFTags.RAW_UNUSUAL_FISH); + return true; } protected PathNavigation createNavigation(Level p_27480_) { @@ -190,11 +194,10 @@ public static boolean canSpawn(EntityType p_223364_0_, LevelAccess return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); } - @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(FROM_BUCKET, false); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(FROM_BUCKET, false); } @Override @@ -216,8 +219,10 @@ public boolean fromBucket() { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putFloat("Health", this.getHealth()); + Bucketable.saveDefaultDataToBucketTag(this, bucket); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); } public boolean requiresCustomPersistence() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/VoltAngler.java b/src/main/java/codyhuh/unusualfishmod/common/entity/VoltAngler.java index 650d613..415d641 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/VoltAngler.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/VoltAngler.java @@ -38,11 +38,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.Nullable; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/ZebraCornetfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/ZebraCornetfish.java index 564183b..d3f83ce 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/ZebraCornetfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/ZebraCornetfish.java @@ -24,11 +24,11 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.core.animation.AnimatableManager; -import software.bernie.geckolib.core.animation.AnimationController; -import software.bernie.geckolib.core.animation.AnimationState; -import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; public class ZebraCornetfish extends WaterAnimal implements GeoEntity { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbstractMovingBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbstractMovingBlockEntity.java index ebabc31..7a5f37f 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbstractMovingBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbstractMovingBlockEntity.java @@ -2,6 +2,7 @@ import codyhuh.unusualfishmod.common.entity.util.misc.MovingBlockData; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.network.protocol.Packet; @@ -12,6 +13,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -24,8 +26,8 @@ import net.minecraft.world.phys.shapes.BooleanOp; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.network.NetworkHooks; +import javax.naming.directory.Attribute; import java.util.ArrayList; import java.util.List; @@ -50,8 +52,8 @@ public void onSyncedDataUpdated(EntityDataAccessor entityDataAccessor) { } @Override - protected void defineSynchedData() { - this.entityData.define(BLOCK_DATA_TAG, new CompoundTag()); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + builder.define(BLOCK_DATA_TAG, new CompoundTag()); } public void tick() { @@ -84,12 +86,13 @@ public void tick() { if (dataBlock.blockData != null && dataBlock.getState().hasBlockEntity()) { BlockEntity blockentity = this.level().getBlockEntity(set); if (blockentity != null) { - CompoundTag compoundtag = blockentity.saveWithoutMetadata(); + HolderLookup.Provider registryProvider = this.level().registryAccess(); + CompoundTag compoundtag = blockentity.saveWithoutMetadata(registryProvider); for (String s : dataBlock.blockData.getAllKeys()) { compoundtag.put(s, dataBlock.blockData.get(s).copy()); } try { - blockentity.load(compoundtag); + blockentity.loadWithComponents(compoundtag, registryProvider); } catch (Exception exception) { } blockentity.setChanged(); @@ -119,7 +122,7 @@ public void moveEntitiesOnTop() { if (!entity.noPhysics) { double gravity = entity.isNoGravity() ? 0 : 0.08D; if (entity instanceof LivingEntity living) { - AttributeInstance attribute = living.getAttribute(net.minecraftforge.common.ForgeMod.ENTITY_GRAVITY.get()); + AttributeInstance attribute = living.getAttribute(Attributes.GRAVITY); gravity = attribute.getValue(); } float f2 = 1.0F; @@ -172,11 +175,6 @@ protected void addAdditionalSaveData(CompoundTag compound) { } } - @Override - public Packet getAddEntityPacket() { - return (Packet) NetworkHooks.getEntitySpawningPacket(this); - } - private List buildDataFromTrackerTag() { List list = new ArrayList<>(); CompoundTag data = getAllBlockData(); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java index 24b23ff..5d3f024 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java @@ -21,8 +21,6 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PlayMessages; import javax.annotation.Nullable; import java.util.UUID; @@ -32,7 +30,7 @@ public class AbyssalBlast extends Entity { private UUID ownerUUID; private int ownerNetworkId; private boolean leftOwner; - + // TODO: chakyl test public AbyssalBlast(EntityType p_i50162_1_, Level p_i50162_2_) { super(p_i50162_1_, p_i50162_2_); } @@ -51,10 +49,6 @@ public AbyssalBlast(Level worldIn, LivingEntity p_i47273_2_, boolean right) { this.setPos(p_i47273_2_.getX() - (double) (p_i47273_2_.getBbWidth()) * 0.5D * (double) Mth.sin(rot * ((float) Math.PI / 290F)), p_i47273_2_.getEyeY() - (double) 0.2F, p_i47273_2_.getZ() + (double) (p_i47273_2_.getBbWidth()) * 0.5D * (double) Mth.cos(rot * ((float) Math.PI / 290F))); } - public AbyssalBlast(PlayMessages.SpawnEntity spawnEntity, Level world) { - this(UFEntities.ABYSSAL_BLAST.get(), world); - } - public boolean isFasterAnimation() { return this.entityData.get(FASTER_ANIM); } @@ -75,10 +69,6 @@ protected static float lerpRotation(float p_234614_0_, float p_234614_1_) { return Mth.lerp(0.2F, p_234614_0_, p_234614_1_); } - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } public void tick() { double yMot = Mth.sqrt((float)(this.getDeltaMovement().x * this.getDeltaMovement().x + this.getDeltaMovement().z * this.getDeltaMovement().z)); @@ -120,9 +110,10 @@ protected void onHitBlock(BlockHitResult p_230299_1_) { this.remove(RemovalReason.DISCARDED); } } - - protected void defineSynchedData() { - this.entityData.define(FASTER_ANIM, false); + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + builder.define(FASTER_ANIM, false); } public void setShooter(@Nullable Entity entityIn) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java index a5d8c27..2a81288 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java @@ -11,7 +11,6 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Rotation; -import net.minecraftforge.network.PlayMessages; // Adapted from Alex's Caves (licensed under GNU GPLv3) public class FallingTreeBlockEntity extends AbstractMovingBlockEntity { @@ -26,16 +25,16 @@ public FallingTreeBlockEntity(EntityType entityType, Level level) { super(entityType, level); } - public FallingTreeBlockEntity(PlayMessages.SpawnEntity spawnEntity, Level level) { - this(UFEntities.FALLING_TREE.get(), level); - this.setBoundingBox(this.makeBoundingBox()); - } - +// public FallingTreeBlockEntity(PlayMessages.SpawnEntity spawnEntity, Level level) { +// this(UFEntities.FALLING_TREE.get(), level); +// this.setBoundingBox(this.makeBoundingBox()); +// } + @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(FALL_DIRECTION, Direction.NORTH); - this.entityData.define(FALL_PROGRESS, 0F); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(FALL_DIRECTION, Direction.NORTH); + builder.define(FALL_PROGRESS, 0F); } public void readAdditionalSaveData(CompoundTag compound) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java index 5a09248..8910db0 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java @@ -48,6 +48,11 @@ protected ItemStack getPickupItem() { return ItemStack.EMPTY; } + @Override + protected ItemStack getDefaultPickupItem() { + return ItemStack.EMPTY; + } + @Override protected void onHit(HitResult p_37260_) { super.onHit(p_37260_); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java index 4b0639b..e156439 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java @@ -3,6 +3,7 @@ import codyhuh.unusualfishmod.core.registry.UFEntities; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.damagesource.DamageSource; @@ -32,9 +33,9 @@ public ThrownPrismarineSpear(EntityType p_37561_, Level super(p_37561_, p_37562_); } - public ThrownPrismarineSpear(Level p_37569_, LivingEntity p_37570_, ItemStack p_37571_) { - super(UFEntities.PRISMARINE_SPEAR.get(), p_37570_, p_37569_); - this.spearItem = p_37571_.copy(); + public ThrownPrismarineSpear(Level level, LivingEntity livingEntity, ItemStack itemStack) { + super(UFEntities.PRISMARINE_SPEAR.get(), livingEntity, level, itemStack, ItemStack.EMPTY); + this.spearItem = itemStack.copy(); } public void tick() { @@ -49,6 +50,11 @@ protected ItemStack getPickupItem() { return this.spearItem.copy(); } + @Override + protected ItemStack getDefaultPickupItem() { + return this.spearItem.copy(); + } + @Nullable protected EntityHitResult findHitEntity(Vec3 p_37575_, Vec3 p_37576_) { return this.dealtDamage ? null : super.findHitEntity(p_37575_, p_37576_); @@ -57,8 +63,10 @@ protected EntityHitResult findHitEntity(Vec3 p_37575_, Vec3 p_37576_) { protected void onHitEntity(EntityHitResult result) { Entity entity = result.getEntity(); float f = 5.0F; - if (entity instanceof LivingEntity livingentity) { - f += EnchantmentHelper.getDamageBonus(this.spearItem, livingentity.getMobType()); + if (entity instanceof LivingEntity livingentity && this.level() instanceof net.minecraft.server.level.ServerLevel serverLevel) { + // Todo: Chakyl check for crash with dispenser? + DamageSource damageSource = this.damageSources().mobAttack((LivingEntity) this.getOwner()); + f = EnchantmentHelper.modifyDamage(serverLevel, this.spearItem, livingentity, damageSource, (float) this.getBaseDamage()); } Entity entity1 = this.getOwner(); @@ -70,12 +78,10 @@ protected void onHitEntity(EntityHitResult result) { return; } - if (entity instanceof LivingEntity livingentity1) { - if (entity1 instanceof LivingEntity) { - EnchantmentHelper.doPostHurtEffects(livingentity1, entity1); - EnchantmentHelper.doPostDamageEffects((LivingEntity)entity1, livingentity1); + if (entity instanceof LivingEntity livingentity1 && entity1 instanceof LivingEntity livingentityAttacker) { + if (this.level() instanceof ServerLevel serverLevel) { + EnchantmentHelper.doPostAttackEffects(serverLevel, livingentity1, this.damageSources().mobAttack(livingentityAttacker)); } - this.doPostHurtEffects(livingentity1); } } @@ -100,19 +106,18 @@ public void playerTouch(Player p_37580_) { } } - public void readAdditionalSaveData(CompoundTag p_37578_) { - super.readAdditionalSaveData(p_37578_); - if (p_37578_.contains("Trident", 10)) { - this.spearItem = ItemStack.of(p_37578_.getCompound("Trident")); + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains("Trident", 10)) { + this.spearItem = ItemStack.parseOptional(this.level().registryAccess(), tag.getCompound("Trident")); } - - this.dealtDamage = p_37578_.getBoolean("DealtDamage"); + this.dealtDamage = tag.getBoolean("DealtDamage"); } - public void addAdditionalSaveData(CompoundTag p_37582_) { - super.addAdditionalSaveData(p_37582_); - p_37582_.put("Trident", this.spearItem.save(new CompoundTag())); - p_37582_.putBoolean("DealtDamage", this.dealtDamage); + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.put("Trident", this.spearItem.save(this.level().registryAccess())); + tag.putBoolean("DealtDamage", this.dealtDamage); } protected float getWaterInertia() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BreedableWaterAnimal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BreedableWaterAnimal.java index e382282..0cb726a 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BreedableWaterAnimal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BreedableWaterAnimal.java @@ -51,10 +51,11 @@ public void setGravid(boolean gravid) { @Nullable public abstract BreedableWaterAnimal getBreedOffspring(ServerLevel p_146743_, BreedableWaterAnimal p_146744_); - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(DATA_BABY_ID, false); - this.entityData.define(DATA_GRAVID, false); + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(DATA_BABY_ID, false); + builder.define(DATA_GRAVID, false); } public int getAge() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableSchoolingWaterAnimal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableSchoolingWaterAnimal.java index 56fb374..9d1c972 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableSchoolingWaterAnimal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableSchoolingWaterAnimal.java @@ -120,7 +120,7 @@ public void addFollowers(Stream p_2753 @Nullable public SpawnGroupData finalizeSpawn(ServerLevelAccessor p_27528_, DifficultyInstance p_27529_, MobSpawnType p_27530_, @Nullable SpawnGroupData p_27531_, @Nullable CompoundTag p_27532_) { - super.finalizeSpawn(p_27528_, p_27529_, p_27530_, p_27531_, p_27532_); + super.finalizeSpawn(p_27528_, p_27529_, p_27530_, p_27531_); if (p_27531_ == null) { p_27531_ = new BucketableSchoolingWaterAnimal.SchoolSpawnGroupData(this); } else { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableWaterAnimal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableWaterAnimal.java index db2bdc6..d225dd2 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableWaterAnimal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableWaterAnimal.java @@ -1,5 +1,6 @@ package codyhuh.unusualfishmod.common.entity.util.base; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; @@ -13,6 +14,7 @@ import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; public abstract class BucketableWaterAnimal extends WaterAnimal implements Bucketable { @@ -23,9 +25,9 @@ protected BucketableWaterAnimal(EntityType p_30341_, Leve } @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(FROM_BUCKET, false); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(FROM_BUCKET, false); } public void addAdditionalSaveData(CompoundTag compound) { @@ -45,11 +47,13 @@ public boolean fromBucket() { @Override public void saveToBucketTag(ItemStack bucket) { - CompoundTag compoundnbt = bucket.getOrCreateTag(); - compoundnbt.putFloat("Health", this.getHealth()); - if (this.hasCustomName()) { - bucket.setHoverName(this.getCustomName()); - } + Bucketable.saveDefaultDataToBucketTag(this, bucket); + if (this.hasCustomName()) { + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); + } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); } public boolean requiresCustomPersistence() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BottomStrollGoal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BottomStrollGoal.java index 7ad982e..c7e1e76 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BottomStrollGoal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BottomStrollGoal.java @@ -21,17 +21,18 @@ public BottomStrollGoal(PathfinderMob p_i48937_1_, double p_i48937_2_, int p_i48 protected Vec3 getPosition() { Vec3 vec = DefaultRandomPos.getPos(this.mob, 10, 7); - for(int var2 = 0; vec != null && !this.mob.level().getBlockState(new BlockPos(new Vec3i((int)vec.x, (int)vec.y, (int)vec.z))).isPathfindable(this.mob.level(), new BlockPos(new Vec3i((int)vec.x, (int)vec.y, (int)vec.z)), PathComputationType.WATER) && var2++ < 10; vec = DefaultRandomPos.getPos(this.mob, 10, 7)) { + for (int var2 = 0; vec != null && !this.mob.level().getBlockState(BlockPos.containing(vec)).isPathfindable(PathComputationType.WATER) && var2++ < 10; vec = DefaultRandomPos.getPos(this.mob, 10, 7)) { } + int yDrop = 1 + this.mob.getRandom().nextInt(3); if(vec != null){ BlockPos pos = new BlockPos(new Vec3i((int)vec.x, (int)vec.y, (int)vec.z)); - while(this.mob.level().getFluidState(pos).is(FluidTags.WATER) && this.mob.level().getBlockState(pos).isPathfindable(this.mob.level(), pos, PathComputationType.WATER) && pos.getY() > 1){ + while (this.mob.level().getFluidState(pos).is(FluidTags.WATER) && this.mob.level().getBlockState(pos).isPathfindable(PathComputationType.WATER) && pos.getY() > this.mob.level().getMinBuildHeight()) { pos = pos.below(); } pos = pos.above(); int yUp = 0; - while(this.mob.level().getFluidState(pos).is(FluidTags.WATER) && this.mob.level().getBlockState(pos).isPathfindable(this.mob.level(), pos, PathComputationType.WATER) && yUp < yDrop){ + while (this.mob.level().getFluidState(pos).is(FluidTags.WATER) && this.mob.level().getBlockState(pos).isPathfindable(PathComputationType.WATER) && yUp < yDrop) { pos = pos.above(); yUp++; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/SquidLayEggsGoal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/SquidLayEggsGoal.java index 8116f19..28357db 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/SquidLayEggsGoal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/SquidLayEggsGoal.java @@ -54,7 +54,9 @@ public void tick() { @Override protected boolean isValidTarget(LevelReader level, BlockPos blockPos) { - return !level.getBlockState(blockPos).is(UFTags.SQUID_EGGS) && level.isWaterAt(blockPos) && level.getBlockState(blockPos.below()).canOcclude(); + return false; + // todo: tag +// return !level.getBlockState(blockPos).is(UFTags.SQUID_EGGS) && level.isWaterAt(blockPos) && level.getBlockState(blockPos.below()).canOcclude(); } @Override diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/MovingBlockData.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/MovingBlockData.java index 396a1d3..bfb5c77 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/MovingBlockData.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/MovingBlockData.java @@ -31,7 +31,7 @@ public MovingBlockData(BlockState state, VoxelShape shape, BlockPos offset, @Nul } public MovingBlockData(Level level, CompoundTag tag) { - this(NbtUtils.readBlockState(level.holderLookup(Registries.BLOCK), tag.getCompound("BlockState")), getShapeFromTag(tag.getCompound("VoxelShape")), new BlockPos(tag.getInt("OffsetX"), tag.getInt("OffsetY"), tag.getInt("OffsetZ")), tag.contains("BlockData") ? tag.getCompound("BlockData") : null); + this(NbtUtils.readBlockState(level.registryAccess().lookupOrThrow(Registries.BLOCK),tag.getCompound("BlockState")), getShapeFromTag(tag.getCompound("VoxelShape")), new BlockPos(tag.getInt("OffsetX"), tag.getInt("OffsetY"), tag.getInt("OffsetZ")), tag.contains("BlockData") ? tag.getCompound("BlockData") : null); } public BlockState getState() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/UFAnimations.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/UFAnimations.java index c8d0f55..9a93592 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/UFAnimations.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/UFAnimations.java @@ -1,6 +1,6 @@ package codyhuh.unusualfishmod.common.entity.util.misc; -import software.bernie.geckolib.core.animation.RawAnimation; +import software.bernie.geckolib.animation.RawAnimation; public class UFAnimations { public static final RawAnimation WALK = RawAnimation.begin().thenLoop("walk"); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/movement/SnailMoveControl.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/movement/SnailMoveControl.java index 7404a60..b3de2b5 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/movement/SnailMoveControl.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/movement/SnailMoveControl.java @@ -26,8 +26,8 @@ public void tick() { double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); d1 = d1 / d3; float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.snail.yRot = this.rotlerp(this.snail.yRot, f, 90.0F); - this.snail.yBodyRot = this.snail.yRot; + this.snail.setYRot(this.rotlerp(this.snail.getYRot(), f, 90.0F)); + this.snail.yBodyRot = this.snail.getYRot(); float f1 = (float) (this.speedModifier * this.snail.getAttributeValue(Attributes.MOVEMENT_SPEED)); this.snail.setSpeed(Mth.lerp(0.125F, this.snail.getSpeed(), f1)); this.snail.setDeltaMovement(this.snail.getDeltaMovement().add(0.0D, (double) this.snail.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/movement/SquidMoveControl.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/movement/SquidMoveControl.java index 81df43d..9db11a3 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/movement/SquidMoveControl.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/movement/SquidMoveControl.java @@ -32,8 +32,8 @@ public void tick() { if (d0 != 0.0D || d2 != 0.0D) { float f1 = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.fish.yRot = this.rotlerp(this.fish.yRot, f1, 90.0F); - this.fish.yBodyRot = this.fish.yRot; + this.fish.setYRot(this.rotlerp(this.fish.getYRot(), f1, 90.0F)); + this.fish.yBodyRot = this.fish.getYRot(); } } else { diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/DepthScytheItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/DepthScytheItem.java index 8d5f6b0..354714a 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/DepthScytheItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/DepthScytheItem.java @@ -1,21 +1,27 @@ package codyhuh.unusualfishmod.common.item; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.*; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import java.util.Optional; + public class DepthScytheItem extends SwordItem { - public DepthScytheItem(Tier tier, int attackDamageIn, float attackSpeedIn, Properties builderIn) { - super(tier, attackDamageIn, attackSpeedIn, builderIn); + public DepthScytheItem(Tier tier, Properties properties) { + super(tier, properties); } - public float getDestroySpeed(ItemStack stack, BlockState state) { if (state.is(Blocks.COBWEB)) { return 15.0F; @@ -26,17 +32,13 @@ public float getDestroySpeed(ItemStack stack, BlockState state) { } public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { - stack.hurtAndBreak(1, attacker, (entity) -> { - entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); - }); + stack.hurtAndBreak(1, attacker, EquipmentSlot.MAINHAND); return true; } public boolean mineBlock(ItemStack stack, Level worldIn, BlockState state, BlockPos pos, LivingEntity entityLiving) { if (state.getDestroySpeed(worldIn, pos) != 0.0F) { - stack.hurtAndBreak(2, entityLiving, (entity) -> { - entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); - }); + stack.hurtAndBreak(2, entityLiving, EquipmentSlot.MAINHAND); } return true; @@ -53,8 +55,8 @@ public void fillItemCategory(CreativeModeTab tab, NonNullList list) { @Override public void onCraftedBy(ItemStack stack, Level level, Player player) { - stack.serializeNBT(); - stack.enchant(Enchantments.SWEEPING_EDGE, 5); + level.holderLookup(Registries.ENCHANTMENT).get(Enchantments.SWEEPING_EDGE) .ifPresent(enchant -> stack.enchant(enchant, 5)); + super.onCraftedBy(stack, level, player); } @Override diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java index be219de..a2846f6 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java @@ -4,12 +4,15 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -18,23 +21,28 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TridentItem; import net.minecraft.world.item.UseAnim; -import net.minecraft.world.item.Vanishable; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -public class PrismarineSpearItem extends Item implements Vanishable { - private final Multimap defaultModifiers; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; + +public class PrismarineSpearItem extends Item { + public static final ResourceLocation BASE_ATTACK_DAMAGE_ID = loc("base_attack_damage"); + public static final ResourceLocation BASE_ATTACK_SPEED_ID = loc("base_attack_speed"); public PrismarineSpearItem(Item.Properties p_43381_) { - super(p_43381_); - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Tool modifier", 5.0D, AttributeModifier.Operation.ADDITION)); - builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Tool modifier", -2.9F, AttributeModifier.Operation.ADDITION)); - this.defaultModifiers = builder.build(); + super(p_43381_.component(DataComponents.ATTRIBUTE_MODIFIERS, createAttributes())); + } + // TODO: Chakyl test + public static ItemAttributeModifiers createAttributes() { + return ItemAttributeModifiers.builder() + .add( Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_ID, 5.0D, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) + .add(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_ID, -2.9D, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).build(); } - public boolean canAttackBlock(BlockState p_43409_, Level p_43410_, BlockPos p_43411_, Player p_43412_) { return !p_43412_.isCreative(); } @@ -52,11 +60,8 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity living, int int i = this.getUseDuration(stack) - time; if (i >= 10) { if (!level.isClientSide) { - - stack.hurtAndBreak(1, player, (p_43388_) -> { - p_43388_.broadcastBreakEvent(player.getUsedItemHand()); - }); - + // TODO: Chakyl test + stack.hurtAndBreak(1, player, player.getItemInHand(player.getUsedItemHand()).getEquipmentSlot()); ThrownPrismarineSpear spear = new ThrownPrismarineSpear(level, player, stack); spear.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, 2.5F, 1.0F); @@ -65,8 +70,7 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity living, int } level.addFreshEntity(spear); - level.playSound(null, spear, SoundEvents.TRIDENT_THROW, SoundSource.PLAYERS, 1.0F, 1.0F); - + level.playSound(null, living.getX(), living.getY(), living.getZ(), SoundEvents.TRIDENT_THROW, SoundSource.PLAYERS, 1.0F, 1.0F); if (!player.getAbilities().instabuild) { player.getInventory().removeItem(stack); } @@ -81,7 +85,7 @@ public InteractionResultHolder use(Level p_43405_, Player p_43406_, I ItemStack itemstack = p_43406_.getItemInHand(p_43407_); if (itemstack.getDamageValue() >= itemstack.getMaxDamage() - 1) { return InteractionResultHolder.fail(itemstack); - } else if (EnchantmentHelper.getRiptide(itemstack) > 0 && !p_43406_.isInWaterOrRain()) { + } else if ( EnchantmentHelper.getTridentSpinAttackStrength(itemstack, p_43406_) > 0 && !p_43406_.isInWaterOrRain()) { return InteractionResultHolder.fail(itemstack); } else { p_43406_.startUsingItem(p_43407_); @@ -90,26 +94,19 @@ public InteractionResultHolder use(Level p_43405_, Player p_43406_, I } public boolean hurtEnemy(ItemStack p_43390_, LivingEntity p_43391_, LivingEntity p_43392_) { - p_43390_.hurtAndBreak(1, p_43392_, (p_43414_) -> { - p_43414_.broadcastBreakEvent(EquipmentSlot.MAINHAND); - }); + p_43390_.hurtAndBreak(1, p_43392_, EquipmentSlot.MAINHAND); return true; } public boolean mineBlock(ItemStack p_43399_, Level p_43400_, BlockState p_43401_, BlockPos p_43402_, LivingEntity p_43403_) { if ((double)p_43401_.getDestroySpeed(p_43400_, p_43402_) != 0.0D) { - p_43399_.hurtAndBreak(2, p_43403_, (p_43385_) -> { - p_43385_.broadcastBreakEvent(EquipmentSlot.MAINHAND); - }); + + p_43399_.hurtAndBreak(2, p_43403_, EquipmentSlot.MAINHAND); } return true; } - public Multimap getDefaultAttributeModifiers(EquipmentSlot p_43383_) { - return p_43383_ == EquipmentSlot.MAINHAND ? this.defaultModifiers : super.getDefaultAttributeModifiers(p_43383_); - } - public int getEnchantmentValue() { return 1; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java index 71ea9a1..8cb2201 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java @@ -7,7 +7,6 @@ import codyhuh.unusualfishmod.core.registry.UFTags; import codyhuh.unusualfishmod.core.registry.UFTiers; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.BlockParticleOption; @@ -24,6 +23,7 @@ import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.item.*; import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; @@ -32,17 +32,16 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.ToolAction; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; // Tree chopping code adapted from Alex's Caves (licensed under GNU GPLv3) -public class RipsawItem extends AxeItem implements Vanishable { +public class RipsawItem extends AxeItem { - public RipsawItem(Properties p_41383_) { - super(UFTiers.RIPPER_SAW, 7.0F, -1.0F, p_41383_); + public RipsawItem(Properties properties) { + super(UFTiers.RIPPER_SAW, properties); } @Override @@ -81,15 +80,17 @@ public void gatherAttachedBlocks(LivingEntity player, BlockPos origin, BlockPos public boolean isTreePart(LivingEntity player, BlockPos pos) { BlockState state = player.level().getBlockState(pos); - if (state.isAir() || state.is(UFTags.UNCHOPPABLE)) { - return false; - } else { - return state.is(BlockTags.LOGS) || state.is(BlockTags.LEAVES); - } + // todo: tags + return true; +// if (state.isAir() || state.is(UFTags.UNCHOPPABLE)) { +// return false; +// } else { +// return state.is(BlockTags.LOGS) || state.is(BlockTags.LEAVES); +// } } @Override - public void appendHoverText(ItemStack p_41421_, @Nullable Level p_41422_, List componentList, TooltipFlag p_41424_) { + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List componentList, TooltipFlag flag) { componentList.add(Component.translatable("tooltip.ripsaw").withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); } @@ -102,7 +103,7 @@ public void onUseTick(Level level, LivingEntity user, ItemStack stack, int remai BlockState state = level.getBlockState(blockHitResult.getBlockPos()); BlockPos blockPos = blockHitResult.getBlockPos(); Direction face = blockHitResult.getDirection(); - int i = this.getUseDuration(stack) - remainingUseDuration + 1; + int i = this.getUseDuration(stack, user) - remainingUseDuration + 1; if (state.is(BlockTags.LOGS) && !level.getBlockState(blockPos.below()).is(BlockTags.LOGS)) { List gathered = new ArrayList<>(); @@ -129,7 +130,7 @@ public void onUseTick(Level level, LivingEntity user, ItemStack stack, int remai BlockState moveState = player.level().getBlockState(pos); BlockEntity te = player.level().getBlockEntity(pos); BlockPos offset = pos.subtract(blockPos); - MovingBlockData data = new MovingBlockData(moveState, moveState.getShape(player.level(), pos), offset, te == null ? null : te.saveWithoutMetadata()); + MovingBlockData data = new MovingBlockData(moveState, moveState.getShape(player.level(), pos), offset, te == null ? null : te.saveWithoutMetadata(player.level().registryAccess())); player.level().removeBlockEntity(pos); allData.add(data); } @@ -146,9 +147,7 @@ public void onUseTick(Level level, LivingEntity user, ItemStack stack, int remai fallingTree.setFallDirection(Direction.fromYRot(f)); player.level().addFreshEntity(fallingTree); - stack.hurtAndBreak(allData.stream().filter(e -> e.getState().is(BlockTags.LOGS)).toList().size(), player, (p_40992_) -> { - p_40992_.broadcastBreakEvent(EquipmentSlot.MAINHAND); - }); + stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND); } } @@ -157,26 +156,18 @@ public void onUseTick(Level level, LivingEntity user, ItemStack stack, int remai if (remainingUseDuration % 15 == 0) { player.playSound(UFSounds.SAWING.get()); } - - EntityHitResult entityResult = getLookAtEntity(player, player.level(), player.getEntityReach() + 1.0D); + EntityHitResult entityResult = getLookAtEntity(player, player.level(), player.getAttributeValue(Attributes.ENTITY_INTERACTION_RANGE) + 1.0D); if (entityResult != null && entityResult.getEntity() instanceof LivingEntity living) { - if (living.hurt(player.damageSources().playerAttack(player), getAttackDamage())) { - stack.hurtAndBreak(1, player, (p_40665_) -> { - p_40665_.broadcastBreakEvent(living.getUsedItemHand()); - }); + if (living.hurt(player.damageSources().playerAttack(player), this.getTier().getAttackDamageBonus())) { + stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND); } } } } - @Override - public boolean canPerformAction(ItemStack stack, ToolAction toolAction) { - return false; - } - private HitResult calculateHitResult(Player pPlayer) { - return ProjectileUtil.getHitResultOnViewVector(pPlayer, p_281111_ -> !p_281111_.isSpectator() && p_281111_.isPickable(), pPlayer.getBlockReach()); + return ProjectileUtil.getHitResultOnViewVector(pPlayer, p_281111_ -> !p_281111_.isSpectator() && p_281111_.isPickable(), pPlayer.getAttributeValue(Attributes.ENTITY_INTERACTION_RANGE)); } @Override @@ -194,7 +185,7 @@ public InteractionResultHolder use(Level level, Player player, Intera } @Override - public int getUseDuration(ItemStack p_41454_) { + public int getUseDuration(ItemStack stack, LivingEntity entity) { return 72000; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/UFFishBucketItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/UFFishBucketItem.java index 4aaad0e..9142ded 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/UFFishBucketItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/UFFishBucketItem.java @@ -11,6 +11,6 @@ public class UFFishBucketItem extends MobBucketItem { public UFFishBucketItem(Supplier> entityType, Supplier fluid, Item item, boolean hasTooltip, Properties builder) { - super(entityType, fluid, () -> SoundEvents.BUCKET_EMPTY_FISH, builder); + super(entityType.get(), fluid.get(), SoundEvents.BUCKET_EMPTY_FISH, builder); } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/WeatherShellItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/WeatherShellItem.java index 76c6d1c..5e99660 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/WeatherShellItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/WeatherShellItem.java @@ -4,6 +4,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; @@ -28,15 +29,15 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity holder, int if (level instanceof ServerLevel sl) { if (weather.equals("thunder") && !level.getLevelData().isThundering()) { sl.setWeatherParameters(0, 1200, true, true); - stack.hurtAndBreak(1, player, (e) -> e.broadcastBreakEvent(hand)); + stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND); } else if (weather.equals("rain") && !level.getLevelData().isRaining()) { sl.setWeatherParameters(0, 1200, true, false); - stack.hurtAndBreak(1, player, (e) -> e.broadcastBreakEvent(hand)); + stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND); } else if (weather.equals("clear") && (level.getLevelData().isRaining() || level.getLevelData().isThundering())) { sl.setWeatherParameters(36000, 0, false, false); - stack.hurtAndBreak(1, player, (e) -> e.broadcastBreakEvent(hand)); + stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND); } } } @@ -48,8 +49,8 @@ public InteractionResultHolder use(Level level, Player player, Intera if (!player.isUsingItem() && !player.getCooldowns().isOnCooldown(stack.getItem())) { player.startUsingItem(hand); - player.playSound(SoundEvents.GOAT_HORN_SOUND_VARIANTS.get(1).get(), 1.0F, 1.0F); - player.getCooldowns().addCooldown(this, getUseDuration(stack)); + player.playSound(SoundEvents.GOAT_HORN_SOUND_VARIANTS.get(1).value(), 1.0F, 1.0F); + player.getCooldowns().addCooldown(this, getUseDuration(stack, player)); } return InteractionResultHolder.success(stack); @@ -61,7 +62,7 @@ public UseAnim getUseAnimation(ItemStack p_41452_) { } @Override - public int getUseDuration(ItemStack p_41454_) { + public int getUseDuration(ItemStack stack, LivingEntity entity) { return 40; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/loot/BuriedTreasureLootModifier.java b/src/main/java/codyhuh/unusualfishmod/common/loot/BuriedTreasureLootModifier.java index 3c25112..f32d8d7 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/loot/BuriedTreasureLootModifier.java +++ b/src/main/java/codyhuh/unusualfishmod/common/loot/BuriedTreasureLootModifier.java @@ -2,13 +2,15 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.loot.IGlobalLootModifier; -import net.minecraftforge.common.loot.LootModifier; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; @@ -23,16 +25,16 @@ public BuriedTreasureLootModifier(LootItemCondition[] condition) { @Override protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { if (context.getRandom().nextFloat() > 0.7F) { - generatedLoot.add(new ItemStack(UFItems.MUSIC_DISC_SEAFOAM.get())); + generatedLoot.add(new ItemStack(UFItems.MUSIC_DISC_SEAFOAM.get())); } return generatedLoot; } - public static final Supplier> CODEC = () -> RecordCodecBuilder.create(inst -> codecStart(inst).apply(inst, BuriedTreasureLootModifier::new)); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, BuriedTreasureLootModifier::new)); @Override - public Codec codec() { - return CODEC.get(); + public MapCodec codec() { + return CODEC; } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/loot/UnderwaterRuinsLootModifier.java b/src/main/java/codyhuh/unusualfishmod/common/loot/UnderwaterRuinsLootModifier.java index 6b676a0..f0ebe7b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/loot/UnderwaterRuinsLootModifier.java +++ b/src/main/java/codyhuh/unusualfishmod/common/loot/UnderwaterRuinsLootModifier.java @@ -2,13 +2,14 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.loot.IGlobalLootModifier; -import net.minecraftforge.common.loot.LootModifier; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; @@ -27,11 +28,11 @@ public UnderwaterRuinsLootModifier(LootItemCondition[] condition) { return generatedLoot; } - public static final Supplier> CODEC = () -> RecordCodecBuilder.create(inst -> codecStart(inst).apply(inst, UnderwaterRuinsLootModifier::new)); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, UnderwaterRuinsLootModifier::new)); @Override - public Codec codec() { - return CODEC.get(); + public MapCodec codec() { + return CODEC; } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/loot/UnusualCatchLootModifier.java b/src/main/java/codyhuh/unusualfishmod/common/loot/UnusualCatchLootModifier.java index 90e2014..501b19a 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/loot/UnusualCatchLootModifier.java +++ b/src/main/java/codyhuh/unusualfishmod/common/loot/UnusualCatchLootModifier.java @@ -2,21 +2,24 @@ import codyhuh.unusualfishmod.core.registry.UFEnchantments; import codyhuh.unusualfishmod.core.registry.UFTags; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.tags.ItemTags; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraftforge.common.Tags; -import net.minecraftforge.common.loot.IGlobalLootModifier; -import net.minecraftforge.common.loot.LootModifier; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; -import java.util.function.Supplier; +import java.util.Optional; public class UnusualCatchLootModifier extends LootModifier { @@ -24,32 +27,36 @@ public UnusualCatchLootModifier(LootItemCondition[] condition) { super(condition); } + // TODO: Chakyl test this @Override protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { - var items = ForgeRegistries.ITEMS.tags().getTag(UFTags.UNUSUAL_CATCH_ITEMS).stream().toList(); - int size = items.size(); - - ObjectArrayList ret = new ObjectArrayList<>(); - ItemStack stack = context.getParamOrNull(LootContextParams.TOOL); - - if (stack != null) { - int i = EnchantmentHelper.getTagEnchantmentLevel(UFEnchantments.UNUSUAL_CATCH.get(), stack); - - if (stack.is(Tags.Items.TOOLS_FISHING_RODS) && i > 0) { - ret.add(new ItemStack(items.get(context.getRandom().nextInt(size)))); - } - else { - ret = generatedLoot; - } - } - return ret; +// var tagOptional = BuiltInRegistries.ITEM.getOrCreateTag(UFTags.UNUSUAL_CATCH_ITEMS); +// var items = tagOptional.stream().map(Holder::value).toList(); +// int size = items.size(); +// +// ObjectArrayList ret = new ObjectArrayList<>(); +// ItemStack stack = context.getParamOrNull(LootContextParams.TOOL); +// +// if (stack != null) { +// Optional> unusualCatch = context.getLevel().registryAccess().lookupOrThrow(Registries.ENCHANTMENT).get(UFEnchantments.UNUSUAL_CATCH); +// int i = 0; +// if (unusualCatch.isPresent()) { +// i = EnchantmentHelper.getItemEnchantmentLevel(unusualCatch.get(), stack); +// } +// if (stack.is(ItemTags.FISHING_ENCHANTABLE) && i > 0) { +// ret.add(new ItemStack(items.get(context.getRandom().nextInt(size)))); +// } +// else { +// ret = generatedLoot; +// } +// } + return new ObjectArrayList<>(); } - public static final Supplier> CODEC = () -> RecordCodecBuilder.create(inst -> codecStart(inst).apply(inst, UnusualCatchLootModifier::new)); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, UnusualCatchLootModifier::new)); @Override - public Codec codec() { - return CODEC.get(); + public MapCodec codec() { + return CODEC; } - } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlockEntities.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlockEntities.java index 7db0d3d..47cf561 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlockEntities.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlockEntities.java @@ -3,14 +3,14 @@ import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.common.block_entity.SeaBoomBlockEntity; import codyhuh.unusualfishmod.common.block_entity.VoltDetectorBlockEntity; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; public class UFBlockEntities { - public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, UnusualFishMod.MOD_ID); + public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, UnusualFishMod.MOD_ID); - public static final RegistryObject> VOLT_DETECTOR = BLOCK_ENTITIES.register("volt_detector", () -> BlockEntityType.Builder.of(VoltDetectorBlockEntity::new, UFBlocks.VOLT_DETECTOR.get()).build(null)); - public static final RegistryObject> SEA_BOOM = BLOCK_ENTITIES.register("sea_boom", () -> BlockEntityType.Builder.of(SeaBoomBlockEntity::new, UFBlocks.SEA_BOOM.get()).build(null)); + public static final DeferredHolder, BlockEntityType> VOLT_DETECTOR = BLOCK_ENTITIES.register("volt_detector", () -> BlockEntityType.Builder.of(VoltDetectorBlockEntity::new, UFBlocks.VOLT_DETECTOR.get()).build(null)); + public static final DeferredHolder, BlockEntityType> SEA_BOOM = BLOCK_ENTITIES.register("sea_boom", () -> BlockEntityType.Builder.of(SeaBoomBlockEntity::new, UFBlocks.SEA_BOOM.get()).build(null)); } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlocks.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlocks.java index 649d210..9288855 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlocks.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlocks.java @@ -3,54 +3,54 @@ import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.common.block.*; import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; import java.util.function.Supplier; public final class UFBlocks { - public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, UnusualFishMod.MOD_ID); - - public static final RegistryObject VOLT_DETECTOR = registerBlock("volt_detector", () -> new VoltDetectorBlock(BlockBehaviour.Properties.copy(Blocks.COPPER_BLOCK).sound(SoundType.METAL).randomTicks().lightLevel(state -> 10))); - public static final RegistryObject NAUTICAL_LAMP = registerBlock("nautical_lamp", () -> new NauticalLampBlock(BlockBehaviour.Properties.copy(Blocks.LANTERN))); - public static final RegistryObject SEA_BOOM = registerBlock("sea_boom", () -> new SeaBoomBlock(BlockBehaviour.Properties.copy(Blocks.PRISMARINE).sound(SoundType.METAL).randomTicks())); - public static final RegistryObject CRIMSON_EGGS = registerBlock("crimson_eggs", () -> new SquidEggsBlock(UFEntities.CRIMSONSHELL_SQUID::get, BlockBehaviour.Properties.copy(Blocks.FROGSPAWN))); - public static final RegistryObject RELUCENT_EGGS = registerBlock("relucent_eggs", () -> new SquidEggsBlock(UFEntities.TRUMPET_SQUID::get, BlockBehaviour.Properties.copy(Blocks.FROGSPAWN))); - public static final RegistryObject COPPER_ANTENNA = registerBlock("copper_antenna", () -> new CopperAntennaBlock(BlockBehaviour.Properties.copy(Blocks.LIGHTNING_ROD))); - - public static final RegistryObject CHISELED_CRIMSON_BRICKS = registerBlock("chiseled_crimson_bricks", () -> new Block(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject CRIMSON_BRICKS = registerBlock("crimson_bricks", () -> new Block(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject CRIMSON_BRICK_STAIRS = registerBlock("crimson_brick_stairs", () -> new StairBlock(() -> CRIMSON_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject CRIMSON_BRICK_SLAB = registerBlock("crimson_brick_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject CRIMSON_BRICK_WALL = registerBlock("crimson_brick_wall", () -> new WallBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject CRIMSON_TILES = registerBlock("crimson_tiles", () -> new Block(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject CRIMSON_TILE_STAIRS = registerBlock("crimson_tile_stairs", () -> new StairBlock(() -> CRIMSON_TILES.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject CRIMSON_TILE_SLAB = registerBlock("crimson_tile_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject CRIMSON_TILE_WALL = registerBlock("crimson_tile_wall", () -> new WallBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - - public static final RegistryObject CHISELED_RELUCENT_BRICKS = registerBlock("chiseled_relucent_bricks", () -> new Block(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject RELUCENT_BRICKS = registerBlock("relucent_bricks", () -> new Block(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject RELUCENT_BRICK_STAIRS = registerBlock("relucent_brick_stairs", () -> new StairBlock(() -> RELUCENT_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject RELUCENT_BRICK_SLAB = registerBlock("relucent_brick_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject RELUCENT_BRICK_WALL = registerBlock("relucent_brick_wall", () -> new WallBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject RELUCENT_TILES = registerBlock("relucent_tiles", () -> new Block(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject RELUCENT_TILE_STAIRS = registerBlock("relucent_tile_stairs", () -> new StairBlock(() -> RELUCENT_TILES.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject RELUCENT_TILE_SLAB = registerBlock("relucent_tile_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - public static final RegistryObject RELUCENT_TILE_WALL = registerBlock("relucent_tile_wall", () -> new WallBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BRICKS))); - - private static RegistryObject registerBlock(String name, Supplier block) { - RegistryObject toReturn = BLOCKS.register(name, block); + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(UnusualFishMod.MOD_ID); + + public static final DeferredBlock VOLT_DETECTOR = registerBlock("volt_detector", () -> new VoltDetectorBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BLOCK).sound(SoundType.METAL).randomTicks().lightLevel(state -> 10))); + + public static final DeferredBlock NAUTICAL_LAMP = registerBlock("nautical_lamp", () -> new NauticalLampBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LANTERN))); + public static final DeferredBlock SEA_BOOM = registerBlock("sea_boom", () -> new SeaBoomBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.PRISMARINE).sound(SoundType.METAL).randomTicks())); + public static final DeferredBlock CRIMSON_EGGS = registerBlock("crimson_eggs", () -> new SquidEggsBlock(UFEntities.CRIMSONSHELL_SQUID::get, BlockBehaviour.Properties.ofFullCopy(Blocks.FROGSPAWN))); + public static final DeferredBlock RELUCENT_EGGS = registerBlock("relucent_eggs", () -> new SquidEggsBlock(UFEntities.TRUMPET_SQUID::get, BlockBehaviour.Properties.ofFullCopy(Blocks.FROGSPAWN))); + public static final DeferredBlock COPPER_ANTENNA = registerBlock("copper_antenna", () -> new CopperAntennaBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHTNING_ROD))); + + public static final DeferredBlock CHISELED_CRIMSON_BRICKS = registerBlock("chiseled_crimson_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_BRICKS = registerBlock("crimson_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_BRICK_STAIRS = registerBlock("crimson_brick_stairs", () -> new StairBlock(UFBlocks.CRIMSON_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_BRICK_SLAB = registerBlock("crimson_brick_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_BRICK_WALL = registerBlock("crimson_brick_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_TILES = registerBlock("crimson_tiles", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_TILE_STAIRS = registerBlock("crimson_tile_stairs", () -> new StairBlock(UFBlocks.CRIMSON_TILES.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_TILE_SLAB = registerBlock("crimson_tile_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_TILE_WALL = registerBlock("crimson_tile_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + + public static final DeferredBlock CHISELED_RELUCENT_BRICKS = registerBlock("chiseled_relucent_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_BRICKS = registerBlock("relucent_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_BRICK_STAIRS = registerBlock("relucent_brick_stairs", () -> new StairBlock(UFBlocks.RELUCENT_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_BRICK_SLAB = registerBlock("relucent_brick_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_BRICK_WALL = registerBlock("relucent_brick_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_TILES = registerBlock("relucent_tiles", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_TILE_STAIRS = registerBlock("relucent_tile_stairs", () -> new StairBlock(UFBlocks.RELUCENT_TILES.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_TILE_SLAB = registerBlock("relucent_tile_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_TILE_WALL = registerBlock("relucent_tile_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + + private static DeferredBlock registerBlock(String name, Supplier block) { + DeferredBlock toReturn = BLOCKS.register(name, block); registerBlockItem(name, toReturn); return toReturn; } - private static RegistryObject registerBlockItem(String name, RegistryObject block) { + private static DeferredItem registerBlockItem(String name, DeferredBlock block) { return UFItems.ITEMS.register(name, () -> new BlockItem(block.get(), new Item.Properties())); } diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEnchantments.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEnchantments.java index 9e8d93c..0d1dc15 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEnchantments.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEnchantments.java @@ -1,15 +1,14 @@ package codyhuh.unusualfishmod.core.registry; import codyhuh.unusualfishmod.UnusualFishMod; -import codyhuh.unusualfishmod.common.enchantment.UnusualCatchEnchantment; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredRegister; public class UFEnchantments { - public static final DeferredRegister ENCHANTMENTS = DeferredRegister.create(ForgeRegistries.ENCHANTMENTS, UnusualFishMod.MOD_ID); - - public static final RegistryObject UNUSUAL_CATCH = ENCHANTMENTS.register("unusual_catch", () -> new UnusualCatchEnchantment(Enchantment.Rarity.UNCOMMON, EquipmentSlot.MAINHAND, EquipmentSlot.OFFHAND)); + public static final ResourceKey UNUSUAL_CATCH = ResourceKey.create(Registries.ENCHANTMENT, ResourceLocation.fromNamespaceAndPath(UnusualFishMod.MOD_ID, "unusual_catch") + ); } diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java index 893f0b1..92684b1 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java @@ -6,77 +6,76 @@ import codyhuh.unusualfishmod.common.entity.item.FallingTreeBlockEntity; import codyhuh.unusualfishmod.common.entity.item.SeaSpike; import codyhuh.unusualfishmod.common.entity.item.ThrownPrismarineSpear; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; public class UFEntities { - public static final DeferredRegister> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, UnusualFishMod.MOD_ID); + public static final DeferredRegister> ENTITIES = DeferredRegister.create(BuiltInRegistries.ENTITY_TYPE, UnusualFishMod.MOD_ID); // Living - public static final RegistryObject> DUALITY_DAMSELFISH = ENTITIES.register("duality_damselfish", () -> EntityType.Builder.of(DualityDamselfish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.5f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "duality_damselfish").toString())); - public static final RegistryObject> MOSSTHORN = ENTITIES.register("mossthorn", () -> EntityType.Builder.of(Mossthorn::new, MobCategory.UNDERGROUND_WATER_CREATURE).sized(0.8f, 1.0f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "mossthorn").toString())); - public static final RegistryObject> RIPPER = ENTITIES.register("ripper", () -> EntityType.Builder.of(Ripper::new, MobCategory.WATER_CREATURE).sized(0.9f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "ripper").toString())); - public static final RegistryObject> SPINDLEFISH = ENTITIES.register("spindlefish", () -> EntityType.Builder.of(Spindlefish::new, MobCategory.WATER_AMBIENT).sized(0.6f, 0.7f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "spindlefish").toString())); - public static final RegistryObject> RHINO_TETRA = ENTITIES.register("rhino_tetra", () -> EntityType.Builder.of(RhinoTetra::new, MobCategory.WATER_AMBIENT).sized(1.0f, 0.8f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "rhino_tetra").toString())); - public static final RegistryObject> DROOPING_GOURAMI = ENTITIES.register("drooping_gourami", () -> EntityType.Builder.of(DroopingGourami::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "drooping_gourami").toString())); - public static final RegistryObject> SAILOR_BARB = ENTITIES.register("sailor_barb", () -> EntityType.Builder.of(SailorBarb::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "sailor_barb").toString())); - public static final RegistryObject> SEA_SPIDER = ENTITIES.register("sea_spider", () -> EntityType.Builder.of(SeaSpider::new, MobCategory.WATER_AMBIENT).sized(0.9f, 0.9f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "sea_spider").toString())); - public static final RegistryObject> TRIPLE_TWIRL_PLECO = ENTITIES.register("triple_twirl_pleco", () -> EntityType.Builder.of(TripleTwirlPleco::new, MobCategory.WATER_AMBIENT).sized(0.75f, 0.45f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "triple_twirl_pleco").toString())); - public static final RegistryObject> AERO_MONO = ENTITIES.register("aero_mono", () -> EntityType.Builder.of(AeroMono::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.5f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "aero_mono").toString())); - public static final RegistryObject> CLOWNTHORN_SHARK = ENTITIES.register("clownthorn_shark", () -> EntityType.Builder.of(ClownthornShark::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "clownthorn_shark").toString())); - public static final RegistryObject> ROUGHBACK = ENTITIES.register("roughback_guitarfish", () -> EntityType.Builder.of(RoughbackGuitarfish::new, MobCategory.WATER_CREATURE).sized(1.0f, 0.3f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "roughback_guitarfish").toString())); - public static final RegistryObject> SEA_PANCAKE = ENTITIES.register("sea_pancake", () -> EntityType.Builder.of(SeaPancake::new, MobCategory.WATER_CREATURE).sized(3.0f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "sea_pancake").toString())); - public static final RegistryObject> PINKFIN = ENTITIES.register("pinkfin", () -> EntityType.Builder.of(PinkfinIdol::new, MobCategory.WATER_CREATURE).sized(1.0f, 1.8f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "pinkfin").toString())); - public static final RegistryObject> BRICK_SNAIL = ENTITIES.register("brick_snail", () -> EntityType.Builder.of(BrickSnail::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "brick_snail").toString())); - public static final RegistryObject> ZEBRA_CORNETFISH = ENTITIES.register("zebra_cornetfish", () -> EntityType.Builder.of(ZebraCornetfish::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.3f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "zebra_cornetfish").toString())); - public static final RegistryObject> TIGER_PUFFER = ENTITIES.register("tiger_puffer", () -> EntityType.Builder.of(TigerPuffer::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "tiger_puffer").toString())); - public static final RegistryObject> BLACKCAP_SNAIL = ENTITIES.register("blackcap_snail", () -> EntityType.Builder.of(BlackCapSnail::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "blackcap_snail").toString())); - public static final RegistryObject> SNEEPSNORP = ENTITIES.register("sneep_snorp", () -> EntityType.Builder.of(SneepSnorp::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "sneep_snorp").toString())); - public static final RegistryObject> DEEP_CRAWLER = ENTITIES.register("deep_crawler", () -> EntityType.Builder.of(DeepCrawler::new, MobCategory.WATER_CREATURE).sized(0.9f, 0.5f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "deep_crawler").toString())); - public static final RegistryObject> WIZARD_JELLY = ENTITIES.register("wizard_jelly", () -> EntityType.Builder.of(ManaJellyfish::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.5f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "wizard_jelly").toString())); - public static final RegistryObject> PORCUPINE_LOBSTA = ENTITIES.register("porcupine_lobsta", () -> EntityType.Builder.of(PorcupineLobster::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "porcupine_lobsta").toString())); - public static final RegistryObject> TRUMPET_SQUID = ENTITIES.register("trumpet_squid", () -> EntityType.Builder.of(TrumpetSquid::new, MobCategory.WATER_CREATURE).sized(1.5f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "trumpet_squid").toString())); - public static final RegistryObject> FRESHWATER_MANTIS = ENTITIES.register("freshwater_mantis", () -> EntityType.Builder.of(FreshwaterMantis::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "freshwater_mantis").toString())); - public static final RegistryObject> BARK_ANGELFISH = ENTITIES.register("bark_angelfish", () -> EntityType.Builder.of(BarkAngelfish::new, MobCategory.WATER_AMBIENT).sized(0.2f, 0.2f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "bark_angelfish").toString())); - public static final RegistryObject> SHOCKCAT = ENTITIES.register("shockcat", () -> EntityType.Builder.of(Shockcat::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.7f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "shockcat").toString())); - public static final RegistryObject> MUDDYTOP_SNAIL = ENTITIES.register("muddytop", () -> EntityType.Builder.of(MuddytopSnail::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "muddytop").toString())); - public static final RegistryObject> KALAPPA = ENTITIES.register("kalappa", () -> EntityType.Builder.of(Kalappa::new, MobCategory.CREATURE).sized(1.8f, 1.8f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "kalappa").toString())); - public static final RegistryObject> LOBED_SKIPPER = ENTITIES.register("skipper", () -> EntityType.Builder.of(LobedSkipper::new, MobCategory.CREATURE).sized(0.5f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "skipper").toString())); - public static final RegistryObject> STOUT_BICHIR = ENTITIES.register("stout_bichir", () -> EntityType.Builder.of(StoutBichir::new, MobCategory.WATER_CREATURE).sized(1.0f, 0.7f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "stout_bichir").toString())); - public static final RegistryObject> BEAKED_HERRING = ENTITIES.register("beaked_herring", () -> EntityType.Builder.of(BeakedHerring::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.3f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "beaked_herring").toString())); - public static final RegistryObject> PICKLEFISH = ENTITIES.register("picklefish", () -> EntityType.Builder.of(Picklefish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "picklefish").toString())); - public static final RegistryObject> BLIND_SAILFIN = ENTITIES.register("blindsailfin", () -> EntityType.Builder.of(BlindSailfin::new, MobCategory.WATER_AMBIENT).sized(0.6f, 0.5f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "blindsailfin").toString())); - public static final RegistryObject> DEMON_HERRING = ENTITIES.register("demon_herring", () -> EntityType.Builder.of(DemonHerring::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "demon_herring").toString())); - public static final RegistryObject> AMBER_GOBY = ENTITIES.register("amber_goby", () -> EntityType.Builder.of(AmberGoby::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "amber_goby").toString())); - public static final RegistryObject> HATCHET_FISH = ENTITIES.register("hatchet_fish", () -> EntityType.Builder.of(HatchetFish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "hatchet_fish").toString())); - public static final RegistryObject> COPPERFLAME = ENTITIES.register("copperflame", () -> EntityType.Builder.of(CopperflameAnthias::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "copperflame").toString())); - public static final RegistryObject> ROOTBALL = ENTITIES.register("rootball", () -> EntityType.Builder.of(Rootball::new, MobCategory.MONSTER).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "rootball").toString())); - public static final RegistryObject> CELESTIAL_FISH = ENTITIES.register("celestial", () -> EntityType.Builder.of(CelestialFish::new, MobCategory.WATER_CREATURE).sized(1.0f, 1.8f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "celestial").toString())); - public static final RegistryObject> GNASHER = ENTITIES.register("gnasher", () -> EntityType.Builder.of(Gnasher::new, MobCategory.WATER_CREATURE).sized(1.5f, 0.8f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "gnasher").toString())); - public static final RegistryObject> PRAWN = ENTITIES.register("prawn", () -> EntityType.Builder.of(Prawn::new, MobCategory.MONSTER).sized(1.5f, 1.2f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "prawn").toString())); - public static final RegistryObject> SQUODDLE = ENTITIES.register("squoddle", () -> EntityType.Builder.of(Squoddle::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "squoddle").toString())); - public static final RegistryObject> SEA_MOSQUITO = ENTITIES.register("sea_mosquito", () -> EntityType.Builder.of(SeaMosquito::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "sea_mosquito").toString())); - public static final RegistryObject> FORKFISH = ENTITIES.register("forkfish", () -> EntityType.Builder.of(Forkfish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "forkfish").toString())); - public static final RegistryObject> SPOON_SHARK = ENTITIES.register("spoon_shark", () -> EntityType.Builder.of(SpoonShark::new, MobCategory.WATER_CREATURE).sized(1.1f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "spoon_shark").toString())); - public static final RegistryObject> CORAL_SKRIMP = ENTITIES.register("coral_skrimp", () -> EntityType.Builder.of(Skrimp::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "coral_skrimp").toString())); - public static final RegistryObject> CIRCUS_FISH = ENTITIES.register("circus", () -> EntityType.Builder.of(CircusFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.8f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "circus").toString())); - public static final RegistryObject> BLIZZARDFIN_TUNA = ENTITIES.register("blizzardfin", () -> EntityType.Builder.of(BlizzardfinTuna::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "blizzardfin").toString())); - public static final RegistryObject> SNOWFLAKE = ENTITIES.register("snowflaketail", () -> EntityType.Builder.of(SnowflakeTailFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "snowflaketail").toString())); - public static final RegistryObject> EYELASH = ENTITIES.register("eyelash", () -> EntityType.Builder.of(EyelashFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "eyelash").toString())); - public static final RegistryObject> TIGER_JUNGLE_SHARK = ENTITIES.register("jungleshark", () -> EntityType.Builder.of(TigerJungleShark::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.4f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "jungleshark").toString())); - public static final RegistryObject> CRIMSONSHELL_SQUID = ENTITIES.register("crimsonshell", () -> EntityType.Builder.of(CrimsonshellSquid::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "crimsonshell").toString())); - public static final RegistryObject> VOLT_ANGLER = ENTITIES.register("volt_angler", () -> EntityType.Builder.of(VoltAngler::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "volt_angler").toString())); - public static final RegistryObject> TRIBBLE = ENTITIES.register("tribble", () -> EntityType.Builder.of(Tribble::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.2f).build(new ResourceLocation(UnusualFishMod.MOD_ID, "tribble").toString())); + public static final DeferredHolder, EntityType> DUALITY_DAMSELFISH = ENTITIES.register("duality_damselfish", () -> EntityType.Builder.of(DualityDamselfish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.5f).build("duality_damselfish")); + public static final DeferredHolder, EntityType> MOSSTHORN = ENTITIES.register("mossthorn", () -> EntityType.Builder.of(Mossthorn::new, MobCategory.UNDERGROUND_WATER_CREATURE).sized(0.8f, 1.0f).build("mossthorn")); + public static final DeferredHolder, EntityType> RIPPER = ENTITIES.register("ripper", () -> EntityType.Builder.of(Ripper::new, MobCategory.WATER_CREATURE).sized(0.9f, 0.6f).build("ripper")); + public static final DeferredHolder, EntityType> SPINDLEFISH = ENTITIES.register("spindlefish", () -> EntityType.Builder.of(Spindlefish::new, MobCategory.WATER_AMBIENT).sized(0.6f, 0.7f).build("spindlefish")); + public static final DeferredHolder, EntityType> RHINO_TETRA = ENTITIES.register("rhino_tetra", () -> EntityType.Builder.of(RhinoTetra::new, MobCategory.WATER_AMBIENT).sized(1.0f, 0.8f).build("rhino_tetra")); + public static final DeferredHolder, EntityType> DROOPING_GOURAMI = ENTITIES.register("drooping_gourami", () -> EntityType.Builder.of(DroopingGourami::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("drooping_gourami")); + public static final DeferredHolder, EntityType> SAILOR_BARB = ENTITIES.register("sailor_barb", () -> EntityType.Builder.of(SailorBarb::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("sailor_barb")); + public static final DeferredHolder, EntityType> SEA_SPIDER = ENTITIES.register("sea_spider", () -> EntityType.Builder.of(SeaSpider::new, MobCategory.WATER_AMBIENT).sized(0.9f, 0.9f).build("sea_spider")); + public static final DeferredHolder, EntityType> TRIPLE_TWIRL_PLECO = ENTITIES.register("triple_twirl_pleco", () -> EntityType.Builder.of(TripleTwirlPleco::new, MobCategory.WATER_AMBIENT).sized(0.75f, 0.45f).build("triple_twirl_pleco")); + public static final DeferredHolder, EntityType> AERO_MONO = ENTITIES.register("aero_mono", () -> EntityType.Builder.of(AeroMono::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.5f).build("aero_mono")); + public static final DeferredHolder, EntityType> CLOWNTHORN_SHARK = ENTITIES.register("clownthorn_shark", () -> EntityType.Builder.of(ClownthornShark::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("clownthorn_shark")); + public static final DeferredHolder, EntityType> ROUGHBACK = ENTITIES.register("roughback_guitarfish", () -> EntityType.Builder.of(RoughbackGuitarfish::new, MobCategory.WATER_CREATURE).sized(1.0f, 0.3f).build("roughback_guitarfish")); + public static final DeferredHolder, EntityType> SEA_PANCAKE = ENTITIES.register("sea_pancake", () -> EntityType.Builder.of(SeaPancake::new, MobCategory.WATER_CREATURE).sized(3.0f, 0.4f).build("sea_pancake")); + public static final DeferredHolder, EntityType> PINKFIN = ENTITIES.register("pinkfin", () -> EntityType.Builder.of(PinkfinIdol::new, MobCategory.WATER_CREATURE).sized(1.0f, 1.8f).build("pinkfin")); + public static final DeferredHolder, EntityType> BRICK_SNAIL = ENTITIES.register("brick_snail", () -> EntityType.Builder.of(BrickSnail::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("brick_snail")); + public static final DeferredHolder, EntityType> ZEBRA_CORNETFISH = ENTITIES.register("zebra_cornetfish", () -> EntityType.Builder.of(ZebraCornetfish::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.3f).build("zebra_cornetfish")); + public static final DeferredHolder, EntityType> TIGER_PUFFER = ENTITIES.register("tiger_puffer", () -> EntityType.Builder.of(TigerPuffer::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build("tiger_puffer")); + public static final DeferredHolder, EntityType> BLACKCAP_SNAIL = ENTITIES.register("blackcap_snail", () -> EntityType.Builder.of(BlackCapSnail::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.4f).build("blackcap_snail")); + public static final DeferredHolder, EntityType> SNEEPSNORP = ENTITIES.register("sneep_snorp", () -> EntityType.Builder.of(SneepSnorp::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("sneep_snorp")); + public static final DeferredHolder, EntityType> DEEP_CRAWLER = ENTITIES.register("deep_crawler", () -> EntityType.Builder.of(DeepCrawler::new, MobCategory.WATER_CREATURE).sized(0.9f, 0.5f).build("deep_crawler")); + public static final DeferredHolder, EntityType> WIZARD_JELLY = ENTITIES.register("wizard_jelly", () -> EntityType.Builder.of(ManaJellyfish::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.5f).build("wizard_jelly")); + public static final DeferredHolder, EntityType> PORCUPINE_LOBSTA = ENTITIES.register("porcupine_lobsta", () -> EntityType.Builder.of(PorcupineLobster::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.6f).build("porcupine_lobsta")); + public static final DeferredHolder, EntityType> TRUMPET_SQUID = ENTITIES.register("trumpet_squid", () -> EntityType.Builder.of(TrumpetSquid::new, MobCategory.WATER_CREATURE).sized(1.5f, 0.6f).build("trumpet_squid")); + public static final DeferredHolder, EntityType> FRESHWATER_MANTIS = ENTITIES.register("freshwater_mantis", () -> EntityType.Builder.of(FreshwaterMantis::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.6f).build("freshwater_mantis")); + public static final DeferredHolder, EntityType> BARK_ANGELFISH = ENTITIES.register("bark_angelfish", () -> EntityType.Builder.of(BarkAngelfish::new, MobCategory.WATER_AMBIENT).sized(0.2f, 0.2f).build("bark_angelfish")); + public static final DeferredHolder, EntityType> SHOCKCAT = ENTITIES.register("shockcat", () -> EntityType.Builder.of(Shockcat::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.7f).build("shockcat")); + public static final DeferredHolder, EntityType> MUDDYTOP_SNAIL = ENTITIES.register("muddytop", () -> EntityType.Builder.of(MuddytopSnail::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("muddytop")); + public static final DeferredHolder, EntityType> KALAPPA = ENTITIES.register("kalappa", () -> EntityType.Builder.of(Kalappa::new, MobCategory.CREATURE).sized(1.8f, 1.8f).build("kalappa")); + public static final DeferredHolder, EntityType> LOBED_SKIPPER = ENTITIES.register("skipper", () -> EntityType.Builder.of(LobedSkipper::new, MobCategory.CREATURE).sized(0.5f, 0.6f).eyeHeight(0.2F * 0.6f).build("skipper")); + public static final DeferredHolder, EntityType> STOUT_BICHIR = ENTITIES.register("stout_bichir", () -> EntityType.Builder.of(StoutBichir::new, MobCategory.WATER_CREATURE).sized(1.0f, 0.7f).build("stout_bichir")); + public static final DeferredHolder, EntityType> BEAKED_HERRING = ENTITIES.register("beaked_herring", () -> EntityType.Builder.of(BeakedHerring::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.3f).build("beaked_herring")); + public static final DeferredHolder, EntityType> PICKLEFISH = ENTITIES.register("picklefish", () -> EntityType.Builder.of(Picklefish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("picklefish")); + public static final DeferredHolder, EntityType> BLIND_SAILFIN = ENTITIES.register("blindsailfin", () -> EntityType.Builder.of(BlindSailfin::new, MobCategory.WATER_AMBIENT).sized(0.6f, 0.5f).build("blindsailfin")); + public static final DeferredHolder, EntityType> DEMON_HERRING = ENTITIES.register("demon_herring", () -> EntityType.Builder.of(DemonHerring::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("demon_herring")); + public static final DeferredHolder, EntityType> AMBER_GOBY = ENTITIES.register("amber_goby", () -> EntityType.Builder.of(AmberGoby::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("amber_goby")); + public static final DeferredHolder, EntityType> HATCHET_FISH = ENTITIES.register("hatchet_fish", () -> EntityType.Builder.of(HatchetFish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("hatchet_fish")); + public static final DeferredHolder, EntityType> COPPERFLAME = ENTITIES.register("copperflame", () -> EntityType.Builder.of(CopperflameAnthias::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("copperflame")); + public static final DeferredHolder, EntityType> ROOTBALL = ENTITIES.register("rootball", () -> EntityType.Builder.of(Rootball::new, MobCategory.MONSTER).sized(0.5f, 0.4f).build("rootball")); + public static final DeferredHolder, EntityType> CELESTIAL_FISH = ENTITIES.register("celestial", () -> EntityType.Builder.of(CelestialFish::new, MobCategory.WATER_CREATURE).sized(1.0f, 1.8f).build("celestial")); + public static final DeferredHolder, EntityType> GNASHER = ENTITIES.register("gnasher", () -> EntityType.Builder.of(Gnasher::new, MobCategory.WATER_CREATURE).sized(1.5f, 0.8f).build("gnasher")); + public static final DeferredHolder, EntityType> PRAWN = ENTITIES.register("prawn", () -> EntityType.Builder.of(Prawn::new, MobCategory.MONSTER).sized(1.5f, 1.2f).build("prawn")); + public static final DeferredHolder, EntityType> SQUODDLE = ENTITIES.register("squoddle", () -> EntityType.Builder.of(Squoddle::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("squoddle")); + public static final DeferredHolder, EntityType> SEA_MOSQUITO = ENTITIES.register("sea_mosquito", () -> EntityType.Builder.of(SeaMosquito::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("sea_mosquito")); + public static final DeferredHolder, EntityType> FORKFISH = ENTITIES.register("forkfish", () -> EntityType.Builder.of(Forkfish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("forkfish")); + public static final DeferredHolder, EntityType> SPOON_SHARK = ENTITIES.register("spoon_shark", () -> EntityType.Builder.of(SpoonShark::new, MobCategory.WATER_CREATURE).sized(1.1f, 0.4f).build("spoon_shark")); + public static final DeferredHolder, EntityType> CORAL_SKRIMP = ENTITIES.register("coral_skrimp", () -> EntityType.Builder.of(Skrimp::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("coral_skrimp")); + public static final DeferredHolder, EntityType> CIRCUS_FISH = ENTITIES.register("circus", () -> EntityType.Builder.of(CircusFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.8f).build("circus")); + public static final DeferredHolder, EntityType> BLIZZARDFIN_TUNA = ENTITIES.register("blizzardfin", () -> EntityType.Builder.of(BlizzardfinTuna::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build("blizzardfin")); + public static final DeferredHolder, EntityType> SNOWFLAKE = ENTITIES.register("snowflaketail", () -> EntityType.Builder.of(SnowflakeTailFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("snowflaketail")); + public static final DeferredHolder, EntityType> EYELASH = ENTITIES.register("eyelash", () -> EntityType.Builder.of(EyelashFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("eyelash")); + public static final DeferredHolder, EntityType> TIGER_JUNGLE_SHARK = ENTITIES.register("jungleshark", () -> EntityType.Builder.of(TigerJungleShark::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.4f).build("jungleshark")); + public static final DeferredHolder, EntityType> CRIMSONSHELL_SQUID = ENTITIES.register("crimsonshell", () -> EntityType.Builder.of(CrimsonshellSquid::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("crimsonshell")); + public static final DeferredHolder, EntityType> VOLT_ANGLER = ENTITIES.register("volt_angler", () -> EntityType.Builder.of(VoltAngler::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("volt_angler")); + public static final DeferredHolder, EntityType> TRIBBLE = ENTITIES.register("tribble", () -> EntityType.Builder.of(Tribble::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.2f).build("tribble")); // Other - public static final RegistryObject> ABYSSAL_BLAST = ENTITIES.register("abyssal_blast", () -> EntityType.Builder.of(AbyssalBlast::new, MobCategory.MISC).sized(2.0F, 0.2F).setCustomClientFactory(AbyssalBlast::new).fireImmune().build("abyssal_blast")); - public static final RegistryObject> PRISMARINE_SPEAR = ENTITIES.register("prismarine_spear", () -> EntityType.Builder.of(ThrownPrismarineSpear::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20).build("prismarine_spear")); - public static final RegistryObject> SEA_SPIKE = ENTITIES.register("sea_spike", () -> EntityType.Builder.of(SeaSpike::new, MobCategory.MISC).sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(20).build("sea_spike")); - public static final RegistryObject> FALLING_TREE = ENTITIES.register("falling_tree", () -> EntityType.Builder.of(FallingTreeBlockEntity::new, MobCategory.MISC).sized(0.99F, 0.99F).setCustomClientFactory(FallingTreeBlockEntity::new).setUpdateInterval(1).setShouldReceiveVelocityUpdates(true).updateInterval(10).clientTrackingRange(20).build("falling_tree")); + public static final DeferredHolder, EntityType> ABYSSAL_BLAST = ENTITIES.register("abyssal_blast", () -> EntityType.Builder.of(AbyssalBlast::new, MobCategory.MISC).sized(2.0F, 0.2F).fireImmune().build("abyssal_blast")); + public static final DeferredHolder, EntityType> PRISMARINE_SPEAR = ENTITIES.register("prismarine_spear", () -> EntityType.Builder.of(ThrownPrismarineSpear::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20).build("prismarine_spear")); + public static final DeferredHolder, EntityType> SEA_SPIKE = ENTITIES.register("sea_spike", () -> EntityType.Builder.of(SeaSpike::new, MobCategory.MISC).sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(20).build("sea_spike")); + public static final DeferredHolder, EntityType> FALLING_TREE = ENTITIES.register("falling_tree", () -> EntityType.Builder.of(FallingTreeBlockEntity::new, MobCategory.MISC).sized(0.99F, 0.99F).setUpdateInterval(1).setShouldReceiveVelocityUpdates(true).updateInterval(10).clientTrackingRange(20).build("falling_tree")); } diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFFoodProperties.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFFoodProperties.java index 7d63c8a..c28c4ee 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFFoodProperties.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFFoodProperties.java @@ -3,52 +3,54 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.Items; public class UFFoodProperties { // Raw - public static final FoodProperties RAW_RIPPER = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).effect(() -> new MobEffectInstance(MobEffects.HUNGER, 150, 1), 1.0F).build(); - public static final FoodProperties RAW_AERO_MONO = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).fast().effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 150, 0), 1.0F).build(); - public static final FoodProperties RAW_AERO_MONO_STICK = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).fast().effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 150, 0), 1.0F).build(); - public static final FoodProperties RAW_BUMPFACE = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_RHINO_TETRA = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_SAILOR_BARB = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_BARK_ANGELFISH = new FoodProperties.Builder().nutrition(1).saturationMod(0.1F).build(); - public static final FoodProperties RAW_BLIZZARD_TUNA = new FoodProperties.Builder().nutrition(3).saturationMod(0.1F).build(); - public static final FoodProperties RAW_SPINDLEFISH = new FoodProperties.Builder().nutrition(1).saturationMod(0.1F).effect(() -> new MobEffectInstance(MobEffects.POISON, 200, 1), 1.0F).effect(() -> new MobEffectInstance(MobEffects.WEAKNESS, 150, 1), 1.0F).build(); - public static final FoodProperties RAW_SHOCKCAT = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_MOSSTHORN = new FoodProperties.Builder().nutrition(1).saturationMod(0.1F).effect(() -> new MobEffectInstance(MobEffects.POISON, 200, 1), 1.0F).build(); - public static final FoodProperties RAW_LOBSTER = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_SNOWFLAKE = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 150, 1), 1.0F).build(); - public static final FoodProperties RAW_EYELASH = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties UNUSUAL_FILLET = new FoodProperties.Builder().nutrition(3).saturationMod(0.15F).build(); - public static final FoodProperties RAW_PICKLEFISH = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_AMBER_GOBY = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_BEAKED_HERRING = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_BLIND_SAILFIN = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_CIRCUS_FISH = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_COPPERFLAME_ANTHIAS = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_DEMON_HERRING = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_DROOPING_GOURAMI = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_DUALITY_DAMSELFISH = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_FORKFISH = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_HATCHETFISH = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_SNEEP_SNORP = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); - public static final FoodProperties RAW_TRIPLE_TWIRL_PLECO = new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).build(); + + public static final FoodProperties RAW_RIPPER = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).effect(() -> new MobEffectInstance(MobEffects.HUNGER, 150, 1), 1.0F).build(); + public static final FoodProperties RAW_AERO_MONO = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).fast().effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 150, 0), 1.0F).build(); + public static final FoodProperties RAW_AERO_MONO_STICK = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).fast().effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 150, 0), 1.0F).build(); + public static final FoodProperties RAW_BUMPFACE = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_RHINO_TETRA = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_SAILOR_BARB = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_BARK_ANGELFISH = new FoodProperties.Builder().nutrition(1).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_BLIZZARD_TUNA = new FoodProperties.Builder().nutrition(3).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_SPINDLEFISH = new FoodProperties.Builder().nutrition(1).saturationModifier(0.1F).effect(() -> new MobEffectInstance(MobEffects.POISON, 200, 1), 1.0F).effect(() -> new MobEffectInstance(MobEffects.WEAKNESS, 150, 1), 1.0F).build(); + public static final FoodProperties RAW_SHOCKCAT = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_MOSSTHORN = new FoodProperties.Builder().nutrition(1).saturationModifier(0.1F).effect(() -> new MobEffectInstance(MobEffects.POISON, 200, 1), 1.0F).build(); + public static final FoodProperties RAW_LOBSTER = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_SNOWFLAKE = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 150, 1), 1.0F).build(); + public static final FoodProperties RAW_EYELASH = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties UNUSUAL_FILLET = new FoodProperties.Builder().nutrition(3).saturationModifier(0.15F).build(); + public static final FoodProperties RAW_PICKLEFISH = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_AMBER_GOBY = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_BEAKED_HERRING = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_BLIND_SAILFIN = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_CIRCUS_FISH = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_COPPERFLAME_ANTHIAS = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_DEMON_HERRING = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_DROOPING_GOURAMI = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_DUALITY_DAMSELFISH = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_FORKFISH = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_HATCHETFISH = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_SNEEP_SNORP = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); + public static final FoodProperties RAW_TRIPLE_TWIRL_PLECO = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); // Cooked - public static final FoodProperties COOKED_AERO_MONO_STICK = new FoodProperties.Builder().nutrition(4).saturationMod(0.4F).fast().effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 150, 1), 1.0F).build(); - public static final FoodProperties COOKED_BLIZZARD_TUNA = new FoodProperties.Builder().nutrition(8).saturationMod(0.5F).build(); - public static final FoodProperties COOKED_MOSSTHORN = new FoodProperties.Builder().nutrition(7).saturationMod(0.3F).build(); - public static final FoodProperties COOKED_SHOCKCAT = new FoodProperties.Builder().nutrition(7).saturationMod(0.4F).build(); - public static final FoodProperties COOKED_LOBSTER = new FoodProperties.Builder().nutrition(7).saturationMod(0.4F).build(); - public static final FoodProperties COOKED_UNUSUAL_FILLET = new FoodProperties.Builder().nutrition(6).saturationMod(0.4F).build(); + public static final FoodProperties COOKED_AERO_MONO_STICK = new FoodProperties.Builder().nutrition(4).saturationModifier(0.4F).fast().effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 150, 1), 1.0F).build(); + public static final FoodProperties COOKED_BLIZZARD_TUNA = new FoodProperties.Builder().nutrition(8).saturationModifier(0.5F).build(); + public static final FoodProperties COOKED_MOSSTHORN = new FoodProperties.Builder().nutrition(7).saturationModifier(0.3F).build(); + public static final FoodProperties COOKED_SHOCKCAT = new FoodProperties.Builder().nutrition(7).saturationModifier(0.4F).build(); + public static final FoodProperties COOKED_LOBSTER = new FoodProperties.Builder().nutrition(7).saturationModifier(0.4F).build(); + public static final FoodProperties COOKED_UNUSUAL_FILLET = new FoodProperties.Builder().nutrition(6).saturationModifier(0.4F).build(); // Meals - public static final FoodProperties LOBSTER_ROLL = new FoodProperties.Builder().nutrition(10).saturationMod(0.8F).build(); - public static final FoodProperties ODD_FISHSTICKS = new FoodProperties.Builder().nutrition(8).saturationMod(0.5F).build(); - public static final FoodProperties PICKLEDISH = new FoodProperties.Builder().nutrition(8).saturationMod(0.4F).build(); - public static final FoodProperties STRANGE_BROTH = new FoodProperties.Builder().nutrition(12).saturationMod(0.85F).build(); - public static final FoodProperties UNUSUAL_SANDWICH = new FoodProperties.Builder().nutrition(14).saturationMod(0.7F).build(); - public static final FoodProperties WEIRD_GOLDFISH = new FoodProperties.Builder().nutrition(4).saturationMod(0.35F).fast().build(); + public static final FoodProperties LOBSTER_ROLL = new FoodProperties.Builder().nutrition(10).saturationModifier(0.8F).build(); + public static final FoodProperties ODD_FISHSTICKS = new FoodProperties.Builder().nutrition(8).saturationModifier(0.5F).build(); + public static final FoodProperties PICKLEDISH = new FoodProperties.Builder().nutrition(8).saturationModifier(0.4F).usingConvertsTo(Items.BOWL).build(); + public static final FoodProperties STRANGE_BROTH = new FoodProperties.Builder().nutrition(12).saturationModifier(0.85F).usingConvertsTo(Items.BOWL).build(); + public static final FoodProperties UNUSUAL_SANDWICH = new FoodProperties.Builder().nutrition(14).saturationModifier(0.7F).build(); + public static final FoodProperties WEIRD_GOLDFISH = new FoodProperties.Builder().nutrition(4).saturationModifier(0.35F).fast().build(); } diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java index f8b7c60..b8cee8b 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java @@ -1,195 +1,199 @@ -package codyhuh.unusualfishmod.core.registry; + package codyhuh.unusualfishmod.core.registry; -import codyhuh.unusualfishmod.UnusualFishMod; -import codyhuh.unusualfishmod.common.item.*; -import net.minecraft.ChatFormatting; -import net.minecraft.Util; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.*; -import net.minecraft.world.level.material.Fluids; -import net.minecraftforge.common.ForgeSpawnEggItem; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; + import codyhuh.unusualfishmod.UnusualFishMod; + import codyhuh.unusualfishmod.common.item.*; + import net.minecraft.ChatFormatting; + import net.minecraft.Util; + import net.minecraft.core.Holder; + import net.minecraft.core.component.DataComponents; + import net.minecraft.core.registries.BuiltInRegistries; + import net.minecraft.network.chat.Component; + import net.minecraft.resources.ResourceLocation; + import net.minecraft.world.item.*; + import net.minecraft.world.level.material.Fluids; + import net.neoforged.neoforge.registries.DeferredItem; + import net.neoforged.neoforge.registries.DeferredRegister; -import java.util.List; + import java.util.List; -public final class UFItems { - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, UnusualFishMod.MOD_ID); + import static codyhuh.unusualfishmod.UnusualFishMod.loc; - private static final ChatFormatting TITLE_FORMAT = ChatFormatting.GRAY; - private static final ChatFormatting DESCRIPTION_FORMAT = ChatFormatting.BLUE; - private static final Component ANCIENT_WEAPON_UPGRADE = Component.translatable(Util.makeDescriptionId("upgrade", new ResourceLocation(UnusualFishMod.MOD_ID, "ancient_weapon_upgrade"))).withStyle(TITLE_FORMAT); - private static final Component ANCIENT_WEAPON_APPLIES_TO = Component.translatable(Util.makeDescriptionId("item", new ResourceLocation(UnusualFishMod.MOD_ID, "smithing_template.ancient_weapon_parts.applies_to"))).withStyle(DESCRIPTION_FORMAT); - private static final Component ANCIENT_WEAPON_INGREDIENTS = Component.translatable(Util.makeDescriptionId("item", new ResourceLocation(UnusualFishMod.MOD_ID, "smithing_template.ancient_weapon_parts.ingredients"))).withStyle(DESCRIPTION_FORMAT); - private static final Component ANCIENT_WEAPON_BASE_SLOT_DESCRIPTION = Component.translatable(Util.makeDescriptionId("item", new ResourceLocation(UnusualFishMod.MOD_ID, "smithing_template.ancient_weapon_parts.base_slot_description"))); - private static final Component ANCIENT_WEAPON_ADDITIONS_SLOT_DESCRIPTION = Component.translatable(Util.makeDescriptionId("item", new ResourceLocation(UnusualFishMod.MOD_ID, "smithing_template.ancient_weapon_parts.additions_slot_description"))); - private static final ResourceLocation EMPTY_SLOT_WEAPON_PARTS = new ResourceLocation(UnusualFishMod.MOD_ID, "item/empty_slot_weapon_parts"); - private static final ResourceLocation EMPTY_SLOT_DEPTH_CLAW = new ResourceLocation(UnusualFishMod.MOD_ID, "item/empty_slot_depth_claw"); - private static final ResourceLocation EMPTY_SLOT_RIPPER_TOOTH = new ResourceLocation(UnusualFishMod.MOD_ID, "item/empty_slot_ripper_tooth"); + public final class UFItems { + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(UnusualFishMod.MOD_ID); - // Foods - public static final RegistryObject RAW_EYELASH = ITEMS.register("raw_eyelash", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_EYELASH))); - public static final RegistryObject RAW_SPINDLEFISH = ITEMS.register("raw_spindlefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SPINDLEFISH))); - public static final RegistryObject RAW_SNOWFLAKE = ITEMS.register("raw_snowflake", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SNOWFLAKE))); - public static final RegistryObject RAW_AERO_MONO = ITEMS.register("raw_aero_mono", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO))); - public static final RegistryObject RAW_PICKLEFSIH = ITEMS.register("raw_picklefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_PICKLEFISH))); - public static final RegistryObject RAW_AMBER_GOBY = ITEMS.register("raw_amber_goby", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AMBER_GOBY))); - public static final RegistryObject RAW_BEAKED_HERRING = ITEMS.register("raw_beaked_herring", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BEAKED_HERRING))); - public static final RegistryObject RAW_BLIND_SAILFIN = ITEMS.register("raw_blind_sailfin", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BLIND_SAILFIN))); - public static final RegistryObject RAW_CIRCUS_FISH = ITEMS.register("raw_circus_fish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_CIRCUS_FISH))); - public static final RegistryObject RAW_COPPERFLAME_ANTHIAS = ITEMS.register("raw_copperflame_anthias", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_COPPERFLAME_ANTHIAS))); - public static final RegistryObject RAW_DEMON_HERRING = ITEMS.register("raw_demon_herring", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DEMON_HERRING))); - public static final RegistryObject RAW_DROOPING_GOURAMI = ITEMS.register("raw_drooping_gourami", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DROOPING_GOURAMI))); - public static final RegistryObject RAW_DUALITY_DAMSELFISH = ITEMS.register("raw_duality_damselfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DUALITY_DAMSELFISH))); - public static final RegistryObject RAW_FORKFISH = ITEMS.register("raw_forkfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_FORKFISH))); - public static final RegistryObject RAW_HATCHETFISH = ITEMS.register("raw_hatchetfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_HATCHETFISH))); - public static final RegistryObject RAW_SNEEP_SNORP = ITEMS.register("raw_sneep_snorp", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SNEEP_SNORP))); - public static final RegistryObject RAW_TRIPLE_TWIRL_PLECO = ITEMS.register("raw_triple_twirl_pleco", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_TRIPLE_TWIRL_PLECO))); - //public static final RegistryObject UNUSUAL_FILLET = ITEMS.register("unusual_fillet", () -> new Item(new Item.Properties().food(UFFoodProperties.UNUSUAL_FILLET))); + private static final ChatFormatting TITLE_FORMAT = ChatFormatting.GRAY; + private static final ChatFormatting DESCRIPTION_FORMAT = ChatFormatting.BLUE; + private static final Component ANCIENT_WEAPON_UPGRADE = Component.translatable(Util.makeDescriptionId("upgrade", loc("ancient_weapon_upgrade"))).withStyle(TITLE_FORMAT); + private static final Component ANCIENT_WEAPON_APPLIES_TO = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.applies_to"))).withStyle(DESCRIPTION_FORMAT); + private static final Component ANCIENT_WEAPON_INGREDIENTS = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.ingredients"))).withStyle(DESCRIPTION_FORMAT); + private static final Component ANCIENT_WEAPON_BASE_SLOT_DESCRIPTION = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.base_slot_description"))); + private static final Component ANCIENT_WEAPON_ADDITIONS_SLOT_DESCRIPTION = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.additions_slot_description"))); + private static final ResourceLocation EMPTY_SLOT_WEAPON_PARTS = loc("item/empty_slot_weapon_parts"); + private static final ResourceLocation EMPTY_SLOT_DEPTH_CLAW = loc("item/empty_slot_depth_claw"); + private static final ResourceLocation EMPTY_SLOT_RIPPER_TOOTH = loc("item/empty_slot_ripper_tooth"); - public static final RegistryObject RAW_AERO_MONO_STICK = ITEMS.register("raw_aero_mono_stick", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO_STICK))); - public static final RegistryObject COOKED_AERO_MONO_STICK = ITEMS.register("cooked_aero_mono_stick", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_AERO_MONO_STICK))); - //public static final RegistryObject RAW_BUMPFACE = ITEMS.register("raw_bumpface", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BUMPFACE))); - public static final RegistryObject RAW_SAILOR_BARB = ITEMS.register("raw_sailor_barb", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SAILOR_BARB))); - public static final RegistryObject RAW_BARK_ANGELFISH = ITEMS.register("raw_bark_angelfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BARK_ANGELFISH))); - public static final RegistryObject RAW_BLIZZARD_TUNA = ITEMS.register("raw_blizzard_tuna", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BLIZZARD_TUNA))); - public static final RegistryObject COOKED_BLIZZARD_TUNA = ITEMS.register("cooked_blizzard_tuna", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_BLIZZARD_TUNA))); - public static final RegistryObject RAW_SHOCKCAT = ITEMS.register("raw_shockcat", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SHOCKCAT))); - public static final RegistryObject COOKED_SHOCKCAT = ITEMS.register("cooked_shockcat", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_SHOCKCAT))); - public static final RegistryObject RAW_LOBSTER = ITEMS.register("raw_lobster", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_LOBSTER))); - public static final RegistryObject COOKED_LOBSTER = ITEMS.register("cooked_lobster", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_LOBSTER))); - public static final RegistryObject RAW_MOSSTHORN = ITEMS.register("raw_mossthorn", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_MOSSTHORN))); - public static final RegistryObject COOKED_MOSSTHORN = ITEMS.register("cooked_mossthorn", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_MOSSTHORN))); - public static final RegistryObject COOKED_UNUSUAL_FILLET = ITEMS.register("cooked_unusual_fillet", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_UNUSUAL_FILLET))); - public static final RegistryObject LOBSTER_ROLL = ITEMS.register("lobster_roll", () -> new Item(new Item.Properties().food(UFFoodProperties.LOBSTER_ROLL))); - public static final RegistryObject ODD_FISHSTICKS = ITEMS.register("odd_fishsticks", () -> new Item(new Item.Properties().food(UFFoodProperties.ODD_FISHSTICKS))); - public static final RegistryObject PICKLEDISH = ITEMS.register("pickledish", () -> new BowlFoodItem(new Item.Properties().food(UFFoodProperties.PICKLEDISH).stacksTo(1))); - public static final RegistryObject STRANGE_BROTH = ITEMS.register("strange_broth", () -> new BowlFoodItem(new Item.Properties().food(UFFoodProperties.STRANGE_BROTH).stacksTo(1))); - public static final RegistryObject UNUSUAL_SANDWICH = ITEMS.register("unusual_sandwich", () -> new Item(new Item.Properties().food(UFFoodProperties.UNUSUAL_SANDWICH))); - public static final RegistryObject WEIRD_GOLDFISH = ITEMS.register("weird_goldfish", () -> new Item(new Item.Properties().food(UFFoodProperties.WEIRD_GOLDFISH))); + // Foods + public static final DeferredItem RAW_EYELASH = ITEMS.register("raw_eyelash", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_EYELASH))); + public static final DeferredItem RAW_SPINDLEFISH = ITEMS.register("raw_spindlefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SPINDLEFISH))); + public static final DeferredItem RAW_SNOWFLAKE = ITEMS.register("raw_snowflake", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SNOWFLAKE))); + public static final DeferredItem RAW_AERO_MONO = ITEMS.register("raw_aero_mono", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO))); + public static final DeferredItem RAW_PICKLEFSIH = ITEMS.register("raw_picklefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_PICKLEFISH))); + public static final DeferredItem RAW_AMBER_GOBY = ITEMS.register("raw_amber_goby", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AMBER_GOBY))); + public static final DeferredItem RAW_BEAKED_HERRING = ITEMS.register("raw_beaked_herring", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BEAKED_HERRING))); + public static final DeferredItem RAW_BLIND_SAILFIN = ITEMS.register("raw_blind_sailfin", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BLIND_SAILFIN))); + public static final DeferredItem RAW_CIRCUS_FISH = ITEMS.register("raw_circus_fish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_CIRCUS_FISH))); + public static final DeferredItem RAW_COPPERFLAME_ANTHIAS = ITEMS.register("raw_copperflame_anthias", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_COPPERFLAME_ANTHIAS))); + public static final DeferredItem RAW_DEMON_HERRING = ITEMS.register("raw_demon_herring", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DEMON_HERRING))); + public static final DeferredItem RAW_DROOPING_GOURAMI = ITEMS.register("raw_drooping_gourami", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DROOPING_GOURAMI))); + public static final DeferredItem RAW_DUALITY_DAMSELFISH = ITEMS.register("raw_duality_damselfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DUALITY_DAMSELFISH))); + public static final DeferredItem RAW_FORKFISH = ITEMS.register("raw_forkfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_FORKFISH))); + public static final DeferredItem RAW_HATCHETFISH = ITEMS.register("raw_hatchetfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_HATCHETFISH))); + public static final DeferredItem RAW_SNEEP_SNORP = ITEMS.register("raw_sneep_snorp", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SNEEP_SNORP))); + public static final DeferredItem RAW_TRIPLE_TWIRL_PLECO = ITEMS.register("raw_triple_twirl_pleco", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_TRIPLE_TWIRL_PLECO))); + //public static final DeferredItem UNUSUAL_FILLET = ITEMS.register("unusual_fillet", () -> new Item(new Item.Properties().food(UFFoodProperties.UNUSUAL_FILLET))); - // Drops - public static final RegistryObject TENDRIL = ITEMS.register("tendril", () -> new Item(new Item.Properties())); - public static final RegistryObject RIPPER_TOOTH = ITEMS.register("ripper_tooth", () -> new Item(new Item.Properties())); - public static final RegistryObject LOBSTER_SPIKE = ITEMS.register("lobster_spike", () -> new Item(new Item.Properties())); - public static final RegistryObject RELUCENT_SHARD = ITEMS.register("relucent_shard", () -> new Item(new Item.Properties())); - public static final RegistryObject CRIMSON_SHARD = ITEMS.register("crimson_shard", () -> new Item(new Item.Properties())); - public static final RegistryObject DEPTH_CLAW = ITEMS.register("depth_claw", () -> new Item(new Item.Properties())); + public static final DeferredItem RAW_AERO_MONO_STICK = ITEMS.register("raw_aero_mono_stick", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO_STICK))); + public static final DeferredItem COOKED_AERO_MONO_STICK = ITEMS.register("cooked_aero_mono_stick", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_AERO_MONO_STICK))); + //public static final DeferredItem RAW_BUMPFACE = ITEMS.register("raw_bumpface", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BUMPFACE))); + public static final DeferredItem RAW_SAILOR_BARB = ITEMS.register("raw_sailor_barb", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SAILOR_BARB))); + public static final DeferredItem RAW_BARK_ANGELFISH = ITEMS.register("raw_bark_angelfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BARK_ANGELFISH))); + public static final DeferredItem RAW_BLIZZARD_TUNA = ITEMS.register("raw_blizzard_tuna", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BLIZZARD_TUNA))); + public static final DeferredItem COOKED_BLIZZARD_TUNA = ITEMS.register("cooked_blizzard_tuna", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_BLIZZARD_TUNA))); + public static final DeferredItem RAW_SHOCKCAT = ITEMS.register("raw_shockcat", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SHOCKCAT))); + public static final DeferredItem COOKED_SHOCKCAT = ITEMS.register("cooked_shockcat", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_SHOCKCAT))); + public static final DeferredItem RAW_LOBSTER = ITEMS.register("raw_lobster", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_LOBSTER))); + public static final DeferredItem COOKED_LOBSTER = ITEMS.register("cooked_lobster", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_LOBSTER))); + public static final DeferredItem RAW_MOSSTHORN = ITEMS.register("raw_mossthorn", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_MOSSTHORN))); + public static final DeferredItem COOKED_MOSSTHORN = ITEMS.register("cooked_mossthorn", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_MOSSTHORN))); + public static final DeferredItem COOKED_UNUSUAL_FILLET = ITEMS.register("cooked_unusual_fillet", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_UNUSUAL_FILLET))); + public static final DeferredItem LOBSTER_ROLL = ITEMS.register("lobster_roll", () -> new Item(new Item.Properties().food(UFFoodProperties.LOBSTER_ROLL))); + public static final DeferredItem ODD_FISHSTICKS = ITEMS.register("odd_fishsticks", () -> new Item(new Item.Properties().food(UFFoodProperties.ODD_FISHSTICKS))); + public static final DeferredItem PICKLEDISH = ITEMS.register("pickledish", () -> new Item(new Item.Properties().food(UFFoodProperties.PICKLEDISH).stacksTo(1))); + public static final DeferredItem STRANGE_BROTH = ITEMS.register("strange_broth", () -> new Item(new Item.Properties().food(UFFoodProperties.STRANGE_BROTH).stacksTo(1))); + public static final DeferredItem UNUSUAL_SANDWICH = ITEMS.register("unusual_sandwich", () -> new Item(new Item.Properties().food(UFFoodProperties.UNUSUAL_SANDWICH))); + public static final DeferredItem WEIRD_GOLDFISH = ITEMS.register("weird_goldfish", () -> new Item(new Item.Properties().food(UFFoodProperties.WEIRD_GOLDFISH))); - // Gear - public static final RegistryObject DEPTH_SCYTHE = ITEMS.register("depth_scythe", () -> new DepthScytheItem(Tiers.DIAMOND, 3, -2.4F, new Item.Properties().durability(600))); - public static final RegistryObject RIPSAW = ITEMS.register("ripsaw", () -> new RipsawItem(new Item.Properties().stacksTo(1))); - public static final RegistryObject FLUVIAL_SHELL = ITEMS.register("fluvial_shell", () -> new WeatherShellItem("rain", new Item.Properties().stacksTo(1).durability(1))); - public static final RegistryObject CLEMENT_SHELL = ITEMS.register("clement_shell", () -> new WeatherShellItem("clear", new Item.Properties().stacksTo(1).durability(1))); - public static final RegistryObject THUNDEROUS_SHELL = ITEMS.register("thunderous_shell", () -> new WeatherShellItem("thunder", new Item.Properties().stacksTo(1).durability(1))); - public static final RegistryObject PRISMARINE_SPEAR = ITEMS.register("prismarine_spear", () -> new PrismarineSpearItem(new Item.Properties().stacksTo(1).durability(100))); - public static final RegistryObject WEAPON_PARTS = ITEMS.register("weapon_parts", () -> new Item(new Item.Properties())); - public static final RegistryObject ANCIENT_WEAPON_SMITHING_TEMPLATE = ITEMS.register("ancient_weapon_smithing_template", () -> new SmithingTemplateItem(ANCIENT_WEAPON_APPLIES_TO, ANCIENT_WEAPON_INGREDIENTS, ANCIENT_WEAPON_UPGRADE, ANCIENT_WEAPON_ADDITIONS_SLOT_DESCRIPTION, ANCIENT_WEAPON_BASE_SLOT_DESCRIPTION, List.of(EMPTY_SLOT_WEAPON_PARTS), List.of(EMPTY_SLOT_DEPTH_CLAW, EMPTY_SLOT_RIPPER_TOOTH))); - public static final RegistryObject MUSIC_DISC_SEAFOAM = ITEMS.register("music_disc_seafoam", () -> new RecordItem(1, UFSounds.MUSIC_DISC_SEAFOAM, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 155 * 20)); - //public static final RegistryObject STARGAZER = ITEMS.register("stargazer", () -> new StargazerItem(new Item.Properties().tab(UnusualFishMod.UNUSUAL_TAB).stacksTo(1))); + // Drops + public static final DeferredItem TENDRIL = ITEMS.register("tendril", () -> new Item(new Item.Properties())); + public static final DeferredItem RIPPER_TOOTH = ITEMS.register("ripper_tooth", () -> new Item(new Item.Properties())); + public static final DeferredItem LOBSTER_SPIKE = ITEMS.register("lobster_spike", () -> new Item(new Item.Properties())); + public static final DeferredItem RELUCENT_SHARD = ITEMS.register("relucent_shard", () -> new Item(new Item.Properties())); + public static final DeferredItem CRIMSON_SHARD = ITEMS.register("crimson_shard", () -> new Item(new Item.Properties())); + public static final DeferredItem DEPTH_CLAW = ITEMS.register("depth_claw", () -> new Item(new Item.Properties())); - // Buckets - public static final RegistryObject AERO_MONO_BUCKET = ITEMS.register("aero_mono_bucket", () -> new UFFishBucketItem(UFEntities.AERO_MONO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - //public static final RegistryObject RHINO_TETRA_BUCKET = ITEMS.register("rhino_tetra_bucket", () -> new UFFishBucketItem(UFEntities.RHINO_TETRA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject DUALITY_DAMSELFISH_BUCKET = ITEMS.register("duality_damselfish_bucket", () -> new UFFishBucketItem(UFEntities.DUALITY_DAMSELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject DROOPING_GOURAMI_BUCKET = ITEMS.register("drooping_gourami_bucket", () -> new UFFishBucketItem(UFEntities.DROOPING_GOURAMI, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject MOSSTHORN_BUCKET = ITEMS.register("mossthorn_bucket", () -> new UFFishBucketItem(UFEntities.MOSSTHORN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SAILOR_BARB_BUCKET = ITEMS.register("sailor_barb_bucket", () -> new UFFishBucketItem(UFEntities.SAILOR_BARB, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject TRIPLE_TWIRL_PLECO_BUCKET = ITEMS.register("triple_twirl_pleco_bucket", () -> new UFFishBucketItem(UFEntities.TRIPLE_TWIRL_PLECO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SPINDLEFISH_BUCKET = ITEMS.register("spindlefish_bucket", () -> new UFFishBucketItem(UFEntities.SPINDLEFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject RIPPER_BUCKET = ITEMS.register("ripper_bucket", () -> new UFFishBucketItem(UFEntities.RIPPER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SEA_SPIDER_BUCKET = ITEMS.register("sea_spider_bucket", () -> new UFFishBucketItem(UFEntities.SEA_SPIDER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject CLOWNTHORN_SHARK_BUCKET = ITEMS.register("clownthorn_shark_bucket", () -> new UFFishBucketItem(UFEntities.CLOWNTHORN_SHARK, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SNEEPSNORP_BUCKET = ITEMS.register("sneepsnorp_bucket", () -> new UFFishBucketItem(UFEntities.SNEEPSNORP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject BLACKCAP_SNAIL_BUCKET = ITEMS.register("blackcap_snail_bucket", () -> new UFFishBucketItem(UFEntities.BLACKCAP_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject BRICK_SNAIL_BUCKET = ITEMS.register("brick_snail_bucket", () -> new UFFishBucketItem(UFEntities.BRICK_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject DEEP_CRAWLER_BUCKET = ITEMS.register("deep_crawler_bucket", () -> new UFFishBucketItem(UFEntities.DEEP_CRAWLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject WIZARD_JELLY_BUCKET = ITEMS.register("wizard_jelly_bucket", () -> new UFFishBucketItem(UFEntities.WIZARD_JELLY, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject PORCUPINE_LOBSTA_BUCKET = ITEMS.register("porcupine_lobsta_bucket", () -> new UFFishBucketItem(UFEntities.PORCUPINE_LOBSTA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject FRESHWATER_MANTIS_BUCKET = ITEMS.register("freshwater_mantis_bucket", () -> new UFFishBucketItem(UFEntities.FRESHWATER_MANTIS, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject BARK_ANGELFISH_BUCKET = ITEMS.register("bark_angelfish_bucket", () -> new UFFishBucketItem(UFEntities.BARK_ANGELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SKIPPER_BUCKET = ITEMS.register("lobed_skipper_bucket", () -> new UFFishBucketItem(UFEntities.LOBED_SKIPPER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject BEAKED_HERRING_BUCKET = ITEMS.register("beaked_herring_bucket", () -> new UFFishBucketItem(UFEntities.BEAKED_HERRING, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject PICKLEFISH_BUCKET = ITEMS.register("picklefish_bucket", () -> new UFFishBucketItem(UFEntities.PICKLEFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject BLIND_SAILFIN_BUCKET = ITEMS.register("blind_sailfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIND_SAILFIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject DEMON_HERRING_BUCKET = ITEMS.register("demon_herring_bucket", () -> new UFFishBucketItem(UFEntities.DEMON_HERRING, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject AMBER_GOBY_BUCKET = ITEMS.register("amber_goby_bucket", () -> new UFFishBucketItem(UFEntities.AMBER_GOBY, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject HATCHET_FISH_BUCKET = ITEMS.register("hatchet_fish_bucket", () -> new UFFishBucketItem(UFEntities.HATCHET_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject COPPERFLAME_BUCKET = ITEMS.register("copperflame_bucket", () -> new UFFishBucketItem(UFEntities.COPPERFLAME, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SQUODDLE_BUCKET = ITEMS.register("squoddle_bucket", () -> new UFFishBucketItem(UFEntities.SQUODDLE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SEA_MOSQUITO_BUCKET = ITEMS.register("sea_mosquito_bucket", () -> new UFFishBucketItem(UFEntities.SEA_MOSQUITO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject FORKFISH_BUCKET = ITEMS.register("forkfish_bucket", () -> new UFFishBucketItem(UFEntities.FORKFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SPOON_SHARK_BUCKET = ITEMS.register("spoon_shark_bucket", () -> new UFFishBucketItem(UFEntities.SPOON_SHARK, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject CORAL_SKRIMP_BUCKET = ITEMS.register("coral_skrimp_bucket", () -> new UFFishBucketItem(UFEntities.CORAL_SKRIMP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject CIRCUS_FISH_BUCKET = ITEMS.register("circus_fish_bucket", () -> new UFFishBucketItem(UFEntities.CIRCUS_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject EYELASH_FISH_BUCKET = ITEMS.register("eyelash_fish_bucket", () -> new UFFishBucketItem(UFEntities.EYELASH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SNOWFLAKE_TAIL_FISH_BUCKET = ITEMS.register("snowflake_tail_fish_bucket", () -> new UFFishBucketItem(UFEntities.SNOWFLAKE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject CRIMSONSHELL_SQUID_BUCKET = ITEMS.register("crimsonshell_squid_bucket", () -> new UFFishBucketItem(UFEntities.CRIMSONSHELL_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject VOLT_ANGLER_BUCKET = ITEMS.register("volt_angler_bucket", () -> new UFFishBucketItem(UFEntities.VOLT_ANGLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject BLIZZARDFIN_BUCKET = ITEMS.register("blizzardfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIZZARDFIN_TUNA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject MUDDYTOP_SNAIL_BUCKET = ITEMS.register("muddytop_snail_bucket", () -> new UFFishBucketItem(UFEntities.MUDDYTOP_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject SHOCKCAT_BUCKET = ITEMS.register("shockcat_bucket", () -> new UFFishBucketItem(UFEntities.SHOCKCAT, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject PINKFIN_IDOL_BUCKET = ITEMS.register("pinkfin_idol_bucket", () -> new UFFishBucketItem(UFEntities.PINKFIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject TIGER_PUFFER_BUCKET = ITEMS.register("tiger_puffer_bucket", () -> new UFFishBucketItem(UFEntities.TIGER_PUFFER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject STOUT_BICHIR_BUCKET = ITEMS.register("stout_bichir_bucket", () -> new UFFishBucketItem(UFEntities.STOUT_BICHIR, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject TRIBBLE_BUCKET = ITEMS.register("tribble_bucket", () -> new UFFishBucketItem(UFEntities.TRIBBLE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final RegistryObject TRUMPET_SQUID_BUCKET = ITEMS.register("trumpet_squid_bucket", () -> new UFFishBucketItem(UFEntities.TRUMPET_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + // Gear + public static final DeferredItem DEPTH_SCYTHE = ITEMS.register("depth_scythe", () -> new DepthScytheItem(Tiers.DIAMOND, new Item.Properties().durability(600).attributes(SwordItem.createAttributes(Tiers.DIAMOND, 3, -2.4F)))); + public static final DeferredItem RIPSAW = ITEMS.register("ripsaw", () -> new RipsawItem(new Item.Properties().stacksTo(1).attributes(AxeItem.createAttributes(UFTiers.RIPPER_SAW, 7.0F, -1.0F)))); + public static final DeferredItem FLUVIAL_SHELL = ITEMS.register("fluvial_shell", () -> new WeatherShellItem("rain", new Item.Properties().stacksTo(1).durability(1))); + public static final DeferredItem CLEMENT_SHELL = ITEMS.register("clement_shell", () -> new WeatherShellItem("clear", new Item.Properties().stacksTo(1).durability(1))); + public static final DeferredItem THUNDEROUS_SHELL = ITEMS.register("thunderous_shell", () -> new WeatherShellItem("thunder", new Item.Properties().stacksTo(1).durability(1))); + public static final DeferredItem PRISMARINE_SPEAR = ITEMS.register("prismarine_spear", () -> new PrismarineSpearItem(new Item.Properties().stacksTo(1).durability(100))); + public static final DeferredItem WEAPON_PARTS = ITEMS.register("weapon_parts", () -> new Item(new Item.Properties())); + public static final DeferredItem ANCIENT_WEAPON_SMITHING_TEMPLATE = ITEMS.register("ancient_weapon_smithing_template", () -> new SmithingTemplateItem(ANCIENT_WEAPON_APPLIES_TO, ANCIENT_WEAPON_INGREDIENTS, ANCIENT_WEAPON_UPGRADE, ANCIENT_WEAPON_ADDITIONS_SLOT_DESCRIPTION, ANCIENT_WEAPON_BASE_SLOT_DESCRIPTION, List.of(EMPTY_SLOT_WEAPON_PARTS), List.of(EMPTY_SLOT_DEPTH_CLAW, EMPTY_SLOT_RIPPER_TOOTH))); + public static final DeferredItem MUSIC_DISC_SEAFOAM = ITEMS.register("music_disc_seafoam", () -> new Item(new Item.Properties().component(DataComponents.JUKEBOX_PLAYABLE, new JukeboxPlayable(new EitherHolder<>(UFSounds.SEAFOAM_SONG), true)).stacksTo(1).rarity(Rarity.RARE))); + //public static final DeferredItem STARGAZER = ITEMS.register("stargazer", () -> new StargazerItem(new Item.Properties().tab(UnusualFishMod.UNUSUAL_TAB).stacksTo(1))); - // Spawn Eggs - public static final RegistryObject AERO_MONO_SPAWN_EGG = ITEMS.register("aero_mono_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.AERO_MONO, 0x8ca8b5, 0x506884, new Item.Properties())); - public static final RegistryObject PINKFIN_SPAWN_EGG = ITEMS.register("pinkfin_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.PINKFIN, 0x0e011e, 0x421054, new Item.Properties())); - public static final RegistryObject BARBED_SPAWN_EGG = ITEMS.register("roughback_guitarfish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.ROUGHBACK, 0x5e5d4f, 0x92998e, new Item.Properties())); - public static final RegistryObject CLOWNTHORN_SPAWN_EGG = ITEMS.register("clownthorn_shark_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.CLOWNTHORN_SHARK, 0xbe5515, 0xa21e00, new Item.Properties())); - public static final RegistryObject DUALITY_SPAWN_EGG = ITEMS.register("duality_damselfish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.DUALITY_DAMSELFISH, 0x8a94a1, 0x2c3338, new Item.Properties())); - public static final RegistryObject DROOPING_GOURAMI_SPAWN_EGG = ITEMS.register("drooping_gourami_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.DROOPING_GOURAMI, 0x54434d, 0x363243, new Item.Properties())); - public static final RegistryObject MOSSTHORN_SPAWN_EGG = ITEMS.register("mossthorn_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.MOSSTHORN, 0x26a529, 0x034223, new Item.Properties())); - public static final RegistryObject RHINO_TETRA_SPAWN_EGG = ITEMS.register("rhino_tetra_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.RHINO_TETRA, 0x919187, 0x7b2726, new Item.Properties())); - public static final RegistryObject RIPPER_SPAWN_EGG = ITEMS.register("ripper_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.RIPPER, 0x565950, 0x8f9386, new Item.Properties())); - public static final RegistryObject SAILOR_BARB_PAWN_EGG = ITEMS.register("sailor_barb_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SAILOR_BARB, 0x5e6a25, 0xa1a68c, new Item.Properties())); - public static final RegistryObject SEA_PANCAKE_SPAWN_EGG = ITEMS.register("sea_pancake_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SEA_PANCAKE, 0xbda877, 0xdfcbb7, new Item.Properties())); - public static final RegistryObject SEA_SPIDER_SPAWN_EGG = ITEMS.register("sea_spider_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SEA_SPIDER, 0x774128, 0xaf7834, new Item.Properties())); - public static final RegistryObject SPINDLEFISH_SPAWN_EGG = ITEMS.register("spindlefish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SPINDLEFISH, 0x8e2573, 0xc14aeb, new Item.Properties())); - public static final RegistryObject TRIPLE_TWIRL_PLECO_SPAWN_EGG = ITEMS.register("triple_twirl_pleco_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.TRIPLE_TWIRL_PLECO, 0xc1923a, 0x903113, new Item.Properties())); - public static final RegistryObject BRICK_SNAIL_SPAWN_EGG = ITEMS.register("brick_snail_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.BRICK_SNAIL, 0xb5553b, 0x674f17, new Item.Properties())); - public static final RegistryObject ZEBRA_CORNETFISH_SPAWN_EGG = ITEMS.register("zebra_cornetfish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.ZEBRA_CORNETFISH , 0x153957, 0xc7ad0d, new Item.Properties())); - public static final RegistryObject TIGER_PUFFER_SPAWN_EGG = ITEMS.register("tiger_puffer_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.TIGER_PUFFER, 0x622814, 0x84736f, new Item.Properties())); - public static final RegistryObject BLACKCAP_SNAIL_SPAWN_EGG = ITEMS.register("blackcap_snail_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.BLACKCAP_SNAIL, 0x262917, 0x4c3d27, new Item.Properties())); - public static final RegistryObject SNEEPSNORP_EGG = ITEMS.register("sneepsnorp_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SNEEPSNORP, 0x3347a7, 0xce8a24, new Item.Properties())); - public static final RegistryObject DEEP_CRAWLER_SPAWN_EGG = ITEMS.register("deep_crawler_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.DEEP_CRAWLER, 0x536761, 0x34363f, new Item.Properties())); - public static final RegistryObject WIZARD_JELLY_SPAWN_EGG = ITEMS.register("wizard_jelly_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.WIZARD_JELLY, 0x5550b4, 0x3aa8d7, new Item.Properties())); - public static final RegistryObject PORCUPINE_LOBSTA_SPAWN_EGG = ITEMS.register("porcupine_lobsta_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.PORCUPINE_LOBSTA, 0x624736, 0x9e521b, new Item.Properties())); - public static final RegistryObject TRUMPET_SQUID_SPAWN_EGG = ITEMS.register("trumpet_squid_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.TRUMPET_SQUID, 0xe8d26a, 0xc6a042, new Item.Properties())); - public static final RegistryObject FRESHWATER_MANTIS_EGG = ITEMS.register("freshwater_mantis_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.FRESHWATER_MANTIS, 0x454629, 0x94ab67, new Item.Properties())); - public static final RegistryObject BARK_ANGELFISH_SPAWN_EGG = ITEMS.register("bark_angelfish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.BARK_ANGELFISH, 0x553f1a, 0x35270a, new Item.Properties())); - public static final RegistryObject SHOCKCAT_SPAWN_EGG = ITEMS.register("shockcat_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SHOCKCAT, 0x34294f, 0x255f9b, new Item.Properties())); - public static final RegistryObject MUDDYTOP_SNAIL_SPAWN_EGG = ITEMS.register("muddytop_snail_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.MUDDYTOP_SNAIL, 0x23100e, 0x5f4d3b, new Item.Properties())); - public static final RegistryObject KALAPPA_SPAWN_EGG = ITEMS.register("kalappa_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.KALAPPA, 0x624051, 0x886d86, new Item.Properties())); - public static final RegistryObject LOBED_SKIPPER_SPAWN_EGG = ITEMS.register("lobed_skipper_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.LOBED_SKIPPER, 0x4b2618, 0x9e632f, new Item.Properties())); - public static final RegistryObject STOUT_BICHIR_SPAWN_EGG = ITEMS.register("stout_bichir_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.STOUT_BICHIR, 0x5a5e3d, 0xb08f33, new Item.Properties())); - public static final RegistryObject BEAKED_HERRING_SPAWN_EGG = ITEMS.register("beaked_herring_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.BEAKED_HERRING, 0x8bacc4, 0xc5d0cf, new Item.Properties())); - public static final RegistryObject PICKLEFISH_SPAWN_EGG = ITEMS.register("picklefish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.PICKLEFISH, 0x235806, 0xd0cd07, new Item.Properties())); - public static final RegistryObject BLIND_SAILFIN_SPAWN_EGG = ITEMS.register("blind_sailfin_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.BLIND_SAILFIN, 0xdcccc3, 0xc19c8e, new Item.Properties())); - public static final RegistryObject DEMON_HERRING_SPAWN_EGG = ITEMS.register("demon_herring_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.DEMON_HERRING, 0x363243, 0xef7930, new Item.Properties())); - public static final RegistryObject AMBER_GOBY_SPAWN_EGG = ITEMS.register("amber_goby_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.AMBER_GOBY, 0xfb912e, 0xae5e2c, new Item.Properties())); - public static final RegistryObject HATCHET_FISH_SPAWN_EGG = ITEMS.register("hatchet_fish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.HATCHET_FISH, 0x0b0b26, 0x7d3283, new Item.Properties())); - public static final RegistryObject COPPERFLAME_SPAWN_EGG = ITEMS.register("copperflame_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.COPPERFLAME, 0x4fab90, 0x7fcf90, new Item.Properties())); - public static final RegistryObject ROOTBALL_SPAWN_EGG = ITEMS.register("root_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.ROOTBALL, 0x647233, 0xad7d65, new Item.Properties())); - public static final RegistryObject CELESTIAL_FISH_SPAWN_EGG = ITEMS.register("celestial_fish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.CELESTIAL_FISH, 0x6876a2, 0xe2e4c5, new Item.Properties())); - public static final RegistryObject GNASHER_SPAWN_EGG = ITEMS.register("gnasher_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.GNASHER, 0x323232, 0x465bb2, new Item.Properties())); - public static final RegistryObject PRAWN_SPAWN_EGG = ITEMS.register("prawn_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.PRAWN, 0x5a579e, 0x4694d1, new Item.Properties())); - public static final RegistryObject SQUODDLE_SPAWN_EGG = ITEMS.register("squoddle_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SQUODDLE, 0xb37817, 0xe58a2e, new Item.Properties())); - public static final RegistryObject SEA_MOSQUITO_SPAWN_EGG = ITEMS.register("sea_mosquito_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SEA_MOSQUITO, 0x326934, 0x6c122f, new Item.Properties())); - public static final RegistryObject FORKFISH_SPAWN_EGG = ITEMS.register("forkfish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.FORKFISH, 0x8e882c, 0x3dbba0, new Item.Properties())); - public static final RegistryObject SPOON_SHARK_SPAWN_EGG = ITEMS.register("spoon_shark_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SPOON_SHARK, 0xddbd78, 0xb3925b, new Item.Properties())); - public static final RegistryObject CORAL_SKRIMP_EGG = ITEMS.register("coral_skrimp_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.CORAL_SKRIMP, 0x5a0e7a, 0xb34aa2, new Item.Properties())); - public static final RegistryObject CIRCUS_FISH_SPAWN_EGG = ITEMS.register("circus_fish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.CIRCUS_FISH, 0xab4b36, 0xc88f62, new Item.Properties())); - public static final RegistryObject BLIZZARDFIN_SPAWN_EGG = ITEMS.register("blizzardfin_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.BLIZZARDFIN_TUNA, 0x9ed7dc, 0x6182a6, new Item.Properties())); - public static final RegistryObject EYELASH_FISH_SPAWN_EGG = ITEMS.register("eyelash_fish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.EYELASH, 0xb7b7ba, 0xfcfcfa, new Item.Properties())); - public static final RegistryObject SNOWFLAKE_TAIL_FISH_SPAWN_EGG = ITEMS.register("snowflake_tail_fish_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.SNOWFLAKE, 0x649ccc, 0xcbe8e6, new Item.Properties())); - public static final RegistryObject TIGER_JUNGLE_SHARK_SPAWN_EGG = ITEMS.register("tiger_jungle_shark_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.TIGER_JUNGLE_SHARK, 0x272530, 0xa5a8c6, new Item.Properties())); - public static final RegistryObject CRIMSONSHELL_SQUID_SPAWN_EGG = ITEMS.register("crimsonshell_squid_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.CRIMSONSHELL_SQUID, 0xab101c, 0x432c39, new Item.Properties())); - public static final RegistryObject VOLT_ANGLER_SPAWN_EGG = ITEMS.register("volt_angler_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.VOLT_ANGLER, 0x2d4035, 0x509033, new Item.Properties())); - public static final RegistryObject TRIBBLE_SPAWN_EGG = ITEMS.register("tribble_spawn_egg", () -> new ForgeSpawnEggItem(UFEntities.TRIBBLE, 0x656f26, 0x46491a, new Item.Properties())); -} + + // Buckets + public static final DeferredItem AERO_MONO_BUCKET = ITEMS.register("aero_mono_bucket", () -> new UFFishBucketItem(UFEntities.AERO_MONO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + //public static final DeferredItem RHINO_TETRA_BUCKET = ITEMS.register("rhino_tetra_bucket", () -> new UFFishBucketItem(UFEntities.RHINO_TETRA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem DUALITY_DAMSELFISH_BUCKET = ITEMS.register("duality_damselfish_bucket", () -> new UFFishBucketItem(UFEntities.DUALITY_DAMSELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem DROOPING_GOURAMI_BUCKET = ITEMS.register("drooping_gourami_bucket", () -> new UFFishBucketItem(UFEntities.DROOPING_GOURAMI, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem MOSSTHORN_BUCKET = ITEMS.register("mossthorn_bucket", () -> new UFFishBucketItem(UFEntities.MOSSTHORN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SAILOR_BARB_BUCKET = ITEMS.register("sailor_barb_bucket", () -> new UFFishBucketItem(UFEntities.SAILOR_BARB, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem TRIPLE_TWIRL_PLECO_BUCKET = ITEMS.register("triple_twirl_pleco_bucket", () -> new UFFishBucketItem(UFEntities.TRIPLE_TWIRL_PLECO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SPINDLEFISH_BUCKET = ITEMS.register("spindlefish_bucket", () -> new UFFishBucketItem(UFEntities.SPINDLEFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem RIPPER_BUCKET = ITEMS.register("ripper_bucket", () -> new UFFishBucketItem(UFEntities.RIPPER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SEA_SPIDER_BUCKET = ITEMS.register("sea_spider_bucket", () -> new UFFishBucketItem(UFEntities.SEA_SPIDER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem CLOWNTHORN_SHARK_BUCKET = ITEMS.register("clownthorn_shark_bucket", () -> new UFFishBucketItem(UFEntities.CLOWNTHORN_SHARK, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SNEEPSNORP_BUCKET = ITEMS.register("sneepsnorp_bucket", () -> new UFFishBucketItem(UFEntities.SNEEPSNORP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BLACKCAP_SNAIL_BUCKET = ITEMS.register("blackcap_snail_bucket", () -> new UFFishBucketItem(UFEntities.BLACKCAP_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BRICK_SNAIL_BUCKET = ITEMS.register("brick_snail_bucket", () -> new UFFishBucketItem(UFEntities.BRICK_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem DEEP_CRAWLER_BUCKET = ITEMS.register("deep_crawler_bucket", () -> new UFFishBucketItem(UFEntities.DEEP_CRAWLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem WIZARD_JELLY_BUCKET = ITEMS.register("wizard_jelly_bucket", () -> new UFFishBucketItem(UFEntities.WIZARD_JELLY, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem PORCUPINE_LOBSTA_BUCKET = ITEMS.register("porcupine_lobsta_bucket", () -> new UFFishBucketItem(UFEntities.PORCUPINE_LOBSTA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem FRESHWATER_MANTIS_BUCKET = ITEMS.register("freshwater_mantis_bucket", () -> new UFFishBucketItem(UFEntities.FRESHWATER_MANTIS, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BARK_ANGELFISH_BUCKET = ITEMS.register("bark_angelfish_bucket", () -> new UFFishBucketItem(UFEntities.BARK_ANGELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SKIPPER_BUCKET = ITEMS.register("lobed_skipper_bucket", () -> new UFFishBucketItem(UFEntities.LOBED_SKIPPER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BEAKED_HERRING_BUCKET = ITEMS.register("beaked_herring_bucket", () -> new UFFishBucketItem(UFEntities.BEAKED_HERRING, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem PICKLEFISH_BUCKET = ITEMS.register("picklefish_bucket", () -> new UFFishBucketItem(UFEntities.PICKLEFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BLIND_SAILFIN_BUCKET = ITEMS.register("blind_sailfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIND_SAILFIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem DEMON_HERRING_BUCKET = ITEMS.register("demon_herring_bucket", () -> new UFFishBucketItem(UFEntities.DEMON_HERRING, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem AMBER_GOBY_BUCKET = ITEMS.register("amber_goby_bucket", () -> new UFFishBucketItem(UFEntities.AMBER_GOBY, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem HATCHET_FISH_BUCKET = ITEMS.register("hatchet_fish_bucket", () -> new UFFishBucketItem(UFEntities.HATCHET_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem COPPERFLAME_BUCKET = ITEMS.register("copperflame_bucket", () -> new UFFishBucketItem(UFEntities.COPPERFLAME, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SQUODDLE_BUCKET = ITEMS.register("squoddle_bucket", () -> new UFFishBucketItem(UFEntities.SQUODDLE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SEA_MOSQUITO_BUCKET = ITEMS.register("sea_mosquito_bucket", () -> new UFFishBucketItem(UFEntities.SEA_MOSQUITO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem FORKFISH_BUCKET = ITEMS.register("forkfish_bucket", () -> new UFFishBucketItem(UFEntities.FORKFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SPOON_SHARK_BUCKET = ITEMS.register("spoon_shark_bucket", () -> new UFFishBucketItem(UFEntities.SPOON_SHARK, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem CORAL_SKRIMP_BUCKET = ITEMS.register("coral_skrimp_bucket", () -> new UFFishBucketItem(UFEntities.CORAL_SKRIMP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem CIRCUS_FISH_BUCKET = ITEMS.register("circus_fish_bucket", () -> new UFFishBucketItem(UFEntities.CIRCUS_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem EYELASH_FISH_BUCKET = ITEMS.register("eyelash_fish_bucket", () -> new UFFishBucketItem(UFEntities.EYELASH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SNOWFLAKE_TAIL_FISH_BUCKET = ITEMS.register("snowflake_tail_fish_bucket", () -> new UFFishBucketItem(UFEntities.SNOWFLAKE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem CRIMSONSHELL_SQUID_BUCKET = ITEMS.register("crimsonshell_squid_bucket", () -> new UFFishBucketItem(UFEntities.CRIMSONSHELL_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem VOLT_ANGLER_BUCKET = ITEMS.register("volt_angler_bucket", () -> new UFFishBucketItem(UFEntities.VOLT_ANGLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BLIZZARDFIN_BUCKET = ITEMS.register("blizzardfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIZZARDFIN_TUNA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem MUDDYTOP_SNAIL_BUCKET = ITEMS.register("muddytop_snail_bucket", () -> new UFFishBucketItem(UFEntities.MUDDYTOP_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SHOCKCAT_BUCKET = ITEMS.register("shockcat_bucket", () -> new UFFishBucketItem(UFEntities.SHOCKCAT, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem PINKFIN_IDOL_BUCKET = ITEMS.register("pinkfin_idol_bucket", () -> new UFFishBucketItem(UFEntities.PINKFIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem TIGER_PUFFER_BUCKET = ITEMS.register("tiger_puffer_bucket", () -> new UFFishBucketItem(UFEntities.TIGER_PUFFER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem STOUT_BICHIR_BUCKET = ITEMS.register("stout_bichir_bucket", () -> new UFFishBucketItem(UFEntities.STOUT_BICHIR, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem TRIBBLE_BUCKET = ITEMS.register("tribble_bucket", () -> new UFFishBucketItem(UFEntities.TRIBBLE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem TRUMPET_SQUID_BUCKET = ITEMS.register("trumpet_squid_bucket", () -> new UFFishBucketItem(UFEntities.TRUMPET_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + + // Spawn Eggs + public static final DeferredItem AERO_MONO_SPAWN_EGG = ITEMS.register("aero_mono_spawn_egg", () -> new SpawnEggItem(UFEntities.AERO_MONO.get(), 0x8ca8b5, 0x506884, new Item.Properties())); + public static final DeferredItem PINKFIN_SPAWN_EGG = ITEMS.register("pinkfin_spawn_egg", () -> new SpawnEggItem(UFEntities.PINKFIN.get(), 0x0e011e, 0x421054, new Item.Properties())); + public static final DeferredItem BARBED_SPAWN_EGG = ITEMS.register("roughback_guitarfish_spawn_egg", () -> new SpawnEggItem(UFEntities.ROUGHBACK.get(), 0x5e5d4f, 0x92998e, new Item.Properties())); + public static final DeferredItem CLOWNTHORN_SPAWN_EGG = ITEMS.register("clownthorn_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.CLOWNTHORN_SHARK.get(), 0xbe5515, 0xa21e00, new Item.Properties())); + public static final DeferredItem DUALITY_SPAWN_EGG = ITEMS.register("duality_damselfish_spawn_egg", () -> new SpawnEggItem(UFEntities.DUALITY_DAMSELFISH.get(), 0x8a94a1, 0x2c3338, new Item.Properties())); + public static final DeferredItem DROOPING_GOURAMI_SPAWN_EGG = ITEMS.register("drooping_gourami_spawn_egg", () -> new SpawnEggItem(UFEntities.DROOPING_GOURAMI.get(), 0x54434d, 0x363243, new Item.Properties())); + public static final DeferredItem MOSSTHORN_SPAWN_EGG = ITEMS.register("mossthorn_spawn_egg", () -> new SpawnEggItem(UFEntities.MOSSTHORN.get(), 0x26a529, 0x034223, new Item.Properties())); + public static final DeferredItem RHINO_TETRA_SPAWN_EGG = ITEMS.register("rhino_tetra_spawn_egg", () -> new SpawnEggItem(UFEntities.RHINO_TETRA.get(), 0x919187, 0x7b2726, new Item.Properties())); + public static final DeferredItem RIPPER_SPAWN_EGG = ITEMS.register("ripper_spawn_egg", () -> new SpawnEggItem(UFEntities.RIPPER.get(), 0x565950, 0x8f9386, new Item.Properties())); + public static final DeferredItem SAILOR_BARB_PAWN_EGG = ITEMS.register("sailor_barb_spawn_egg", () -> new SpawnEggItem(UFEntities.SAILOR_BARB.get(), 0x5e6a25, 0xa1a68c, new Item.Properties())); + public static final DeferredItem SEA_PANCAKE_SPAWN_EGG = ITEMS.register("sea_pancake_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_PANCAKE.get(), 0xbda877, 0xdfcbb7, new Item.Properties())); + public static final DeferredItem SEA_SPIDER_SPAWN_EGG = ITEMS.register("sea_spider_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_SPIDER.get(), 0x774128, 0xaf7834, new Item.Properties())); + public static final DeferredItem SPINDLEFISH_SPAWN_EGG = ITEMS.register("spindlefish_spawn_egg", () -> new SpawnEggItem(UFEntities.SPINDLEFISH.get(), 0x8e2573, 0xc14aeb, new Item.Properties())); + public static final DeferredItem TRIPLE_TWIRL_PLECO_SPAWN_EGG = ITEMS.register("triple_twirl_pleco_spawn_egg", () -> new SpawnEggItem(UFEntities.TRIPLE_TWIRL_PLECO.get(), 0xc1923a, 0x903113, new Item.Properties())); + public static final DeferredItem BRICK_SNAIL_SPAWN_EGG = ITEMS.register("brick_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.BRICK_SNAIL.get(), 0xb5553b, 0x674f17, new Item.Properties())); + public static final DeferredItem ZEBRA_CORNETFISH_SPAWN_EGG = ITEMS.register("zebra_cornetfish_spawn_egg", () -> new SpawnEggItem(UFEntities.ZEBRA_CORNETFISH.get(), 0x153957, 0xc7ad0d, new Item.Properties())); + public static final DeferredItem TIGER_PUFFER_SPAWN_EGG = ITEMS.register("tiger_puffer_spawn_egg", () -> new SpawnEggItem(UFEntities.TIGER_PUFFER.get(), 0x622814, 0x84736f, new Item.Properties())); + public static final DeferredItem BLACKCAP_SNAIL_SPAWN_EGG = ITEMS.register("blackcap_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.BLACKCAP_SNAIL.get(), 0x262917, 0x4c3d27, new Item.Properties())); + public static final DeferredItem SNEEPSNORP_EGG = ITEMS.register("sneepsnorp_spawn_egg", () -> new SpawnEggItem(UFEntities.SNEEPSNORP.get(), 0x3347a7, 0xce8a24, new Item.Properties())); + public static final DeferredItem DEEP_CRAWLER_SPAWN_EGG = ITEMS.register("deep_crawler_spawn_egg", () -> new SpawnEggItem(UFEntities.DEEP_CRAWLER.get(), 0x536761, 0x34363f, new Item.Properties())); + public static final DeferredItem WIZARD_JELLY_SPAWN_EGG = ITEMS.register("wizard_jelly_spawn_egg", () -> new SpawnEggItem(UFEntities.WIZARD_JELLY.get(), 0x5550b4, 0x3aa8d7, new Item.Properties())); + public static final DeferredItem PORCUPINE_LOBSTA_SPAWN_EGG = ITEMS.register("porcupine_lobsta_spawn_egg", () -> new SpawnEggItem(UFEntities.PORCUPINE_LOBSTA.get(), 0x624736, 0x9e521b, new Item.Properties())); + public static final DeferredItem TRUMPET_SQUID_SPAWN_EGG = ITEMS.register("trumpet_squid_spawn_egg", () -> new SpawnEggItem(UFEntities.TRUMPET_SQUID.get(), 0xe8d26a, 0xc6a042, new Item.Properties())); + public static final DeferredItem FRESHWATER_MANTIS_EGG = ITEMS.register("freshwater_mantis_spawn_egg", () -> new SpawnEggItem(UFEntities.FRESHWATER_MANTIS.get(), 0x454629, 0x94ab67, new Item.Properties())); + public static final DeferredItem BARK_ANGELFISH_SPAWN_EGG = ITEMS.register("bark_angelfish_spawn_egg", () -> new SpawnEggItem(UFEntities.BARK_ANGELFISH.get(), 0x553f1a, 0x35270a, new Item.Properties())); + public static final DeferredItem SHOCKCAT_SPAWN_EGG = ITEMS.register("shockcat_spawn_egg", () -> new SpawnEggItem(UFEntities.SHOCKCAT.get(), 0x34294f, 0x255f9b, new Item.Properties())); + public static final DeferredItem MUDDYTOP_SNAIL_SPAWN_EGG = ITEMS.register("muddytop_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.MUDDYTOP_SNAIL.get(), 0x23100e, 0x5f4d3b, new Item.Properties())); + public static final DeferredItem KALAPPA_SPAWN_EGG = ITEMS.register("kalappa_spawn_egg", () -> new SpawnEggItem(UFEntities.KALAPPA.get(), 0x624051, 0x886d86, new Item.Properties())); + public static final DeferredItem LOBED_SKIPPER_SPAWN_EGG = ITEMS.register("lobed_skipper_spawn_egg", () -> new SpawnEggItem(UFEntities.LOBED_SKIPPER.get(), 0x4b2618, 0x9e632f, new Item.Properties())); + public static final DeferredItem STOUT_BICHIR_SPAWN_EGG = ITEMS.register("stout_bichir_spawn_egg", () -> new SpawnEggItem(UFEntities.STOUT_BICHIR.get(), 0x5a5e3d, 0xb08f33, new Item.Properties())); + public static final DeferredItem BEAKED_HERRING_SPAWN_EGG = ITEMS.register("beaked_herring_spawn_egg", () -> new SpawnEggItem(UFEntities.BEAKED_HERRING.get(), 0x8bacc4, 0xc5d0cf, new Item.Properties())); + public static final DeferredItem PICKLEFISH_SPAWN_EGG = ITEMS.register("picklefish_spawn_egg", () -> new SpawnEggItem(UFEntities.PICKLEFISH.get(), 0x235806, 0xd0cd07, new Item.Properties())); + public static final DeferredItem BLIND_SAILFIN_SPAWN_EGG = ITEMS.register("blind_sailfin_spawn_egg", () -> new SpawnEggItem(UFEntities.BLIND_SAILFIN.get(), 0xdcccc3, 0xc19c8e, new Item.Properties())); + public static final DeferredItem DEMON_HERRING_SPAWN_EGG = ITEMS.register("demon_herring_spawn_egg", () -> new SpawnEggItem(UFEntities.DEMON_HERRING.get(), 0x363243, 0xef7930, new Item.Properties())); + public static final DeferredItem AMBER_GOBY_SPAWN_EGG = ITEMS.register("amber_goby_spawn_egg", () -> new SpawnEggItem(UFEntities.AMBER_GOBY.get(), 0xfb912e, 0xae5e2c, new Item.Properties())); + public static final DeferredItem HATCHET_FISH_SPAWN_EGG = ITEMS.register("hatchet_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.HATCHET_FISH.get(), 0x0b0b26, 0x7d3283, new Item.Properties())); + public static final DeferredItem COPPERFLAME_SPAWN_EGG = ITEMS.register("copperflame_spawn_egg", () -> new SpawnEggItem(UFEntities.COPPERFLAME.get(), 0x4fab90, 0x7fcf90, new Item.Properties())); + public static final DeferredItem ROOTBALL_SPAWN_EGG = ITEMS.register("root_spawn_egg", () -> new SpawnEggItem(UFEntities.ROOTBALL.get(), 0x647233, 0xad7d65, new Item.Properties())); + public static final DeferredItem CELESTIAL_FISH_SPAWN_EGG = ITEMS.register("celestial_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.CELESTIAL_FISH.get(), 0x6876a2, 0xe2e4c5, new Item.Properties())); + public static final DeferredItem GNASHER_SPAWN_EGG = ITEMS.register("gnasher_spawn_egg", () -> new SpawnEggItem(UFEntities.GNASHER.get(), 0x323232, 0x465bb2, new Item.Properties())); + public static final DeferredItem PRAWN_SPAWN_EGG = ITEMS.register("prawn_spawn_egg", () -> new SpawnEggItem(UFEntities.PRAWN.get(), 0x5a579e, 0x4694d1, new Item.Properties())); + public static final DeferredItem SQUODDLE_SPAWN_EGG = ITEMS.register("squoddle_spawn_egg", () -> new SpawnEggItem(UFEntities.SQUODDLE.get(), 0xb37817, 0xe58a2e, new Item.Properties())); + public static final DeferredItem SEA_MOSQUITO_SPAWN_EGG = ITEMS.register("sea_mosquito_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_MOSQUITO.get(), 0x326934, 0x6c122f, new Item.Properties())); + public static final DeferredItem FORKFISH_SPAWN_EGG = ITEMS.register("forkfish_spawn_egg", () -> new SpawnEggItem(UFEntities.FORKFISH.get(), 0x8e882c, 0x3dbba0, new Item.Properties())); + public static final DeferredItem SPOON_SHARK_SPAWN_EGG = ITEMS.register("spoon_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.SPOON_SHARK.get(), 0xddbd78, 0xb3925b, new Item.Properties())); + public static final DeferredItem CORAL_SKRIMP_EGG = ITEMS.register("coral_skrimp_spawn_egg", () -> new SpawnEggItem(UFEntities.CORAL_SKRIMP.get(), 0x5a0e7a, 0xb34aa2, new Item.Properties())); + public static final DeferredItem CIRCUS_FISH_SPAWN_EGG = ITEMS.register("circus_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.CIRCUS_FISH.get(), 0xab4b36, 0xc88f62, new Item.Properties())); + public static final DeferredItem BLIZZARDFIN_SPAWN_EGG = ITEMS.register("blizzardfin_spawn_egg", () -> new SpawnEggItem(UFEntities.BLIZZARDFIN_TUNA.get(), 0x9ed7dc, 0x6182a6, new Item.Properties())); + public static final DeferredItem EYELASH_FISH_SPAWN_EGG = ITEMS.register("eyelash_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.EYELASH.get(), 0xb7b7ba, 0xfcfcfa, new Item.Properties())); + public static final DeferredItem SNOWFLAKE_TAIL_FISH_SPAWN_EGG = ITEMS.register("snowflake_tail_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.SNOWFLAKE.get(), 0x649ccc, 0xcbe8e6, new Item.Properties())); + public static final DeferredItem TIGER_JUNGLE_SHARK_SPAWN_EGG = ITEMS.register("tiger_jungle_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.TIGER_JUNGLE_SHARK.get(), 0x272530, 0xa5a8c6, new Item.Properties())); + public static final DeferredItem CRIMSONSHELL_SQUID_SPAWN_EGG = ITEMS.register("crimsonshell_squid_spawn_egg", () -> new SpawnEggItem(UFEntities.CRIMSONSHELL_SQUID.get(), 0xab101c, 0x432c39, new Item.Properties())); + public static final DeferredItem VOLT_ANGLER_SPAWN_EGG = ITEMS.register("volt_angler_spawn_egg", () -> new SpawnEggItem(UFEntities.VOLT_ANGLER.get(), 0x2d4035, 0x509033, new Item.Properties())); + public static final DeferredItem TRIBBLE_SPAWN_EGG = ITEMS.register("tribble_spawn_egg", () -> new SpawnEggItem(UFEntities.TRIBBLE.get(), 0x656f26, 0x46491a, new Item.Properties())); + } diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFLootModifiers.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFLootModifiers.java index bda1dc0..4242c4a 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFLootModifiers.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFLootModifiers.java @@ -4,16 +4,16 @@ import codyhuh.unusualfishmod.common.loot.BuriedTreasureLootModifier; import codyhuh.unusualfishmod.common.loot.UnderwaterRuinsLootModifier; import codyhuh.unusualfishmod.common.loot.UnusualCatchLootModifier; -import com.mojang.serialization.Codec; -import net.minecraftforge.common.loot.IGlobalLootModifier; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import com.mojang.serialization.MapCodec; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; public class UFLootModifiers { - public static final DeferredRegister> LOOT_MODIFIERS = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, UnusualFishMod.MOD_ID); + public static final DeferredRegister> LOOT_MODIFIERS = DeferredRegister.create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, UnusualFishMod.MOD_ID); - public static final RegistryObject> UNUSUAL_CATCH_LOOT_MODIFIER = LOOT_MODIFIERS.register("unusual_catch_glm", UnusualCatchLootModifier.CODEC); - public static final RegistryObject> UNDERWATER_RUINS_LOOT_MODIFIER = LOOT_MODIFIERS.register("underwater_ruins_glm", UnderwaterRuinsLootModifier.CODEC); - public static final RegistryObject> BURIED_TREASURE_LOOT_MODIFIER = LOOT_MODIFIERS.register("buried_treasure_glm", BuriedTreasureLootModifier.CODEC); -} + public static final DeferredHolder, MapCodec> UNUSUAL_CATCH_LOOT_MODIFIER = LOOT_MODIFIERS.register("unusual_catch_glm", () -> UnusualCatchLootModifier.CODEC); + public static final DeferredHolder, MapCodec> UNDERWATER_RUINS_LOOT_MODIFIER = LOOT_MODIFIERS.register("underwater_ruins_glm", () -> UnderwaterRuinsLootModifier.CODEC); + public static final DeferredHolder, MapCodec> BURIED_TREASURE_LOOT_MODIFIER = LOOT_MODIFIERS.register("buried_treasure_glm", () -> BuriedTreasureLootModifier.CODEC); +} \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java index 7218f99..f0f6dcf 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java @@ -1,26 +1,30 @@ package codyhuh.unusualfishmod.core.registry; import codyhuh.unusualfishmod.UnusualFishMod; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.sounds.SoundEvent; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.minecraft.world.item.JukeboxSong; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; -public class UFSounds { - public static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, UnusualFishMod.MOD_ID); +import static codyhuh.unusualfishmod.UnusualFishMod.loc; - public static final RegistryObject CRAB_CHATTER = createSoundEvent("crab_chatter"); - public static final RegistryObject CRAB_SCUTTLING = createSoundEvent("crab_scuttling"); - public static final RegistryObject DEEP_WATER = createSoundEvent("deep_water"); - public static final RegistryObject GNASHER_IDLE = createSoundEvent("gnasher_idle"); - public static final RegistryObject EVIL_CHATTERING = createSoundEvent("evil_chattering"); - public static final RegistryObject SMALL_ENEMY = createSoundEvent("small_enemy"); - public static final RegistryObject SAWING = createSoundEvent("sawing"); - public static final RegistryObject MUSIC_DISC_SEAFOAM = createSoundEvent("seafoam"); +public class UFSounds { + public static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(BuiltInRegistries.SOUND_EVENT, UnusualFishMod.MOD_ID); - private static RegistryObject createSoundEvent(final String name) { - return SOUND_EVENTS.register(name, () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(UnusualFishMod.MOD_ID, name))); + public static final DeferredHolder CRAB_CHATTER = createSoundEvent("crab_chatter"); + public static final DeferredHolder CRAB_SCUTTLING = createSoundEvent("crab_scuttling"); + public static final DeferredHolder DEEP_WATER = createSoundEvent("deep_water"); + public static final DeferredHolder GNASHER_IDLE = createSoundEvent("gnasher_idle"); + public static final DeferredHolder EVIL_CHATTERING = createSoundEvent("evil_chattering"); + public static final DeferredHolder SMALL_ENEMY = createSoundEvent("small_enemy"); + public static final DeferredHolder SAWING = createSoundEvent("sawing"); + public static final DeferredHolder MUSIC_DISC_SEAFOAM = createSoundEvent("seafoam"); + public static final ResourceKey SEAFOAM_SONG = ResourceKey.create( Registries.JUKEBOX_SONG, UnusualFishMod.loc("seafoam")); + private static DeferredHolder createSoundEvent(final String name) { + return SOUND_EVENTS.register(name, () -> SoundEvent.createVariableRangeEvent(loc(name))); } } diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java index 8b014f1..03deab2 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java @@ -6,20 +6,20 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; - public class UFTabs { - public static final DeferredRegister CREATIVE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, UnusualFishMod.MOD_ID); + public static final DeferredRegister CREATIVE_TABS = + DeferredRegister.create(Registries.CREATIVE_MODE_TAB, UnusualFishMod.MOD_ID); - public static final RegistryObject UF_TAB = CREATIVE_TABS.register("unusual_fish_tab", + public static final DeferredHolder UF_TAB = CREATIVE_TABS.register("unusual_fish_tab", () -> CreativeModeTab.builder() .title(Component.translatable("itemGroup.unusual_fish_mod")) - .icon(UFItems.RAW_CIRCUS_FISH.get()::getDefaultInstance) + .icon(() -> UFItems.RAW_SNEEP_SNORP.get().getDefaultInstance()) .displayItems((displayParams, output) -> { for (var item : UFItems.ITEMS.getEntries()) { output.accept(item.get()); diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTags.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTags.java index 9906d00..e5a7bde 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTags.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTags.java @@ -1,9 +1,6 @@ package codyhuh.unusualfishmod.core.registry; -import codyhuh.unusualfishmod.UnusualFishMod; -import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; @@ -11,6 +8,8 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; + public class UFTags { public static final TagKey> TIGER_PUFFER_PREY = entityTag("tiger_puffer_prey"); public static final TagKey> SNAILS = entityTag("snails"); @@ -21,14 +20,14 @@ public class UFTags { public static final TagKey UNCHOPPABLE = blockTag("unchoppable"); private static TagKey> entityTag(String path) { - return TagKey.create(Registries.ENTITY_TYPE, new ResourceLocation(UnusualFishMod.MOD_ID, path)); + return TagKey.create(Registries.ENTITY_TYPE, loc(path)); } private static TagKey itemTag(String path) { - return ItemTags.create(new ResourceLocation(UnusualFishMod.MOD_ID, path)); + return ItemTags.create(loc(path)); } private static TagKey blockTag(String path) { - return BlockTags.create(new ResourceLocation(UnusualFishMod.MOD_ID, path)); + return BlockTags.create(loc(path)); } } diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTiers.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTiers.java index b4906d7..8af8ee3 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTiers.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTiers.java @@ -1,8 +1,11 @@ package codyhuh.unusualfishmod.core.registry; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; import net.minecraft.util.LazyLoadedValue; import net.minecraft.world.item.Tier; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.block.Block; import java.util.function.Supplier; @@ -37,6 +40,11 @@ public float getAttackDamageBonus() { return this.damage; } + @Override + public TagKey getIncorrectBlocksForDrops() { + return BlockTags.INCORRECT_FOR_STONE_TOOL; + } + public int getLevel() { return this.level; } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg deleted file mode 100644 index 849aa4f..0000000 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ /dev/null @@ -1,2 +0,0 @@ -public net.minecraft.world.entity.Entity f_19857_ # yRot -public-f net.minecraft.world.item.DiggerItem f_40980_ # speed \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml deleted file mode 100644 index df34167..0000000 --- a/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,70 +0,0 @@ -# This is an example mods.toml file. It contains the data relating to the loading mods. -# There are several mandatory fields (#mandatory), and many more that are optional (#optional). -# The overall format is standard TOML format, v0.5.0. -# Note that there are a couple of TOML lists in this file. -# Find more information on toml format here: https://github.com/toml-lang/toml -# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml -modLoader="javafml" #mandatory -# A version range to match for said mod loader - for regular FML @Mod it will be the forge version -loaderVersion="${loader_version_range}" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. -# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. -# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. -license="${mod_license}" -# A URL to refer people to when problems occur with this mod -#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional -# A list of mods - how many allowed here is determined by the individual mod loader -[[mods]] #mandatory -# The modid of the mod -modId="${mod_id}" #mandatory -# The version number of the mod -version="${mod_version}" #mandatory -# A display name for the mod -displayName="${mod_name}" #mandatory -# A URL to query for updates for this mod. See the JSON update specification https://docs.minecraftforge.net/en/latest/misc/updatechecker/ -#updateJSONURL="https://change.me.example.invalid/updates.json" #optional -# A URL for the "homepage" for this mod, displayed in the mod UI -#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional -# A file name (in the root of the mod JAR) containing a logo for display -#logoFile="examplemod.png" #optional -# A text field displayed in the mod UI -credits="Mango (sound designer & composer)" #optional -# A text field displayed in the mod UI -authors="${mod_authors}" #optional -# Display Test controls the display for your mod in the server connection screen -# MATCH_VERSION means that your mod will cause a red X if the versions on client and server differ. This is the default behaviour and should be what you choose if you have server and client elements to your mod. -# IGNORE_SERVER_VERSION means that your mod will not cause a red X if it's present on the server but not on the client. This is what you should use if you're a server only mod. -# IGNORE_ALL_VERSION means that your mod will not cause a red X if it's present on the client or the server. This is a special case and should only be used if your mod has no server component. -# NONE means that no display test is set on your mod. You need to do this yourself, see IExtensionPoint.DisplayTest for more information. You can define any scheme you wish with this value. -# IMPORTANT NOTE: this is NOT an instruction as to which environments (CLIENT or DEDICATED SERVER) your mod loads on. Your mod should load (and maybe do nothing!) whereever it finds itself. -#displayTest="MATCH_VERSION" # MATCH_VERSION is the default if nothing is specified (#optional) - -# The description text for the mod (multi line!) (#mandatory) -description='''${mod_description}''' -# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. -[[dependencies.${mod_id}]] #optional -# the modid of the dependency -modId="forge" #mandatory -# Does this dependency have to exist - if not, ordering below must be specified -mandatory=true #mandatory -# The version range of the dependency -versionRange="${forge_version_range}" #mandatory -# An ordering relationship for the dependency - BEFORE or AFTER required if the dependency is not mandatory -# BEFORE - This mod is loaded BEFORE the dependency -# AFTER - This mod is loaded AFTER the dependency -ordering="NONE" -# Side this dependency is applied on - BOTH, CLIENT, or SERVER -side="BOTH" -# Here's another dependency -[[dependencies.${mod_id}]] -modId="minecraft" -mandatory=true -# This version range declares a minimum of the current minecraft version up to but not including the next major version -versionRange="${minecraft_version_range}" -ordering="NONE" -side="BOTH" - -# Features are specific properties of the game environment, that you may want to declare you require. This example declares -# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't -# stop your mod loading on the server for example. -#[features.${mod_id}] -#openGLVersion="[3.2,)" \ No newline at end of file diff --git a/src/main/resources/assets/unusualfishmod/animations/entity/duality_damselfish.animation.json b/src/main/resources/assets/unusualfishmod/animations/entity/duality_damselfish.animation.json index cfdd7eb..08a8217 100644 --- a/src/main/resources/assets/unusualfishmod/animations/entity/duality_damselfish.animation.json +++ b/src/main/resources/assets/unusualfishmod/animations/entity/duality_damselfish.animation.json @@ -78,7 +78,7 @@ }, "position": { "0.0": ["math.sin(query.anim_time*180)*2.5", "3*query.is_on_ground+math.sin(query.anim_time*360)*5", "math.sin(query.anim_time*180/1)*5"], - "1.0": ["math.sin(query.anim_time*180)*2.5", "5+3*query.is_on_ground+math.sin(query.anim_time*360)*5", "+math.sin(query.anim_time*360-90)*5"], + "1.0": ["math.sin(query.anim_time*180)*2.5", "5+3*query.is_on_ground+math.sin(query.anim_time*360)*5", "math.sin(query.anim_time*360-90)*5"], "2.0": ["math.sin(query.anim_time*180)*2.5", "3*query.is_on_ground+math.sin(query.anim_time*360)*5", 0] } }, diff --git a/src/main/resources/assets/unusualfishmod/animations/entity/freshwater_mantis.animation.json b/src/main/resources/assets/unusualfishmod/animations/entity/freshwater_mantis.animation.json index facce41..7a971db 100644 --- a/src/main/resources/assets/unusualfishmod/animations/entity/freshwater_mantis.animation.json +++ b/src/main/resources/assets/unusualfishmod/animations/entity/freshwater_mantis.animation.json @@ -605,7 +605,7 @@ "rotation": [0, "math.sin(query.anim_time*360-150)*-10", "math.clamp(math.sin(query.anim_time*360-60)*20,-20,0)"] }, "Leg3": { - "rotation": [0, "math.sin(query.anim_time*180-150)*-20", "math.clamp(math.sin(query.anim_time*180-60)*0,0,20)2"] + "rotation": [0, "math.sin(query.anim_time*180-150)*-20", "math.clamp(math.sin(query.anim_time*180-60)*0,0,20)"] }, "Leg4": { "rotation": [0, "math.sin(query.anim_time*360-90)*-10", "math.clamp(math.sin(query.anim_time*360)*20,0,20)"] diff --git a/src/main/resources/assets/unusualfishmod/animations/entity/sea_pancake.animation.json b/src/main/resources/assets/unusualfishmod/animations/entity/sea_pancake.animation.json index 760207c..34ed798 100644 --- a/src/main/resources/assets/unusualfishmod/animations/entity/sea_pancake.animation.json +++ b/src/main/resources/assets/unusualfishmod/animations/entity/sea_pancake.animation.json @@ -72,7 +72,7 @@ "position": [0, 0, -1] }, "BackFin2": { - "rotation": ["0math.sin(query.anim_time*720+60)*-10", "math.sin(query.anim_time*720+60)*10", "math.sin(query.anim_time*720-30)*-20"] + "rotation": ["math.sin(query.anim_time*720+60)*-10", "math.sin(query.anim_time*720+60)*10", "math.sin(query.anim_time*720-30)*-20"] }, "BackFin1": { "rotation": ["math.sin(query.anim_time*720+60)*-10", "math.sin(query.anim_time*720+60)*-10", "math.sin(query.anim_time*720-30)*-20"] diff --git a/src/main/resources/assets/unusualfishmod/models/item/depth_scythe.json b/src/main/resources/assets/unusualfishmod/models/item/depth_scythe.json index 64ad365..60fe214 100644 --- a/src/main/resources/assets/unusualfishmod/models/item/depth_scythe.json +++ b/src/main/resources/assets/unusualfishmod/models/item/depth_scythe.json @@ -1,6 +1,6 @@ { - "parent":"forge:item/default", - "loader":"forge:separate_transforms", + "parent":"neoforge:item/default", + "loader":"neoforge:separate_transforms", "base": { "parent": "unusualfishmod:item/scythe_in_hand" }, diff --git a/src/main/resources/assets/unusualfishmod/models/item/prismarine_spear.json b/src/main/resources/assets/unusualfishmod/models/item/prismarine_spear.json index 0f0922b..7c1ef9e 100644 --- a/src/main/resources/assets/unusualfishmod/models/item/prismarine_spear.json +++ b/src/main/resources/assets/unusualfishmod/models/item/prismarine_spear.json @@ -1,6 +1,6 @@ { - "parent": "forge:item/default", - "loader": "forge:separate_transforms", + "parent": "neoforge:item/default", + "loader": "neoforge:separate_transforms", "base": { "parent": "unusualfishmod:item/prismarine_spear_handheld", "textures": { diff --git a/src/main/resources/assets/unusualfishmod/models/item/prismarine_spear_handheld_using.json b/src/main/resources/assets/unusualfishmod/models/item/prismarine_spear_handheld_using.json index a7967b9..6ecf3ea 100644 --- a/src/main/resources/assets/unusualfishmod/models/item/prismarine_spear_handheld_using.json +++ b/src/main/resources/assets/unusualfishmod/models/item/prismarine_spear_handheld_using.json @@ -1,6 +1,6 @@ { - "parent": "forge:item/default", - "loader": "forge:separate_transforms", + "parent": "neoforge:item/default", + "loader": "neoforge:separate_transforms", "base": { "parent": "unusualfishmod:item/prismarine_spear_handheld", "textures": { diff --git a/src/main/resources/data/forge/tags/items/cooked_fishes.json b/src/main/resources/data/c/tags/item/cooked_fishes.json similarity index 100% rename from src/main/resources/data/forge/tags/items/cooked_fishes.json rename to src/main/resources/data/c/tags/item/cooked_fishes.json diff --git a/src/main/resources/data/forge/tags/items/foods/cooked_fishes.json b/src/main/resources/data/c/tags/item/foods/cooked_fishes.json similarity index 100% rename from src/main/resources/data/forge/tags/items/foods/cooked_fishes.json rename to src/main/resources/data/c/tags/item/foods/cooked_fishes.json diff --git a/src/main/resources/data/forge/tags/items/foods/raw_fishes.json b/src/main/resources/data/c/tags/item/foods/raw_fishes.json similarity index 100% rename from src/main/resources/data/forge/tags/items/foods/raw_fishes.json rename to src/main/resources/data/c/tags/item/foods/raw_fishes.json diff --git a/src/main/resources/data/forge/tags/items/raw_fishes.json b/src/main/resources/data/c/tags/item/raw_fishes.json similarity index 100% rename from src/main/resources/data/forge/tags/items/raw_fishes.json rename to src/main/resources/data/c/tags/item/raw_fishes.json diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json rename to src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json diff --git a/src/main/resources/data/minecraft/tags/blocks/slabs.json b/src/main/resources/data/minecraft/tags/block/slabs.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/slabs.json rename to src/main/resources/data/minecraft/tags/block/slabs.json diff --git a/src/main/resources/data/minecraft/tags/blocks/stairs.json b/src/main/resources/data/minecraft/tags/block/stairs.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/stairs.json rename to src/main/resources/data/minecraft/tags/block/stairs.json diff --git a/src/main/resources/data/minecraft/tags/blocks/walls.json b/src/main/resources/data/minecraft/tags/block/walls.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/walls.json rename to src/main/resources/data/minecraft/tags/block/walls.json diff --git a/src/main/resources/data/minecraft/tags/items/fishes.json b/src/main/resources/data/minecraft/tags/item/fishes.json similarity index 100% rename from src/main/resources/data/minecraft/tags/items/fishes.json rename to src/main/resources/data/minecraft/tags/item/fishes.json diff --git a/src/main/resources/data/minecraft/tags/items/slabs.json b/src/main/resources/data/minecraft/tags/item/slabs.json similarity index 100% rename from src/main/resources/data/minecraft/tags/items/slabs.json rename to src/main/resources/data/minecraft/tags/item/slabs.json diff --git a/src/main/resources/data/minecraft/tags/items/stairs.json b/src/main/resources/data/minecraft/tags/item/stairs.json similarity index 100% rename from src/main/resources/data/minecraft/tags/items/stairs.json rename to src/main/resources/data/minecraft/tags/item/stairs.json diff --git a/src/main/resources/data/minecraft/tags/items/walls.json b/src/main/resources/data/minecraft/tags/item/walls.json similarity index 100% rename from src/main/resources/data/minecraft/tags/items/walls.json rename to src/main/resources/data/minecraft/tags/item/walls.json diff --git a/src/main/resources/data/minecraft/tags/items/music_discs.json b/src/main/resources/data/minecraft/tags/items/music_discs.json deleted file mode 100644 index f3e955b..0000000 --- a/src/main/resources/data/minecraft/tags/items/music_discs.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "replace": false, - "values": [ - "unusualfishmod:music_disc_seafoam" - ] -} \ No newline at end of file diff --git a/src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json b/src/main/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json similarity index 100% rename from src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json rename to src/main/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json diff --git a/src/main/resources/data/unusualfishmod/enchantment/unusual_catch.json b/src/main/resources/data/unusualfishmod/enchantment/unusual_catch.json new file mode 100644 index 0000000..745a788 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/enchantment/unusual_catch.json @@ -0,0 +1,23 @@ +{ + "description": { + "translate": "enchantment.unusualfishmod.unusual_catch" + }, + "weight": 2, + "max_level": 1, + "min_cost": { + "base": 12, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 62, + "per_level_above_first": 0 + }, + "anvil_cost": 4, + "slots": [ + "mainhand", + "offhand" + ], + "effects": {}, + "supported_items": "#minecraft:enchantable/fishing", + "primary_items": "#minecraft:enchantable/fishing" +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/loot_modifiers/buried_treasure_glm.json b/src/main/resources/data/unusualfishmod/loot_modifiers/buried_treasure_glm.json index 00e2bc3..775a962 100644 --- a/src/main/resources/data/unusualfishmod/loot_modifiers/buried_treasure_glm.json +++ b/src/main/resources/data/unusualfishmod/loot_modifiers/buried_treasure_glm.json @@ -2,7 +2,7 @@ "type": "unusualfishmod:buried_treasure_glm", "conditions": [ { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/buried_treasure" } ] diff --git a/src/main/resources/data/unusualfishmod/loot_modifiers/underwater_ruins_glm.json b/src/main/resources/data/unusualfishmod/loot_modifiers/underwater_ruins_glm.json index 54841ba..60b4a1e 100644 --- a/src/main/resources/data/unusualfishmod/loot_modifiers/underwater_ruins_glm.json +++ b/src/main/resources/data/unusualfishmod/loot_modifiers/underwater_ruins_glm.json @@ -2,7 +2,7 @@ "type": "unusualfishmod:underwater_ruins_glm", "conditions": [ { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:chests/underwater_ruin_big" } ] diff --git a/src/main/resources/data/unusualfishmod/loot_modifiers/unusual_catch_glm.json b/src/main/resources/data/unusualfishmod/loot_modifiers/unusual_catch_glm.json index 069aaad..ea9f610 100644 --- a/src/main/resources/data/unusualfishmod/loot_modifiers/unusual_catch_glm.json +++ b/src/main/resources/data/unusualfishmod/loot_modifiers/unusual_catch_glm.json @@ -2,7 +2,7 @@ "type": "unusualfishmod:unusual_catch_glm", "conditions": [ { - "condition": "forge:loot_table_id", + "condition": "neoforge:loot_table_id", "loot_table_id": "minecraft:gameplay/fishing" } ] diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/aero_mono.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/aero_mono.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/aero_mono.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/aero_mono.json index 3a322cd..41caf86 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/aero_mono.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/aero_mono.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/amber_goby.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/amber_goby.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/amber_goby.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/amber_goby.json index b0eac03..a2d5f98 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/amber_goby.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/amber_goby.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:warm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/bark_angelfish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/bark_angelfish.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/bark_angelfish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/bark_angelfish.json index a1da55c..45af8d6 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/bark_angelfish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/bark_angelfish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "minecraft:swamp", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/beaked_herring.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/beaked_herring.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/beaked_herring.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/beaked_herring.json index e55e911..fb6b982 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/beaked_herring.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/beaked_herring.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/blackcap_snail.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blackcap_snail.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/blackcap_snail.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blackcap_snail.json index 0fc64d0..947d488 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/blackcap_snail.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blackcap_snail.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:river" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/blind_sailfin.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blind_sailfin.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/blind_sailfin.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blind_sailfin.json index 45ec00a..bf31327 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/blind_sailfin.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blind_sailfin.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_overworld", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/blizzardfin_tuna.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blizzardfin_tuna.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/blizzardfin_tuna.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blizzardfin_tuna.json index a6c50ce..b413c74 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/blizzardfin_tuna.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/blizzardfin_tuna.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:frozen_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/brick_snail.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/brick_snail.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/brick_snail.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/brick_snail.json index 8845856..acaab5f 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/brick_snail.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/brick_snail.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/celestial_fish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/celestial_fish.json similarity index 81% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/celestial_fish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/celestial_fish.json index b1d086d..8c1efe1 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/celestial_fish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/celestial_fish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "minecraft:ocean", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/circus_fish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/circus_fish.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/circus_fish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/circus_fish.json index 41e1a6a..6c5b87f 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/circus_fish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/circus_fish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/clownthorn_shark.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/clownthorn_shark.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/clownthorn_shark.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/clownthorn_shark.json index f39f114..0173dee 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/clownthorn_shark.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/clownthorn_shark.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:warm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/copperflame_anthias.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/copperflame_anthias.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/copperflame_anthias.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/copperflame_anthias.json index 958fd0e..8ce198c 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/copperflame_anthias.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/copperflame_anthias.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/coral_skrimp.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/coral_skrimp.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/coral_skrimp.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/coral_skrimp.json index 358534b..2cca90e 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/coral_skrimp.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/coral_skrimp.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:warm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/crimsonshell_squid.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/crimsonshell_squid.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/crimsonshell_squid.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/crimsonshell_squid.json index 120380b..3746a94 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/crimsonshell_squid.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/crimsonshell_squid.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/deep_crawler.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/deep_crawler.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/deep_crawler.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/deep_crawler.json index 5aba3c5..17b8108 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/deep_crawler.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/deep_crawler.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_overworld", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/demon_herring.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/demon_herring.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/demon_herring.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/demon_herring.json index 72b3cb0..eef8b5b 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/demon_herring.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/demon_herring.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/drooping_gourami.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/drooping_gourami.json similarity index 84% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/drooping_gourami.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/drooping_gourami.json index 4078f3f..6267150 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/drooping_gourami.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/drooping_gourami.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:mangrove_swamp" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/duality_damselfish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/duality_damselfish.json similarity index 84% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/duality_damselfish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/duality_damselfish.json index 557f75e..a00425c 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/duality_damselfish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/duality_damselfish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:warm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/eyelash_fish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/eyelash_fish.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/eyelash_fish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/eyelash_fish.json index f0ebe72..bc806d7 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/eyelash_fish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/eyelash_fish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_jungle", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/forkfish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/forkfish.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/forkfish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/forkfish.json index a8807ed..acb1479 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/forkfish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/forkfish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/freshwater_mantis.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/freshwater_mantis.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/freshwater_mantis.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/freshwater_mantis.json index 64b5d7d..ea21d58 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/freshwater_mantis.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/freshwater_mantis.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_jungle", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/gnasher.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/gnasher.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/gnasher.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/gnasher.json index 033f7d4..0207ca7 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/gnasher.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/gnasher.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/hatchet_fish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/hatchet_fish.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/hatchet_fish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/hatchet_fish.json index 1668b2a..e80514e 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/hatchet_fish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/hatchet_fish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_overworld", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/kalappa.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/kalappa.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/kalappa.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/kalappa.json index 6f8ac84..88e70a8 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/kalappa.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/kalappa.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:mushroom_fields" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/lobed_skipper.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/lobed_skipper.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/lobed_skipper.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/lobed_skipper.json index 7584f36..1d3d011 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/lobed_skipper.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/lobed_skipper.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:mangrove_swamp" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/mossthorn.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/mossthorn.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/mossthorn.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/mossthorn.json index 49d884f..1c85e6d 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/mossthorn.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/mossthorn.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:lush_caves" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/muddytop_snail.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/muddytop_snail.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/muddytop_snail.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/muddytop_snail.json index 86ad52b..1c97501 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/muddytop_snail.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/muddytop_snail.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:mangrove_swamp" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/picklefish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/picklefish.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/picklefish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/picklefish.json index e79f025..5c00c02 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/picklefish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/picklefish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/pinkfin.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/pinkfin.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/pinkfin.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/pinkfin.json index 19a1213..a2fe3e8 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/pinkfin.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/pinkfin.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:frozen_river" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/porcupine_lobster.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/porcupine_lobster.json similarity index 84% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/porcupine_lobster.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/porcupine_lobster.json index 5d8f390..99fa123 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/porcupine_lobster.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/porcupine_lobster.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/prawn.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/prawn.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/prawn.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/prawn.json index 643a954..f482d88 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/prawn.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/prawn.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "minecraft:dripstone_caves", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/remove_deep_dark_spawns.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/remove_deep_dark_spawns.json similarity index 86% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/remove_deep_dark_spawns.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/remove_deep_dark_spawns.json index 1df9492..abf513f 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/remove_deep_dark_spawns.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/remove_deep_dark_spawns.json @@ -1,5 +1,5 @@ { - "type": "forge:remove_spawns", + "type": "neoforge:remove_spawns", "biomes": "#unusualfishmod:no_spawns", "entity_types": [ "unusualfishmod:deep_crawler", diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/rhino_tetra.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/rhino_tetra.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/rhino_tetra.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/rhino_tetra.json index 2c55cbf..2ab4f05 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/rhino_tetra.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/rhino_tetra.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:savanna" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/ripper.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/ripper.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/ripper.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/ripper.json index 2fbdf82..7e769ea 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/ripper.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/ripper.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:river" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/roughback_guitarfish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/roughback_guitarfish.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/roughback_guitarfish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/roughback_guitarfish.json index 2b228dd..8e5174c 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/roughback_guitarfish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/roughback_guitarfish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:swamp" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sailor_barb.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sailor_barb.json similarity index 85% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/sailor_barb.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sailor_barb.json index 82c4413..5e97413 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sailor_barb.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sailor_barb.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:swamp", "minecraft:mangrove_swamp" diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_mosquito.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_mosquito.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_mosquito.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_mosquito.json index 63ba553..be29dd5 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_mosquito.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_mosquito.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "minecraft:warm_ocean", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_pancake.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_pancake.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_pancake.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_pancake.json index 18d6460..9568b28 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_pancake.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_pancake.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_spider.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_spider.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_spider.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_spider.json index 4f4b118..13160de 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sea_spider.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sea_spider.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/shockcat.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/shockcat.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/shockcat.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/shockcat.json index 2d08c08..6f3b2c6 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/shockcat.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/shockcat.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_overworld", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sneep_snorp.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sneep_snorp.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/sneep_snorp.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sneep_snorp.json index 7ce6e81..35562fa 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/sneep_snorp.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/sneep_snorp.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "minecraft:warm_ocean", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/snowflake_tail_fish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/snowflake_tail_fish.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/snowflake_tail_fish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/snowflake_tail_fish.json index e62ca6c..8ab2599 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/snowflake_tail_fish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/snowflake_tail_fish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:frozen_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/spindlefish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/spindlefish.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/spindlefish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/spindlefish.json index eb5bc1e..e2c1b32 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/spindlefish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/spindlefish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:warm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/spoon_shark.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/spoon_shark.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/spoon_shark.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/spoon_shark.json index 72f9599..914e000 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/spoon_shark.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/spoon_shark.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/squoddle.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/squoddle.json similarity index 84% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/squoddle.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/squoddle.json index 83f98c5..2607930 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/squoddle.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/squoddle.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/stout_bichir.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/stout_bichir.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/stout_bichir.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/stout_bichir.json index 7cc4664..fa1651f 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/stout_bichir.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/stout_bichir.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:mangrove_swamp" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/tiger_jungle_shark.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tiger_jungle_shark.json similarity index 82% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/tiger_jungle_shark.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tiger_jungle_shark.json index eeabbf7..e12d359 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/tiger_jungle_shark.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tiger_jungle_shark.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": "#minecraft:is_jungle", "spawners": { diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/tiger_puffer.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tiger_puffer.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/tiger_puffer.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tiger_puffer.json index 68f08a0..345fa25 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/tiger_puffer.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tiger_puffer.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:warm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/tribble.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tribble.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/tribble.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tribble.json index 931e4db..9488c05 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/tribble.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/tribble.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/triple_twirl_pleco.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/triple_twirl_pleco.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/triple_twirl_pleco.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/triple_twirl_pleco.json index c06fc4a..867cef4 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/triple_twirl_pleco.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/triple_twirl_pleco.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:river" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/trumpet_squid.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/trumpet_squid.json similarity index 84% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/trumpet_squid.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/trumpet_squid.json index 44fd8e3..e0edb56 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/trumpet_squid.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/trumpet_squid.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_lukewarm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/volt_angler.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/volt_angler.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/volt_angler.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/volt_angler.json index 96d7305..bc9666c 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/volt_angler.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/volt_angler.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:deep_cold_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/wizard_jelly.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/wizard_jelly.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/wizard_jelly.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/wizard_jelly.json index 64efab1..7047cd8 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/wizard_jelly.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/wizard_jelly.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:ocean" ], diff --git a/src/main/resources/data/unusualfishmod/forge/biome_modifier/zebra_cornetfish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/zebra_cornetfish.json similarity index 83% rename from src/main/resources/data/unusualfishmod/forge/biome_modifier/zebra_cornetfish.json rename to src/main/resources/data/unusualfishmod/neoforge/biome_modifier/zebra_cornetfish.json index 583da09..c7fb82c 100644 --- a/src/main/resources/data/unusualfishmod/forge/biome_modifier/zebra_cornetfish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/zebra_cornetfish.json @@ -1,5 +1,5 @@ { - "type": "forge:add_spawns", + "type": "neoforge:add_spawns", "biomes": [ "minecraft:warm_ocean" ], diff --git a/src/main/resources/data/unusualfishmod/recipes/ancient_weapon_smithing_template.json b/src/main/resources/data/unusualfishmod/recipes/ancient_weapon_smithing_template.json deleted file mode 100644 index 698f0e8..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/ancient_weapon_smithing_template.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "misc", - "key": { - "#": { - "item": "minecraft:sand" - }, - "C": { - "tag": "unusualfishmod:raw_unusual_fish" - }, - "S": { - "item": "unusualfishmod:ancient_weapon_smithing_template" - } - }, - "pattern": [ - "#S#", - "#C#", - "###" - ], - "result": { - "count": 2, - "item": "unusualfishmod:ancient_weapon_smithing_template" - }, - "show_notification": true -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks.json b/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks.json deleted file mode 100644 index 19c7772..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "_", - "_" - ], - "key": { - "_": { - "item": "unusualfishmod:crimson_brick_slab" - } - }, - "result": { - "item": "unusualfishmod:chiseled_crimson_bricks", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_from_tiles.json b/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_from_tiles.json deleted file mode 100644 index 4c3ac6b..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_from_tiles.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "_", - "_" - ], - "key": { - "_": { - "item": "unusualfishmod:crimson_tile_slab" - } - }, - "result": { - "item": "unusualfishmod:chiseled_crimson_bricks", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_from_tiles_stonecutting.json deleted file mode 100644 index 863250d..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_from_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_tiles" - }, - "result": "unusualfishmod:chiseled_crimson_bricks", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_stonecutting.json deleted file mode 100644 index 7062e27..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/chiseled_crimson_bricks_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_bricks" - }, - "result": "unusualfishmod:chiseled_crimson_bricks", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks.json b/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks.json deleted file mode 100644 index a8dcc82..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "_", - "_" - ], - "key": { - "_": { - "item": "unusualfishmod:relucent_brick_slab" - } - }, - "result": { - "item": "unusualfishmod:chiseled_relucent_bricks", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_from_tiles.json b/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_from_tiles.json deleted file mode 100644 index ecbf894..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_from_tiles.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "_", - "_" - ], - "key": { - "_": { - "item": "unusualfishmod:relucent_tile_slab" - } - }, - "result": { - "item": "unusualfishmod:chiseled_relucent_bricks", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_from_tiles_stonecutting.json deleted file mode 100644 index 322457e..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_from_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_tiles" - }, - "result": "unusualfishmod:chiseled_relucent_bricks", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_stonecutting.json deleted file mode 100644 index a526519..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/chiseled_relucent_bricks_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_bricks" - }, - "result": "unusualfishmod:chiseled_relucent_bricks", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick.json b/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick.json deleted file mode 100644 index 0c9ca7e..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smelting", - "ingredient": { - "item": "unusualfishmod:raw_aero_mono_stick" - }, - "result": "unusualfishmod:cooked_aero_mono_stick", - "experience": 0.35, - "cookingtime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick_from_campfire_cooking.json deleted file mode 100644 index 1f20e62..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick_from_campfire_cooking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:campfire_cooking", - "ingredient": { - "item": "unusualfishmod:raw_aero_mono_stick" - }, - "result": "unusualfishmod:cooked_aero_mono_stick", - "experience": 0.35, - "cookingtime": 600 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick_from_smoking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick_from_smoking.json deleted file mode 100644 index 03375b5..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_aero_mono_stick_from_smoking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smoking", - "ingredient": { - "item": "unusualfishmod:raw_aero_mono_stick" - }, - "result": "unusualfishmod:cooked_aero_mono_stick", - "experience": 0.35, - "cookingtime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna.json b/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna.json deleted file mode 100644 index 2bd8ed3..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smelting", - "ingredient": { - "item": "unusualfishmod:raw_blizzard_tuna" - }, - "result": "unusualfishmod:cooked_blizzard_tuna", - "experience": 0.35, - "cookingtime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna_from_campfire_cooking.json deleted file mode 100644 index 3a9a6ce..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna_from_campfire_cooking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:campfire_cooking", - "ingredient": { - "item": "unusualfishmod:raw_blizzard_tuna" - }, - "result": "unusualfishmod:cooked_blizzard_tuna", - "experience": 0.35, - "cookingtime": 600 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna_from_smoking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna_from_smoking.json deleted file mode 100644 index 1be2457..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_blizzard_tuna_from_smoking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smoking", - "ingredient": { - "item": "unusualfishmod:raw_blizzard_tuna" - }, - "result": "unusualfishmod:cooked_blizzard_tuna", - "experience": 0.35, - "cookingtime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_fillet.json b/src/main/resources/data/unusualfishmod/recipes/cooked_fillet.json deleted file mode 100644 index d616a16..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_fillet.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smelting", - "ingredient": { - "tag": "unusualfishmod:raw_unusual_fish" - }, - "result": "unusualfishmod:cooked_unusual_fillet", - "experience": 0.35, - "cookingtime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_fillet_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_fillet_from_campfire_cooking.json deleted file mode 100644 index 19b7a28..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_fillet_from_campfire_cooking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:campfire_cooking", - "ingredient": { - "tag": "unusualfishmod:raw_unusual_fish" - }, - "result": "unusualfishmod:cooked_unusual_fillet", - "experience": 0.35, - "cookingtime": 600 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_fillet_from_smoking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_fillet_from_smoking.json deleted file mode 100644 index ac2c907..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_fillet_from_smoking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smoking", - "ingredient": { - "tag": "unusualfishmod:raw_unusual_fish" - }, - "result": "unusualfishmod:cooked_unusual_fillet", - "experience": 0.35, - "cookingtime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_lobster.json b/src/main/resources/data/unusualfishmod/recipes/cooked_lobster.json deleted file mode 100644 index 9368225..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_lobster.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smelting", - "ingredient": { - "item": "unusualfishmod:raw_lobster" - }, - "result": "unusualfishmod:cooked_lobster", - "experience": 0.35, - "cookingtime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_lobster_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_lobster_from_campfire_cooking.json deleted file mode 100644 index 2db3bb6..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_lobster_from_campfire_cooking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:campfire_cooking", - "ingredient": { - "item": "unusualfishmod:raw_lobster" - }, - "result": "unusualfishmod:cooked_lobster", - "experience": 0.35, - "cookingtime": 600 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_lobster_from_smoking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_lobster_from_smoking.json deleted file mode 100644 index 6bf5bca..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_lobster_from_smoking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smoking", - "ingredient": { - "item": "unusualfishmod:raw_lobster" - }, - "result": "unusualfishmod:cooked_lobster", - "experience": 0.35, - "cookingtime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn.json b/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn.json deleted file mode 100644 index 9b44954..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smelting", - "ingredient": { - "item": "unusualfishmod:raw_mossthorn" - }, - "result": "unusualfishmod:cooked_mossthorn", - "experience": 0.35, - "cookingtime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn_from_campfire_cooking.json deleted file mode 100644 index dcdd5f2..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn_from_campfire_cooking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:campfire_cooking", - "ingredient": { - "item": "unusualfishmod:raw_mossthorn" - }, - "result": "unusualfishmod:cooked_mossthorn", - "experience": 0.35, - "cookingtime": 300 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn_from_smoking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn_from_smoking.json deleted file mode 100644 index a0b9198..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_mossthorn_from_smoking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smoking", - "ingredient": { - "item": "unusualfishmod:raw_mossthorn" - }, - "result": "unusualfishmod:cooked_mossthorn", - "experience": 0.35, - "cookingtime": 75 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat.json b/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat.json deleted file mode 100644 index 5dcd618..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smelting", - "ingredient": { - "item": "unusualfishmod:raw_shockcat" - }, - "result": "unusualfishmod:cooked_shockcat", - "experience": 0.35, - "cookingtime": 200 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat_from_campfire_cooking.json deleted file mode 100644 index 332fded..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat_from_campfire_cooking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:campfire_cooking", - "ingredient": { - "item": "unusualfishmod:raw_shockcat" - }, - "result": "unusualfishmod:cooked_shockcat", - "experience": 0.35, - "cookingtime": 600 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat_from_smoking.json b/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat_from_smoking.json deleted file mode 100644 index 1490755..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/cooked_shockcat_from_smoking.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "minecraft:smoking", - "ingredient": { - "item": "unusualfishmod:raw_shockcat" - }, - "result": "unusualfishmod:cooked_shockcat", - "experience": 0.35, - "cookingtime": 100 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/copper_antenna.json b/src/main/resources/data/unusualfishmod/recipes/copper_antenna.json deleted file mode 100644 index c6aecd8..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/copper_antenna.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "K", - "c" - ], - "key": { - "K": { - "item": "unusualfishmod:tendril" - }, - "c": { - "item": "minecraft:copper_ingot" - } - }, - "result": { - "item": "unusualfishmod:copper_antenna", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_slab.json b/src/main/resources/data/unusualfishmod/recipes/crimson_brick_slab.json deleted file mode 100644 index 846417e..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:crimson_bricks" - } - }, - "result": { - "item": "unusualfishmod:crimson_brick_slab", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_slab_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_brick_slab_stonecutting.json deleted file mode 100644 index d0fd1de..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_slab_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_bricks" - }, - "result": "unusualfishmod:crimson_brick_slab", - "count": 2 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_stairs.json b/src/main/resources/data/unusualfishmod/recipes/crimson_brick_stairs.json deleted file mode 100644 index 1a8379b..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_stairs.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "# ", - "## ", - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:crimson_bricks" - } - }, - "result": { - "item": "unusualfishmod:crimson_brick_stairs", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_stairs_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_brick_stairs_stonecutting.json deleted file mode 100644 index e75cfa2..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_stairs_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_bricks" - }, - "result": "unusualfishmod:crimson_brick_stairs", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_wall.json b/src/main/resources/data/unusualfishmod/recipes/crimson_brick_wall.json deleted file mode 100644 index 5c0bb2a..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_wall.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###", - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:crimson_bricks" - } - }, - "result": { - "item": "unusualfishmod:crimson_brick_wall", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_wall_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_brick_wall_stonecutting.json deleted file mode 100644 index 6089287..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_brick_wall_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_bricks" - }, - "result": "unusualfishmod:crimson_brick_wall", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_bricks.json b/src/main/resources/data/unusualfishmod/recipes/crimson_bricks.json deleted file mode 100644 index 2169441..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_bricks.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "##", - "##" - ], - "key": { - "#": { - "item": "unusualfishmod:crimson_shard" - } - }, - "result": { - "item": "unusualfishmod:crimson_bricks", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab.json deleted file mode 100644 index 66a13bb..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:crimson_tiles" - } - }, - "result": { - "item": "unusualfishmod:crimson_tile_slab", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab_from_tiles_stonecutting.json deleted file mode 100644 index bae1317..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab_from_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_tiles" - }, - "result": "unusualfishmod:crimson_tile_slab", - "count": 2 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab_stonecutting.json deleted file mode 100644 index 826c5b9..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_slab_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_bricks" - }, - "result": "unusualfishmod:crimson_tile_slab", - "count": 2 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs.json deleted file mode 100644 index 93b9f07..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "# ", - "## ", - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:crimson_tiles" - } - }, - "result": { - "item": "unusualfishmod:crimson_tile_stairs", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs_from_tiles_stonecutting.json deleted file mode 100644 index a7b9acb..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs_from_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_tiles" - }, - "result": "unusualfishmod:crimson_tile_stairs", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs_stonecutting.json deleted file mode 100644 index 6d02b7d..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_stairs_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_bricks" - }, - "result": "unusualfishmod:crimson_tile_stairs", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall.json deleted file mode 100644 index 2cd89af..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###", - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:crimson_tiles" - } - }, - "result": { - "item": "unusualfishmod:crimson_tile_wall", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall_from_tiles_stonecutting.json deleted file mode 100644 index 28277e8..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall_from_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_tiles" - }, - "result": "unusualfishmod:crimson_tile_wall", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall_stonecutting.json deleted file mode 100644 index 2aec17e..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tile_wall_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_bricks" - }, - "result": "unusualfishmod:crimson_tile_wall", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tiles.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tiles.json deleted file mode 100644 index dd0ab7d..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tiles.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "##", - "##" - ], - "key": { - "#": { - "item": "unusualfishmod:crimson_bricks" - } - }, - "result": { - "item": "unusualfishmod:crimson_tiles", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/crimson_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/crimson_tiles_stonecutting.json deleted file mode 100644 index c3dabdb..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/crimson_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:crimson_bricks" - }, - "result": "unusualfishmod:crimson_tiles", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/depth_scythe_smithing.json b/src/main/resources/data/unusualfishmod/recipes/depth_scythe_smithing.json deleted file mode 100644 index 61a685c..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/depth_scythe_smithing.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:smithing_transform", - "template": { - "item": "unusualfishmod:ancient_weapon_smithing_template" - }, - "addition": { - "item": "unusualfishmod:depth_claw" - }, - "base": { - "item": "unusualfishmod:weapon_parts" - }, - "result": { - "item": "unusualfishmod:depth_scythe" - } -}s \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/lobster_roll.json b/src/main/resources/data/unusualfishmod/recipes/lobster_roll.json deleted file mode 100644 index aa77188..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/lobster_roll.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "ingredients": [ - { - "item": "unusualfishmod:cooked_lobster" - }, - { - "item": "minecraft:bread" - } - ], - "result": { - "item": "unusualfishmod:lobster_roll", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/nautical_lamp.json b/src/main/resources/data/unusualfishmod/recipes/nautical_lamp.json deleted file mode 100644 index c38d3e2..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/nautical_lamp.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "#P#", - "GSG", - "###" - ], - "key": { - "#": { - "item": "minecraft:prismarine_shard" - }, - "P": { - "item": "minecraft:prismarine_crystals" - }, - "G": { - "tag": "forge:glass_panes" - }, - "S": { - "item": "unusualfishmod:tendril" - } - }, - "result": { - "item": "unusualfishmod:nautical_lamp", - "count": 3 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/odd_fishsticks.json b/src/main/resources/data/unusualfishmod/recipes/odd_fishsticks.json deleted file mode 100644 index 2b0652b..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/odd_fishsticks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "# #" - ], - "key": { - "#": { - "item": "unusualfishmod:cooked_unusual_fillet" - } - }, - "result": { - "item": "unusualfishmod:odd_fishsticks", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/pickledish.json b/src/main/resources/data/unusualfishmod/recipes/pickledish.json deleted file mode 100644 index bfb3cf3..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/pickledish.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "#US", - " B " - ], - "key": { - "#": { - "item": "minecraft:carrot" - }, - "U": { - "item": "unusualfishmod:raw_picklefish" - }, - "S": { - "item": "minecraft:sea_pickle" - }, - "B": { - "item": "minecraft:bowl" - } - }, - "result": { - "item": "unusualfishmod:pickledish", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/prismarine_spear.json b/src/main/resources/data/unusualfishmod/recipes/prismarine_spear.json deleted file mode 100644 index 1101ef0..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/prismarine_spear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - " #P", - " P#", - "P " - ], - "key": { - "#": { - "item": "unusualfishmod:lobster_spike" - }, - "P": { - "item": "minecraft:prismarine_shard" - } - }, - "result": { - "item": "unusualfishmod:prismarine_spear", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/raw_aero_mono_stick.json b/src/main/resources/data/unusualfishmod/recipes/raw_aero_mono_stick.json deleted file mode 100644 index cd959e1..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/raw_aero_mono_stick.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "ingredients": [ - { - "item": "unusualfishmod:raw_aero_mono" - }, - { - "item": "minecraft:stick" - } - ], - "result": { - "item": "unusualfishmod:raw_aero_mono_stick", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_slab.json b/src/main/resources/data/unusualfishmod/recipes/relucent_brick_slab.json deleted file mode 100644 index 20677b7..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:relucent_bricks" - } - }, - "result": { - "item": "unusualfishmod:relucent_brick_slab", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_slab_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_brick_slab_stonecutting.json deleted file mode 100644 index e5e2bba..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_slab_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_bricks" - }, - "result": "unusualfishmod:relucent_brick_slab", - "count": 2 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_stairs.json b/src/main/resources/data/unusualfishmod/recipes/relucent_brick_stairs.json deleted file mode 100644 index 3ce884e..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_stairs.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "# ", - "## ", - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:relucent_bricks" - } - }, - "result": { - "item": "unusualfishmod:relucent_brick_stairs", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_stairs_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_brick_stairs_stonecutting.json deleted file mode 100644 index d1ed074..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_stairs_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_bricks" - }, - "result": "unusualfishmod:relucent_brick_stairs", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_wall.json b/src/main/resources/data/unusualfishmod/recipes/relucent_brick_wall.json deleted file mode 100644 index f67be3b..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_wall.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###", - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:relucent_bricks" - } - }, - "result": { - "item": "unusualfishmod:relucent_brick_wall", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_wall_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_brick_wall_stonecutting.json deleted file mode 100644 index df525d6..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_brick_wall_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_bricks" - }, - "result": "unusualfishmod:relucent_brick_wall", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_bricks.json b/src/main/resources/data/unusualfishmod/recipes/relucent_bricks.json deleted file mode 100644 index 083ee5a..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_bricks.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "##", - "##" - ], - "key": { - "#": { - "item": "unusualfishmod:relucent_shard" - } - }, - "result": { - "item": "unusualfishmod:relucent_bricks", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab.json deleted file mode 100644 index 2a16641..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:relucent_tiles" - } - }, - "result": { - "item": "unusualfishmod:relucent_tile_slab", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab_from_tiles_stonecutting.json deleted file mode 100644 index 2841f2d..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab_from_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_tiles" - }, - "result": "unusualfishmod:relucent_tile_slab", - "count": 2 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab_stonecutting.json deleted file mode 100644 index 3657b02..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_slab_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_bricks" - }, - "result": "unusualfishmod:relucent_tile_slab", - "count": 2 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs.json deleted file mode 100644 index 668e392..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "# ", - "## ", - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:relucent_tiles" - } - }, - "result": { - "item": "unusualfishmod:relucent_tile_stairs", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs_from_tiles_stonecutting.json deleted file mode 100644 index 25f43f5..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs_from_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_tiles" - }, - "result": "unusualfishmod:relucent_tile_stairs", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs_stonecutting.json deleted file mode 100644 index 07dc919..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_stairs_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_bricks" - }, - "result": "unusualfishmod:relucent_tile_stairs", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall.json deleted file mode 100644 index af406bc..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "###", - "###" - ], - "key": { - "#": { - "item": "unusualfishmod:relucent_tiles" - } - }, - "result": { - "item": "unusualfishmod:relucent_tile_wall", - "count": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall_from_tiles_stonecutting.json deleted file mode 100644 index f81ed4b..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall_from_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_tiles" - }, - "result": "unusualfishmod:relucent_tile_wall", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall_stonecutting.json deleted file mode 100644 index 2ba9103..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tile_wall_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_bricks" - }, - "result": "unusualfishmod:relucent_tile_wall", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tiles.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tiles.json deleted file mode 100644 index f55877b..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tiles.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "##", - "##" - ], - "key": { - "#": { - "item": "unusualfishmod:relucent_bricks" - } - }, - "result": { - "item": "unusualfishmod:relucent_tiles", - "count": 4 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/relucent_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipes/relucent_tiles_stonecutting.json deleted file mode 100644 index 84d5436..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/relucent_tiles_stonecutting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "type": "minecraft:stonecutting", - "ingredient": { - "item": "unusualfishmod:relucent_bricks" - }, - "result": "unusualfishmod:relucent_tiles", - "count": 1 -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/ripsaw_smithing.json b/src/main/resources/data/unusualfishmod/recipes/ripsaw_smithing.json deleted file mode 100644 index bdf4b3e..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/ripsaw_smithing.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:smithing_transform", - "template": { - "item": "unusualfishmod:ancient_weapon_smithing_template" - }, - "addition": { - "item": "unusualfishmod:ripper_tooth" - }, - "base": { - "item": "unusualfishmod:weapon_parts" - }, - "result": { - "item": "unusualfishmod:ripsaw" - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/sea_boom.json b/src/main/resources/data/unusualfishmod/recipes/sea_boom.json deleted file mode 100644 index a70c92d..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/sea_boom.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "CSC", - "SPS", - "CSC" - ], - "key": { - "S": { - "item": "unusualfishmod:lobster_spike" - }, - "P": { - "item": "minecraft:prismarine_bricks" - }, - "C": { - "item": "minecraft:copper_ingot" - } - }, - "result": { - "item": "unusualfishmod:sea_boom", - "count": 2 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/strange_broth.json b/src/main/resources/data/unusualfishmod/recipes/strange_broth.json deleted file mode 100644 index c4101ea..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/strange_broth.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - " # ", - "KUS", - " B " - ], - "key": { - "#": { - "item": "minecraft:seagrass" - }, - "K": { - "item": "minecraft:kelp" - }, - "U": { - "item": "unusualfishmod:cooked_unusual_fillet" - }, - "S": { - "item": "minecraft:sea_pickle" - }, - "B": { - "item": "minecraft:bowl" - } - }, - "result": { - "item": "unusualfishmod:strange_broth", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/unusual_sandwich.json b/src/main/resources/data/unusualfishmod/recipes/unusual_sandwich.json deleted file mode 100644 index b1e365d..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/unusual_sandwich.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - " # ", - "KUK", - " # " - ], - "key": { - "#": { - "item": "minecraft:bread" - }, - "K": { - "item": "minecraft:kelp" - }, - "U": { - "item": "unusualfishmod:cooked_unusual_fillet" - } - }, - "result": { - "item": "unusualfishmod:unusual_sandwich", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/volt_detector.json b/src/main/resources/data/unusualfishmod/recipes/volt_detector.json deleted file mode 100644 index ce43bd5..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/volt_detector.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "#K#", - "cRc", - "ccc" - ], - "key": { - "#": { - "item": "minecraft:prismarine_crystals" - }, - "K": { - "item": "unusualfishmod:tendril" - }, - "c": { - "item": "minecraft:copper_ingot" - }, - "R": { - "item": "minecraft:redstone_block" - } - }, - "result": { - "item": "unusualfishmod:volt_detector", - "count": 1 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipes/weird_goldfish.json b/src/main/resources/data/unusualfishmod/recipes/weird_goldfish.json deleted file mode 100644 index 797a1c2..0000000 --- a/src/main/resources/data/unusualfishmod/recipes/weird_goldfish.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "ingredients": [ - { - "item": "minecraft:wheat" - }, - { - "item": "unusualfishmod:cooked_unusual_fillet" - }, - { - "item": "minecraft:wheat" - }, - { - "item": "minecraft:water_bucket" - } - ], - "result": { - "item": "unusualfishmod:weird_goldfish", - "count": 3 - } -} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/tags/blocks/squid_eggs.json b/src/main/resources/data/unusualfishmod/tags/block/squid_eggs.json similarity index 100% rename from src/main/resources/data/unusualfishmod/tags/blocks/squid_eggs.json rename to src/main/resources/data/unusualfishmod/tags/block/squid_eggs.json diff --git a/src/main/resources/data/unusualfishmod/tags/blocks/unchoppable.json b/src/main/resources/data/unusualfishmod/tags/block/unchoppable.json similarity index 51% rename from src/main/resources/data/unusualfishmod/tags/blocks/unchoppable.json rename to src/main/resources/data/unusualfishmod/tags/block/unchoppable.json index d6649e7..a22514f 100644 --- a/src/main/resources/data/unusualfishmod/tags/blocks/unchoppable.json +++ b/src/main/resources/data/unusualfishmod/tags/block/unchoppable.json @@ -1,4 +1,5 @@ { + "replace": false, "values": [ ] } \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/tags/entity_types/cephalopods.json b/src/main/resources/data/unusualfishmod/tags/entity_type/cephalopods.json similarity index 100% rename from src/main/resources/data/unusualfishmod/tags/entity_types/cephalopods.json rename to src/main/resources/data/unusualfishmod/tags/entity_type/cephalopods.json diff --git a/src/main/resources/data/unusualfishmod/tags/entity_types/crustaceans.json b/src/main/resources/data/unusualfishmod/tags/entity_type/crustaceans.json similarity index 94% rename from src/main/resources/data/unusualfishmod/tags/entity_types/crustaceans.json rename to src/main/resources/data/unusualfishmod/tags/entity_type/crustaceans.json index 524220c..e08e076 100644 --- a/src/main/resources/data/unusualfishmod/tags/entity_types/crustaceans.json +++ b/src/main/resources/data/unusualfishmod/tags/entity_type/crustaceans.json @@ -1,4 +1,5 @@ { + "replace": false, "values": [ "unusualfishmod:sea_spider", "unusualfishmod:squoddle", diff --git a/src/main/resources/data/unusualfishmod/tags/entity_types/snails.json b/src/main/resources/data/unusualfishmod/tags/entity_type/snails.json similarity index 85% rename from src/main/resources/data/unusualfishmod/tags/entity_types/snails.json rename to src/main/resources/data/unusualfishmod/tags/entity_type/snails.json index 117445b..ae693e3 100644 --- a/src/main/resources/data/unusualfishmod/tags/entity_types/snails.json +++ b/src/main/resources/data/unusualfishmod/tags/entity_type/snails.json @@ -1,4 +1,5 @@ { + "replace": false, "values": [ "unusualfishmod:brick_snail", "unusualfishmod:blackcap_snail", diff --git a/src/main/resources/data/unusualfishmod/tags/entity_types/tiger_puffer_prey.json b/src/main/resources/data/unusualfishmod/tags/entity_type/tiger_puffer_prey.json similarity index 100% rename from src/main/resources/data/unusualfishmod/tags/entity_types/tiger_puffer_prey.json rename to src/main/resources/data/unusualfishmod/tags/entity_type/tiger_puffer_prey.json diff --git a/src/main/resources/data/unusualfishmod/tags/entity_types/volt_undetected.json b/src/main/resources/data/unusualfishmod/tags/entity_type/volt_undetected.json similarity index 51% rename from src/main/resources/data/unusualfishmod/tags/entity_types/volt_undetected.json rename to src/main/resources/data/unusualfishmod/tags/entity_type/volt_undetected.json index d6649e7..a22514f 100644 --- a/src/main/resources/data/unusualfishmod/tags/entity_types/volt_undetected.json +++ b/src/main/resources/data/unusualfishmod/tags/entity_type/volt_undetected.json @@ -1,4 +1,5 @@ { + "replace": false, "values": [ ] } \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/tags/items/cooked_unusual_fish.json b/src/main/resources/data/unusualfishmod/tags/item/cooked_unusual_fish.json similarity index 91% rename from src/main/resources/data/unusualfishmod/tags/items/cooked_unusual_fish.json rename to src/main/resources/data/unusualfishmod/tags/item/cooked_unusual_fish.json index 8941ec4..20a569f 100644 --- a/src/main/resources/data/unusualfishmod/tags/items/cooked_unusual_fish.json +++ b/src/main/resources/data/unusualfishmod/tags/item/cooked_unusual_fish.json @@ -1,4 +1,5 @@ { + "replace": false, "values": [ "unusualfishmod:cooked_aero_mono_stick", "unusualfishmod:cooked_mossthorn", diff --git a/src/main/resources/data/unusualfishmod/tags/items/raw_unusual_fish.json b/src/main/resources/data/unusualfishmod/tags/item/raw_unusual_fish.json similarity index 97% rename from src/main/resources/data/unusualfishmod/tags/items/raw_unusual_fish.json rename to src/main/resources/data/unusualfishmod/tags/item/raw_unusual_fish.json index 90ea82a..09789c0 100644 --- a/src/main/resources/data/unusualfishmod/tags/items/raw_unusual_fish.json +++ b/src/main/resources/data/unusualfishmod/tags/item/raw_unusual_fish.json @@ -1,4 +1,5 @@ { + "replace": false, "values": [ "unusualfishmod:raw_eyelash", "unusualfishmod:raw_spindlefish", diff --git a/src/main/resources/data/unusualfishmod/tags/items/unusual_catch.json b/src/main/resources/data/unusualfishmod/tags/item/unusual_catch.json similarity index 94% rename from src/main/resources/data/unusualfishmod/tags/items/unusual_catch.json rename to src/main/resources/data/unusualfishmod/tags/item/unusual_catch.json index f632ec5..5bc69c2 100644 --- a/src/main/resources/data/unusualfishmod/tags/items/unusual_catch.json +++ b/src/main/resources/data/unusualfishmod/tags/item/unusual_catch.json @@ -1,4 +1,5 @@ { + "replace": false, "values": [ "#unusualfishmod:raw_unusual_fish", "unusualfishmod:lobster_spike", diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index b00c310..7f02c72 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,7 +1,7 @@ { "pack": { "description": "unusualfish resources", - "pack_format": 6, + "pack_format": 34, "_comment": "A pack_format of 6 requires json lang files and some texture changes from 1.16.2. Note: we require v6 pack meta for all mods." } } From ade14fd225c3f04f9c81309186edc5dfe1c37acc Mon Sep 17 00:00:00 2001 From: Chakyl Date: Tue, 16 Jun 2026 17:48:43 -0400 Subject: [PATCH 02/12] gradle and stuff --- .gitattributes | 2 +- .gitignore | 53 ++-- build.gradle | 268 +++++++++--------- gradle.properties | 59 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 37 ++- gradlew.bat | 26 +- settings.gradle | 9 +- .../templates/META-INF/neoforge.mods.toml | 89 ++++++ 10 files changed, 327 insertions(+), 219 deletions(-) create mode 100644 src/main/templates/META-INF/neoforge.mods.toml diff --git a/.gitattributes b/.gitattributes index f811f6a..b7bbcc4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,5 @@ # Disable autocrlf on generated files, they always generate with LF # Add any extra files or paths here to make git stop saying they # are changed when only line endings change. -src/generated/**/.cache/cache text eol=lf +src/generated/**/.cache/* text eol=lf src/generated/**/*.json text eol=lf diff --git a/.gitignore b/.gitignore index 12f8644..fee2f7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,40 @@ -# eclipse -bin -*.launch -.settings -.metadata -.classpath -.project +### Gradle ### +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/**/build/ -# idea -out -*.ipr +### IntelliJ IDEA ### +.idea/ *.iws *.iml -.idea +*.ipr +out/ +!**/src/**/out/ -# gradle -build -.gradle +.run/ + +### Eclipse ### +.apt_generated +.classpath +.eclipse/ +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/**/bin/ + +### VS Code ### +.vscode/ -# other -eclipse -run +### Mac OS ### +.DS_Store -# Files from Forge MDK -forge*changelog.txt +### Minecraft Modding ### +run/ +!**/src/**/run/ +**/src/generated/**/.cache/ +repo/ +!**/src/**/repo/ diff --git a/build.gradle b/build.gradle index 26962f5..e876c6d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,185 +1,191 @@ plugins { - id 'eclipse' - id 'idea' + id 'java-library' id 'maven-publish' - id 'net.minecraftforge.gradle' version '[6.0,6.2)' - id 'org.spongepowered.mixin' version '0.7.+' + id 'net.neoforged.moddev' version '2.0.141' + id 'idea' +} + +tasks.named('wrapper', Wrapper).configure { + // Define wrapper values here so as to not have to always do so when updating gradlew.properties. + // Switching this to Wrapper.DistributionType.ALL will download the full gradle sources that comes with + // documentation attached on cursor hover of gradle classes and methods. However, this comes with increased + // file size for Gradle. If you do switch this to ALL, run the Gradle wrapper task twice afterwards. + // (Verify by checking gradle/wrapper/gradle-wrapper.properties to see if distributionUrl now points to `-all`) + distributionType = Wrapper.DistributionType.BIN } version = mod_version group = mod_group_id +sourceSets.main.resources { + // Include resources generated by data generators. + srcDir('src/generated/resources') + + // Exclude common development only resources from finalized outputs + exclude("**/*.bbmodel") // BlockBench project files + exclude("src/generated/**/.cache") // datagen cache files +} + +repositories { + // Add here additional repositories if required by some of the dependencies below. + maven { + name = 'GeckoLib' + url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' + content { + includeGroupByRegex("software\\.bernie.*") + includeGroup("com.eliotlash.mclib") + } + } +} + base { archivesName = mod_id } -// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. -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 { - // The mappings can be changed at any time and must be in the following format. - // Channel: Version: - // official MCVersion Official field/method names from Mojang mapping files - // parchment YYYY.MM.DD-MCVersion Open community-sourced parameter names and javadocs layered on top of official - // - // You must be aware of the Mojang license when using the 'official' or 'parchment' mappings. - // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md - // - // Parchment is an unofficial project maintained by ParchmentMC, separate from MinecraftForge - // Additional setup is needed to use their mappings: https://parchmentmc.org/docs/getting-started - // - // Use non-default mappings at your own risk. They may not always work. - // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: mapping_channel, version: mapping_version - - // When true, this property will have all Eclipse/IntelliJ IDEA run configurations run the "prepareX" task for the given run configuration before launching the game. - // In most cases, it is not necessary to enable. - // enableEclipsePrepareRuns = true - // enableIdeaPrepareRuns = true - - // This property allows configuring Gradle's ProcessResources task(s) to run on IDE output locations before launching the game. - // It is REQUIRED to be set to true for this template to function. - // See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html - copyIdeResources = true - - // When true, this property will add the folder name of all declared run configurations to generated IDE run configurations. - // The folder name can be set on a run configuration using the "folderName" property. - // By default, the folder name of a run configuration is the name of the Gradle project containing it. - // generateRunFolders = true - - // This property enables access transformers for use in development. - // They will be applied to the Minecraft artifact. - // The access transformer file can be anywhere in the project. - // However, it must be at "META-INF/accesstransformer.cfg" in the final mod jar to be loaded by Forge. - // This default location is a best practice to automatically put the file in the right place in the final jar. - // See https://docs.minecraftforge.net/en/latest/advanced/accesstransformers/ for more information. - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - // applies to all the run configs below - configureEach { - workingDirectory project.file('run') +// Mojang ships Java 21 to end users in 1.21.1, so mods should target Java 21. +java.toolchain.languageVersion = JavaLanguageVersion.of(21) - // Recommended logging data for a userdev environment - // The markers can be added/remove as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' +neoForge { + // Specify the version of NeoForge to use. + version = project.neo_version - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' + parchment { + mappingsVersion = project.parchment_mappings_version + minecraftVersion = project.parchment_minecraft_version + } - mods { - "${mod_id}" { - source sourceSets.main - } - } - } + // This line is optional. Access Transformers are automatically detected +// accessTransformers = project.files('src/main/resources/META-INF/accesstransformer.cfg') + // Default run configurations. + // These can be tweaked, removed, or duplicated as needed. + runs { client { + client() + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - property 'forge.enabledGameTestNamespaces', mod_id + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } server { - property 'forge.enabledGameTestNamespaces', mod_id - args '--nogui' + server() + programArgument '--nogui' + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } // This run config launches GameTestServer and runs all registered gametests, then exits. // By default, the server will crash when no gametests are provided. // The gametest system is also enabled by default for other run configs under the /test command. gameTestServer { - property 'forge.enabledGameTestNamespaces', mod_id + type = "gameTestServer" + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } data { - // example of overriding the workingDirectory set in configureEach above - workingDirectory project.file('run-data') + data() + + // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it + // gameDirectory = project.file('run-data') // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + } + + // applies to all the run configs above + configureEach { + // Recommended logging data for a userdev environment + // The markers can be added/remove as needed separated by commas. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. + systemProperty 'forge.logging.markers', 'REGISTRIES' + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels + logLevel = org.slf4j.event.Level.DEBUG } } -} -// Include resources generated by data generators. -sourceSets.main.resources { srcDir 'src/generated/resources' } + mods { + // define mod <-> source bindings + // these are used to tell the game which sources are for which mod + // multi mod projects should define one per mod + "${mod_id}" { + sourceSet(sourceSets.main) + } + } +} -repositories { - maven { url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' } +// Sets up a dependency configuration called 'localRuntime'. +// This configuration should be used instead of 'runtimeOnly' to declare +// a dependency that will be present for runtime testing but that is +// "optional", meaning it will not be pulled by dependents of this mod. +configurations { + runtimeClasspath.extendsFrom localRuntime } dependencies { - // Specify the version of Minecraft to use. - // Any artifact can be supplied so long as it has a "userdev" classifier artifact and is a compatible patcher artifact. - // The "userdev" classifier will be requested and setup by ForgeGradle. - // If the group id is "net.minecraft" and the artifact id is one of ["client", "server", "joined"], - // then special handling is done to allow a setup of a vanilla dependency without the use of an external repository. - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - - implementation fg.deobf('software.bernie.geckolib:geckolib-forge-1.20.1:4.4.9') - annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' + // Example optional mod dependency with JEI + // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime + // compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}" + // compileOnly "mezz.jei:jei-${mc_version}-neoforge-api:${jei_version}" + // We add the full version to localRuntime, not runtimeOnly, so that we do not publish a dependency on it + // localRuntime "mezz.jei:jei-${mc_version}-neoforge:${jei_version}" + + // Example mod dependency using a mod jar from ./libs with a flat dir repository + // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar + // The group id is ignored when searching -- in this case, it is "blank" + // implementation "blank:coolmod-${mc_version}:${coolmod_version}" + + // Example mod dependency using a file as dependency + // implementation files("libs/coolmod-${mc_version}-${coolmod_version}.jar") + + implementation "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}" + // Example project dependency using a sister or child project: + // implementation project(":myproject") + + // For more info: + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html } // This block of code expands all declared replace properties in the specified resource targets. // A missing property will result in an error. Properties are expanded using ${} Groovy notation. -// When "copyIdeResources" is enabled, this will also run before the game launches in IDE environments. -// See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html -tasks.named('processResources', ProcessResources).configure { +var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { var replaceProperties = [ - minecraft_version: minecraft_version, minecraft_version_range: minecraft_version_range, - forge_version: forge_version, forge_version_range: forge_version_range, - loader_version_range: loader_version_range, - mod_id: mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version, - mod_authors: mod_authors, mod_description: mod_description, + minecraft_version : minecraft_version, + minecraft_version_range: minecraft_version_range, + neo_version : neo_version, + loader_version_range : loader_version_range, + mod_authors : mod_authors, + mod_description : mod_description, + mod_id : mod_id, + mod_name : mod_name, + mod_license : mod_license, + mod_version : mod_version, ] inputs.properties replaceProperties - - filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { - expand replaceProperties + [project: project] - } -} - -// Example for how to get properties into the manifest for reading at runtime. -tasks.named('jar', Jar).configure { - manifest { - attributes([ - 'Specification-Title' : mod_id, - 'Specification-Vendor' : mod_authors, - 'Specification-Version' : '1', // We are version 1 of ourselves - 'Implementation-Title' : project.name, - 'Implementation-Version' : project.jar.archiveVersion, - 'Implementation-Vendor' : mod_authors, - 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } - - // This is the preferred method to reobfuscate your jar file - finalizedBy 'reobfJar' + expand replaceProperties + from "src/main/templates" + into "build/generated/sources/modMetadata" } - -// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing: -// tasks.named('publish').configure { -// dependsOn 'reobfJar' -// } +// Include the output of "generateModMetadata" as an input directory for the build +// this works with both building through Gradle and the IDE. +sourceSets.main.resources.srcDir generateModMetadata +// To avoid having to run "generateModMetadata" manually, make it run on every project reload +neoForge.ideSyncTask generateModMetadata // Example configuration to allow publishing using the maven-publish plugin publishing { publications { register('mavenJava', MavenPublication) { - artifact jar + from components.java } } repositories { maven { - url "file://${project.projectDir}/mcmodsrepo" + url "file://${project.projectDir}/repo" } } } @@ -187,3 +193,11 @@ publishing { tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation } + +// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. +idea { + module { + downloadSources = true + downloadJavadoc = true + } +} diff --git a/gradle.properties b/gradle.properties index 671b1cf..5e773da 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,43 +1,28 @@ # 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=-Xmx3G -org.gradle.daemon=false +org.gradle.jvmargs=-Xmx1G +org.gradle.daemon=true +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true - -## Environment Properties - -# The Minecraft version must agree with the Forge version to get a valid artifact -minecraft_version=1.20.1 +#read more on this at https://github.com/neoforged/ModDevGradle?tab=readme-ov-file#better-minecraft-parameter-names--javadoc-parchment +# you can also find the latest versions at: https://parchmentmc.org/docs/getting-started +parchment_minecraft_version=1.21.1 +parchment_mappings_version=2024.11.17 +# Environment Properties +# You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge +# The Minecraft version must agree with the Neo version to get a valid artifact +minecraft_version=1.21.1 # The Minecraft version range can use any release version of Minecraft as bounds. # Snapshots, pre-releases, and release candidates are not guaranteed to sort properly # as they do not follow standard versioning conventions. -minecraft_version_range=[1.20.1,1.21) -# The Forge version must agree with the Minecraft version to get a valid artifact -forge_version=47.2.0 -# The Forge version range can use any version of Forge as bounds or match the loader version range -forge_version_range=[47,) -# The loader version range can only use the major version of Forge/FML as bounds -loader_version_range=[47,) -# The mapping channel to use for mappings. -# The default set of supported mapping channels are ["official", "snapshot", "snapshot_nodoc", "stable", "stable_nodoc"]. -# Additional mapping channels can be registered through the "channelProviders" extension in a Gradle plugin. -# -# | Channel | Version | | -# |-----------|----------------------|--------------------------------------------------------------------------------| -# | official | MCVersion | Official field/method names from Mojang mapping files | -# | parchment | YYYY.MM.DD-MCVersion | Open community-sourced parameter names and javadocs layered on top of official | -# -# You must be aware of the Mojang license when using the 'official' or 'parchment' mappings. -# See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md -# -# Parchment is an unofficial project maintained by ParchmentMC, separate from Minecraft Forge. -# Additional setup is needed to use their mappings, see https://parchmentmc.org/docs/getting-started -mapping_channel=official -# The mapping version to query from the mapping channel. -# This must match the format required by the mapping channel. -mapping_version=1.20.1 - +minecraft_version_range=[1.21.1] +# The Neo version must agree with the Minecraft version to get a valid artifact +neo_version=21.1.233 +# The loader version range can only use the major version of FML as bounds +loader_version_range=[1,) +geckolib_version=4.8.4 ## Mod Properties # The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} @@ -48,12 +33,12 @@ mod_name=Unusual Fish Mod # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPLv3 # The mod version. See https://semver.org/ -mod_version=1.1.10 +mod_version=1.21.1-1.1.10 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html mod_group_id=codyhuh.unusualfishmod # The authors of the mod. This is a simple text string that is used for display purposes in the mod list. -mod_authors=codyhuh (code), OmayPaty (art), Peeko (former author) +mod_authors=codyhuh (code), OmayPaty (art), Peeko (former author), Chakyl (Code) # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. -mod_description=A mod that adds a variety of new aquatic creatures, both useful and aesthetic! +mod_description=A mod that adds a variety of new aquatic creatures, both useful and aesthetic! \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch literal 43764 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 ScNgau(U?ep-K_E5zy1%ZQTdPn diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d..23449a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68..23d15a9 100644 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,10 +85,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -133,10 +133,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +147,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +155,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,16 +200,20 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 93e3f59..db3a6ac 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,22 +59,22 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/settings.gradle b/settings.gradle index dc88667..7a488e3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,14 +1,9 @@ pluginManagement { repositories { gradlePluginPortal() - maven { - name = 'MinecraftForge' - url = 'https://maven.minecraftforge.net/' - } - maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } } } plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' -} \ No newline at end of file + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' +} diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..988013c --- /dev/null +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -0,0 +1,89 @@ +# This is an example neoforge.mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml +# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml +modLoader="javafml" #mandatory +# A version range to match for said mod loader - for regular FML @Mod it will be the FML version. This is currently 2. +loaderVersion="${loader_version_range}" #mandatory +# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. +# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. +license="${mod_license}" +# A URL to refer people to when problems occur with this mod +#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId="${mod_id}" #mandatory +# The version number of the mod +version="${mod_version}" #mandatory +# A display name for the mod +displayName="${mod_name}" #mandatory + +# A URL to query for updates for this mod. See the JSON update specification https://docs.neoforged.net/docs/misc/updatechecker/ +#updateJSONURL="https://change.me.example.invalid/updates.json" #optional + +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional + +# A file name (in the root of the mod JAR) containing a logo for display +#logoFile="examplemod.png" #optional + +# A text field displayed in the mod UI +credits="Mango (sound designer & composer)" #optional +# A text field displayed in the mod UI +authors="${mod_authors}" #optional +# An ordering relationship for the dependency - BEFORE or AFTER required if the dependency is not mandatory +# BEFORE - This mod is loaded BEFORE the dependency +# AFTER - This mod is loaded AFTER the dependency +ordering="NONE" +# Side this dependency is applied on - BOTH, CLIENT, or SERVER +side="BOTH" +# The description text for the mod (multi line!) (#mandatory) +description='''${mod_description}''' + +# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded. +#[[mixins]] +#config="${mod_id}.mixins.json" + +# The [[accessTransformers]] block allows you to declare where your AT file is. +# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg +#[[accessTransformers]] +#file="META-INF/accesstransformer.cfg" + +# The coremods config file path is not configurable and is always loaded from META-INF/coremods.json + +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.${mod_id}]] #optional + # the modid of the dependency + modId="neoforge" #mandatory + # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). + # 'required' requires the mod to exist, 'optional' does not + # 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning + type="required" #mandatory + # Optional field describing why the dependency is required or why it is incompatible + # reason="..." + # The version range of the dependency + versionRange="[${neo_version},)" #mandatory + # An ordering relationship for the dependency. + # BEFORE - This mod is loaded BEFORE the dependency + # AFTER - This mod is loaded AFTER the dependency + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT, or SERVER + side="BOTH" + +# Here's another dependency +[[dependencies.${mod_id}]] + modId="minecraft" + type="required" + # This version range declares a minimum of the current minecraft version up to but not including the next major version + versionRange="${minecraft_version_range}" + ordering="NONE" + side="BOTH" + +# Features are specific properties of the game environment, that you may want to declare you require. This example declares +# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't +# stop your mod loading on the server for example. +#[features.${mod_id}] +#openGLVersion="[3.2,)" From 7bb5cc3b8b44c71c5b05380c5e38a1c04ba46913 Mon Sep 17 00:00:00 2001 From: Chakyl Date: Tue, 16 Jun 2026 22:01:40 -0400 Subject: [PATCH 03/12] Recipe fixes, todo clears, and seafoam most important of all --- .../misc/render/AbyssalBlastRenderer.java | 1 - .../unusualfishmod/common/CommonEvents.java | 15 +- .../block_entity/VoltDetectorBlockEntity.java | 7 +- .../common/entity/CrimsonshellSquid.java | 4 +- .../common/entity/FreshwaterMantis.java | 3 +- .../common/entity/TigerPuffer.java | 3 +- .../common/entity/TrumpetSquid.java | 4 +- .../common/entity/item/AbyssalBlast.java | 2 +- .../common/entity/item/SeaSpike.java | 1 + .../entity/item/ThrownPrismarineSpear.java | 27 +++- .../entity/util/goal/SquidLayEggsGoal.java | 4 +- .../common/item/PrismarineSpearItem.java | 147 ++++++++++++------ .../common/item/RipsawItem.java | 12 +- .../core/registry/UFSounds.java | 2 + .../unusualfishmod/jukebox_song/seafoam.json | 8 + .../ancient_weapon_smithing_template.json | 25 +++ .../recipe/chiseled_crimson_bricks.json | 16 ++ .../chiseled_crimson_bricks_from_tiles.json | 16 ++ ...rimson_bricks_from_tiles_stonecutting.json | 10 ++ .../chiseled_crimson_bricks_stonecutting.json | 10 ++ .../recipe/chiseled_relucent_bricks.json | 16 ++ .../chiseled_relucent_bricks_from_tiles.json | 16 ++ ...lucent_bricks_from_tiles_stonecutting.json | 10 ++ ...chiseled_relucent_bricks_stonecutting.json | 10 ++ .../recipe/cooked_aero_mono_stick.json | 11 ++ ...aero_mono_stick_from_campfire_cooking.json | 11 ++ .../cooked_aero_mono_stick_from_smoking.json | 11 ++ .../recipe/cooked_blizzard_tuna.json | 11 ++ ...d_blizzard_tuna_from_campfire_cooking.json | 11 ++ .../cooked_blizzard_tuna_from_smoking.json | 11 ++ .../unusualfishmod/recipe/cooked_fillet.json | 11 ++ .../cooked_fillet_from_campfire_cooking.json | 11 ++ .../recipe/cooked_fillet_from_smoking.json | 11 ++ .../unusualfishmod/recipe/cooked_lobster.json | 11 ++ .../cooked_lobster_from_campfire_cooking.json | 11 ++ .../recipe/cooked_lobster_from_smoking.json | 11 ++ .../recipe/cooked_mossthorn.json | 11 ++ ...ooked_mossthorn_from_campfire_cooking.json | 11 ++ .../recipe/cooked_mossthorn_from_smoking.json | 11 ++ .../recipe/cooked_shockcat.json | 11 ++ ...cooked_shockcat_from_campfire_cooking.json | 11 ++ .../recipe/cooked_shockcat_from_smoking.json | 11 ++ .../unusualfishmod/recipe/copper_antenna.json | 19 +++ .../recipe/crimson_brick_slab.json | 15 ++ .../crimson_brick_slab_stonecutting.json | 10 ++ .../recipe/crimson_brick_stairs.json | 17 ++ .../crimson_brick_stairs_stonecutting.json | 10 ++ .../recipe/crimson_brick_wall.json | 16 ++ .../crimson_brick_wall_stonecutting.json | 10 ++ .../unusualfishmod/recipe/crimson_bricks.json | 16 ++ .../recipe/crimson_tile_slab.json | 15 ++ ...son_tile_slab_from_tiles_stonecutting.json | 10 ++ .../crimson_tile_slab_stonecutting.json | 10 ++ .../recipe/crimson_tile_stairs.json | 17 ++ ...n_tile_stairs_from_tiles_stonecutting.json | 10 ++ .../crimson_tile_stairs_stonecutting.json | 10 ++ .../recipe/crimson_tile_wall.json | 16 ++ ...son_tile_wall_from_tiles_stonecutting.json | 10 ++ .../crimson_tile_wall_stonecutting.json | 10 ++ .../unusualfishmod/recipe/crimson_tiles.json | 16 ++ .../recipe/crimson_tiles_stonecutting.json | 10 ++ .../recipe/depth_scythe_smithing.json | 15 ++ .../unusualfishmod/recipe/lobster_roll.json | 15 ++ .../unusualfishmod/recipe/nautical_lamp.json | 26 ++++ .../unusualfishmod/recipe/odd_fishsticks.json | 15 ++ .../unusualfishmod/recipe/pickledish.json | 25 +++ .../recipe/prismarine_spear.json | 20 +++ .../recipe/raw_aero_mono_stick.json | 15 ++ .../recipe/relucent_brick_slab.json | 15 ++ .../relucent_brick_slab_stonecutting.json | 10 ++ .../recipe/relucent_brick_stairs.json | 17 ++ .../relucent_brick_stairs_stonecutting.json | 10 ++ .../recipe/relucent_brick_wall.json | 16 ++ .../relucent_brick_wall_stonecutting.json | 10 ++ .../recipe/relucent_bricks.json | 16 ++ .../recipe/relucent_tile_slab.json | 15 ++ ...ent_tile_slab_from_tiles_stonecutting.json | 10 ++ .../relucent_tile_slab_stonecutting.json | 10 ++ .../recipe/relucent_tile_stairs.json | 17 ++ ...t_tile_stairs_from_tiles_stonecutting.json | 10 ++ .../relucent_tile_stairs_stonecutting.json | 10 ++ .../recipe/relucent_tile_wall.json | 16 ++ ...ent_tile_wall_from_tiles_stonecutting.json | 10 ++ .../relucent_tile_wall_stonecutting.json | 10 ++ .../unusualfishmod/recipe/relucent_tiles.json | 16 ++ .../recipe/relucent_tiles_stonecutting.json | 10 ++ .../recipe/ripsaw_smithing.json | 15 ++ .../data/unusualfishmod/recipe/sea_boom.json | 23 +++ .../unusualfishmod/recipe/strange_broth.json | 29 ++++ .../recipe/unusual_sandwich.json | 23 +++ .../unusualfishmod/recipe/volt_detector.json | 26 ++++ .../unusualfishmod/recipe/weird_goldfish.json | 21 +++ 92 files changed, 1215 insertions(+), 95 deletions(-) create mode 100644 src/main/resources/data/unusualfishmod/jukebox_song/seafoam.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/ancient_weapon_smithing_template.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_from_tiles.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_from_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_from_tiles.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_from_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick_from_campfire_cooking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick_from_smoking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna_from_campfire_cooking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna_from_smoking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_fillet.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_fillet_from_campfire_cooking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_fillet_from_smoking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_lobster.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_lobster_from_campfire_cooking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_lobster_from_smoking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn_from_campfire_cooking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn_from_smoking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_shockcat.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_shockcat_from_campfire_cooking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/cooked_shockcat_from_smoking.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/copper_antenna.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_brick_slab.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_brick_slab_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_brick_stairs.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_brick_stairs_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_brick_wall.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_brick_wall_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_bricks.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab_from_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs_from_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall_from_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tiles.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/crimson_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/depth_scythe_smithing.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/lobster_roll.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/nautical_lamp.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/odd_fishsticks.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/pickledish.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/prismarine_spear.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/raw_aero_mono_stick.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_brick_slab.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_brick_slab_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_brick_stairs.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_brick_stairs_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_brick_wall.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_brick_wall_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_bricks.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab_from_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs_from_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall_from_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tiles.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/relucent_tiles_stonecutting.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/ripsaw_smithing.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/sea_boom.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/strange_broth.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/unusual_sandwich.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/volt_detector.json create mode 100644 src/main/resources/data/unusualfishmod/recipe/weird_goldfish.json diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java index 2363902..4f92b45 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java @@ -68,7 +68,6 @@ public ResourceLocation getTextureLocation(AbyssalBlast entity) { return TEXTURE_0; } - // TODO: Chakyl test public void drawVertex(Matrix4f matrixPos, PoseStack.Pose pose, VertexConsumer buffer, int x, int y, int z, float u, float v, int normalX, int normalY, int normalZ, int packedLight) { buffer.addVertex(matrixPos, (float) x, (float) y, (float) z).setColor(255, 255, 255, 255).setUv(u, v).setOverlay(OverlayTexture.NO_OVERLAY).setLight(packedLight).setNormal(pose, (float) normalX, (float) normalY, (float) normalZ); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java b/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java index bf8bbc4..628afd7 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java +++ b/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java @@ -26,19 +26,10 @@ public class CommonEvents { @SubscribeEvent public static void commonSetup(FMLCommonSetupEvent e) { - // TODO: chakyl dispense -// e.enqueueWork(() -> { -// DispenserBlock.registerBehavior(UFItems.PRISMARINE_SPEAR.get(), new ProjectileDispenseBehavior(UFItems.PRISMARINE_SPEAR.get()) { -// @Override -// protected Projectile getProjectile(Level level, Position pos, ItemStack stack) { -// ThrownPrismarineSpear spear = new ThrownPrismarineSpear(UFEntities.PRISMARINE_SPEAR.get(), pos.x(), pos.y(), pos.z(), level); -// spear.pickup = AbstractArrow.Pickup.ALLOWED; -// return spear; -// } -// }); -// }); + e.enqueueWork(() -> { + DispenserBlock.registerProjectileBehavior(UFItems.PRISMARINE_SPEAR.get()); + }); } - @SubscribeEvent public static void registerSpawnPlacements(RegisterSpawnPlacementsEvent e) { e.register(UFEntities.AERO_MONO.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, AeroMono::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); diff --git a/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java index caa41b3..9d5750d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java @@ -56,10 +56,9 @@ public static void serverTick(Level level, BlockPos pos, BlockState state, VoltD private static void nearDetector(Level level, BlockPos pos, double radius) { AABB aabb = new AABB(pos); - // TODO: Tag fix -// currentList = level.getEntitiesOfClass(LivingEntity.class, aabb.inflate(radius), e -> { -// return !e.getType().is(UFTags.VOLT_UNDETECTED) && !e.isCrouching(); -// }); + currentList = level.getEntitiesOfClass(LivingEntity.class, aabb.inflate(radius), e -> { + return !e.getType().is(UFTags.VOLT_UNDETECTED) && !e.isCrouching(); + }); BlockPos blockpos = new BlockPos((int) (aabb.minX - radius), (int) (aabb.minY - radius), (int) (aabb.minZ - radius)); BlockPos blockpos1 = new BlockPos((int) (aabb.maxX + radius), (int) (aabb.maxY + radius), (int) (aabb.maxZ + radius)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java index 728cd2d..3aeab77 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java @@ -102,9 +102,7 @@ public boolean canUse() { @Override public boolean isFood(ItemStack stack) { - return true; - // TODO: tag -// return stack.is(UFTags.RAW_UNUSUAL_FISH); + return stack.is(UFTags.RAW_UNUSUAL_FISH); } @Nullable diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java b/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java index 5f3ffc1..94a0522 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java @@ -53,8 +53,7 @@ protected void registerGoals() { this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.8D)); this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 1.0F)); this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); - // TODO: Tag fix -// this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, e -> e.getType().is(UFTags.SNAILS))); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, e -> e.getType().is(UFTags.SNAILS))); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AeroMono.class, true)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, SneepSnorp.class, true)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, RhinoTetra.class, true)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java index 670fdbb..363ccb1 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java @@ -80,8 +80,7 @@ public boolean canUse() { return !this.mob.isInWater() && super.canUse(); } }); - // TODO: Tag fix -// this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, false, e -> e.getType().is(UFTags.TIGER_PUFFER_PREY))); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, false, e -> e.getType().is(UFTags.TIGER_PUFFER_PREY))); } public void aiStep() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java index 820ff19..91c7783 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java @@ -108,9 +108,7 @@ public void aiStep() { @Override public boolean isFood(ItemStack stack) { - // todo: tag -// return stack.is(UFTags.RAW_UNUSUAL_FISH); - return true; + return stack.is(UFTags.RAW_UNUSUAL_FISH); } protected PathNavigation createNavigation(Level p_27480_) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java index 5d3f024..40d5f71 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java @@ -30,7 +30,7 @@ public class AbyssalBlast extends Entity { private UUID ownerUUID; private int ownerNetworkId; private boolean leftOwner; - // TODO: chakyl test + public AbyssalBlast(EntityType p_i50162_1_, Level p_i50162_2_) { super(p_i50162_1_, p_i50162_2_); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java index 8910db0..cca0568 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java @@ -16,6 +16,7 @@ public class SeaSpike extends AbstractArrow { public SeaSpike(EntityType type, Level level) { super(type, level); hostileOnly = false; + this.pickup = AbstractArrow.Pickup.DISALLOWED; } public SeaSpike(EntityType p_36711_, double p_36712_, double p_36713_, double p_36714_, Level p_36715_) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java index e156439..310f5cb 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java @@ -24,18 +24,27 @@ public class ThrownPrismarineSpear extends AbstractArrow { private ItemStack spearItem = new ItemStack(UFItems.PRISMARINE_SPEAR.get()); private boolean dealtDamage; - public ThrownPrismarineSpear(EntityType p_36711_, double p_36712_, double p_36713_, double p_36714_, Level p_36715_) { - this(p_36711_, p_36715_); - this.setPos(p_36712_, p_36713_, p_36714_); + public ThrownPrismarineSpear(EntityType entityType, Level level) { + super(entityType, level); } - public ThrownPrismarineSpear(EntityType p_37561_, Level p_37562_) { - super(p_37561_, p_37562_); + public ThrownPrismarineSpear(Level level, double x, double y, double z, ItemStack pickupItemStack) { + super(UFEntities.PRISMARINE_SPEAR.get(), level); + this.setPos(x, y, z); + this.spearItem = pickupItemStack.copy(); + } + + public ThrownPrismarineSpear(EntityType entityType, double x, double y, double z, Level level) { + this(entityType, level); + this.setPos(x, y, z); + } public ThrownPrismarineSpear(Level level, LivingEntity livingEntity, ItemStack itemStack) { - super(UFEntities.PRISMARINE_SPEAR.get(), livingEntity, level, itemStack, ItemStack.EMPTY); + super(UFEntities.PRISMARINE_SPEAR.get(), level); this.spearItem = itemStack.copy(); + this.setOwner(livingEntity); + this.setPos(livingEntity.getX(), livingEntity.getEyeY(), livingEntity.getZ()); } public void tick() { @@ -47,11 +56,17 @@ public void tick() { } protected ItemStack getPickupItem() { + if (this.spearItem == null) { + return new ItemStack(UFItems.PRISMARINE_SPEAR.get()); + } return this.spearItem.copy(); } @Override protected ItemStack getDefaultPickupItem() { + if (this.spearItem == null) { + return new ItemStack(UFItems.PRISMARINE_SPEAR.get()); + } return this.spearItem.copy(); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/SquidLayEggsGoal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/SquidLayEggsGoal.java index 28357db..8116f19 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/SquidLayEggsGoal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/SquidLayEggsGoal.java @@ -54,9 +54,7 @@ public void tick() { @Override protected boolean isValidTarget(LevelReader level, BlockPos blockPos) { - return false; - // todo: tag -// return !level.getBlockState(blockPos).is(UFTags.SQUID_EGGS) && level.isWaterAt(blockPos) && level.getBlockState(blockPos.below()).canOcclude(); + return !level.getBlockState(blockPos).is(UFTags.SQUID_EGGS) && level.isWaterAt(blockPos) && level.getBlockState(blockPos.below()).canOcclude(); } @Override diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java index a2846f6..b52fea6 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java @@ -1,113 +1,158 @@ package codyhuh.unusualfishmod.common.item; import codyhuh.unusualfishmod.common.entity.item.ThrownPrismarineSpear; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; +import codyhuh.unusualfishmod.core.registry.UFEntities; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.Position; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.stats.Stats; +import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TridentItem; -import net.minecraft.world.item.UseAnim; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.*; import net.minecraft.world.item.component.ItemAttributeModifiers; +import net.minecraft.world.item.component.Tool; +import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.ItemAbilities; +import net.neoforged.neoforge.common.ItemAbility; + +import java.util.List; import static codyhuh.unusualfishmod.UnusualFishMod.loc; -public class PrismarineSpearItem extends Item { - public static final ResourceLocation BASE_ATTACK_DAMAGE_ID = loc("base_attack_damage"); - public static final ResourceLocation BASE_ATTACK_SPEED_ID = loc("base_attack_speed"); +public class PrismarineSpearItem extends Item implements ProjectileItem { + public static final int THROW_THRESHOLD_TIME = 10; + public static final float BASE_DAMAGE = 8.0F; + public static final float SHOOT_POWER = 2.5F; - public PrismarineSpearItem(Item.Properties p_43381_) { - super(p_43381_.component(DataComponents.ATTRIBUTE_MODIFIERS, createAttributes())); + public PrismarineSpearItem(Item.Properties properties) { + super(properties); } - // TODO: Chakyl test + public static ItemAttributeModifiers createAttributes() { - return ItemAttributeModifiers.builder() - .add( Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_ID, 5.0D, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) - .add(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_ID, -2.9D, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).build(); + return ItemAttributeModifiers.builder().add(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_ID, (double)8.0F, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).add(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_ID, (double)-2.9F, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).build(); } - public boolean canAttackBlock(BlockState p_43409_, Level p_43410_, BlockPos p_43411_, Player p_43412_) { - return !p_43412_.isCreative(); + + public static Tool createToolProperties() { + return new Tool(List.of(), 1.0F, 2); + } + + public boolean canAttackBlock(BlockState state, Level level, BlockPos pos, Player player) { + return !player.isCreative(); } - public UseAnim getUseAnimation(ItemStack p_43417_) { + public UseAnim getUseAnimation(ItemStack stack) { return UseAnim.SPEAR; } - public int getUseDuration(ItemStack p_43419_) { + public int getUseDuration(ItemStack stack, LivingEntity entity) { return 72000; } - public void releaseUsing(ItemStack stack, Level level, LivingEntity living, int time) { - if (living instanceof Player player) { - int i = this.getUseDuration(stack) - time; + public void releaseUsing(ItemStack stack, Level level, LivingEntity entityLiving, int timeLeft) { + if (entityLiving instanceof Player player) { + int i = this.getUseDuration(stack, entityLiving) - timeLeft; if (i >= 10) { - if (!level.isClientSide) { - // TODO: Chakyl test - stack.hurtAndBreak(1, player, player.getItemInHand(player.getUsedItemHand()).getEquipmentSlot()); - ThrownPrismarineSpear spear = new ThrownPrismarineSpear(level, player, stack); - spear.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, 2.5F, 1.0F); - - if (player.getAbilities().instabuild) { - spear.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + float f = EnchantmentHelper.getTridentSpinAttackStrength(stack, player); + if ((!(f > 0.0F) || player.isInWaterOrRain()) && !isTooDamagedToUse(stack)) { + Holder holder = (Holder)EnchantmentHelper.pickHighestLevel(stack, EnchantmentEffectComponents.TRIDENT_SOUND).orElse(SoundEvents.TRIDENT_THROW); + if (!level.isClientSide) { + stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(entityLiving.getUsedItemHand())); + if (f == 0.0F) { + ThrownPrismarineSpear thrownSpear = new ThrownPrismarineSpear(level, player, stack); + thrownSpear.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, 2.5F, 1.0F); + if (player.hasInfiniteMaterials()) { + thrownSpear.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + } + + level.addFreshEntity(thrownSpear); + level.playSound((Player)null, thrownSpear, (SoundEvent)holder.value(), SoundSource.PLAYERS, 1.0F, 1.0F); + if (!player.hasInfiniteMaterials()) { + player.getInventory().removeItem(stack); + } + } } - level.addFreshEntity(spear); - level.playSound(null, living.getX(), living.getY(), living.getZ(), SoundEvents.TRIDENT_THROW, SoundSource.PLAYERS, 1.0F, 1.0F); - if (!player.getAbilities().instabuild) { - player.getInventory().removeItem(stack); + player.awardStat(Stats.ITEM_USED.get(this)); + if (f > 0.0F) { + float f7 = player.getYRot(); + float f1 = player.getXRot(); + float f2 = -Mth.sin(f7 * ((float)Math.PI / 180F)) * Mth.cos(f1 * ((float)Math.PI / 180F)); + float f3 = -Mth.sin(f1 * ((float)Math.PI / 180F)); + float f4 = Mth.cos(f7 * ((float)Math.PI / 180F)) * Mth.cos(f1 * ((float)Math.PI / 180F)); + float f5 = Mth.sqrt(f2 * f2 + f3 * f3 + f4 * f4); + f2 *= f / f5; + f3 *= f / f5; + f4 *= f / f5; + player.push((double)f2, (double)f3, (double)f4); + player.startAutoSpinAttack(20, 8.0F, stack); + if (player.onGround()) { + float f6 = 1.1999999F; + player.move(MoverType.SELF, new Vec3((double)0.0F, (double)1.1999999F, (double)0.0F)); + } + + level.playSound((Player)null, player, (SoundEvent)holder.value(), SoundSource.PLAYERS, 1.0F, 1.0F); } } - - player.awardStat(Stats.ITEM_USED.get(this)); } } + } - public InteractionResultHolder use(Level p_43405_, Player p_43406_, InteractionHand p_43407_) { - ItemStack itemstack = p_43406_.getItemInHand(p_43407_); - if (itemstack.getDamageValue() >= itemstack.getMaxDamage() - 1) { + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + if (isTooDamagedToUse(itemstack)) { return InteractionResultHolder.fail(itemstack); - } else if ( EnchantmentHelper.getTridentSpinAttackStrength(itemstack, p_43406_) > 0 && !p_43406_.isInWaterOrRain()) { + } else if (EnchantmentHelper.getTridentSpinAttackStrength(itemstack, player) > 0.0F && !player.isInWaterOrRain()) { return InteractionResultHolder.fail(itemstack); } else { - p_43406_.startUsingItem(p_43407_); + player.startUsingItem(hand); return InteractionResultHolder.consume(itemstack); } } - public boolean hurtEnemy(ItemStack p_43390_, LivingEntity p_43391_, LivingEntity p_43392_) { - p_43390_.hurtAndBreak(1, p_43392_, EquipmentSlot.MAINHAND); - return true; + private static boolean isTooDamagedToUse(ItemStack stack) { + return stack.getDamageValue() >= stack.getMaxDamage() - 1; } - public boolean mineBlock(ItemStack p_43399_, Level p_43400_, BlockState p_43401_, BlockPos p_43402_, LivingEntity p_43403_) { - if ((double)p_43401_.getDestroySpeed(p_43400_, p_43402_) != 0.0D) { - - p_43399_.hurtAndBreak(2, p_43403_, EquipmentSlot.MAINHAND); - } - + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { return true; } + public void postHurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + stack.hurtAndBreak(1, attacker, EquipmentSlot.MAINHAND); + } + public int getEnchantmentValue() { return 1; } + + public Projectile asProjectile(Level level, Position pos, ItemStack stack, Direction direction) { + ThrownPrismarineSpear thrownSpear = new ThrownPrismarineSpear(level, pos.x(), pos.y(), pos.z(), stack.copyWithCount(1)); + thrownSpear.pickup = AbstractArrow.Pickup.ALLOWED; + return thrownSpear; + } + + public boolean canPerformAction(ItemStack stack, ItemAbility itemAbility) { + return ItemAbilities.DEFAULT_TRIDENT_ACTIONS.contains(itemAbility); + } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java index 8cb2201..73b5bbb 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java @@ -80,13 +80,11 @@ public void gatherAttachedBlocks(LivingEntity player, BlockPos origin, BlockPos public boolean isTreePart(LivingEntity player, BlockPos pos) { BlockState state = player.level().getBlockState(pos); - // todo: tags - return true; -// if (state.isAir() || state.is(UFTags.UNCHOPPABLE)) { -// return false; -// } else { -// return state.is(BlockTags.LOGS) || state.is(BlockTags.LEAVES); -// } + if (state.isAir() || state.is(UFTags.UNCHOPPABLE)) { + return false; + } else { + return state.is(BlockTags.LOGS) || state.is(BlockTags.LEAVES); + } } @Override diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java index f0f6dcf..896015e 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java @@ -22,7 +22,9 @@ public class UFSounds { public static final DeferredHolder SMALL_ENEMY = createSoundEvent("small_enemy"); public static final DeferredHolder SAWING = createSoundEvent("sawing"); public static final DeferredHolder MUSIC_DISC_SEAFOAM = createSoundEvent("seafoam"); + public static final ResourceKey SEAFOAM_SONG = ResourceKey.create( Registries.JUKEBOX_SONG, UnusualFishMod.loc("seafoam")); + private static DeferredHolder createSoundEvent(final String name) { return SOUND_EVENTS.register(name, () -> SoundEvent.createVariableRangeEvent(loc(name))); } diff --git a/src/main/resources/data/unusualfishmod/jukebox_song/seafoam.json b/src/main/resources/data/unusualfishmod/jukebox_song/seafoam.json new file mode 100644 index 0000000..5b952b5 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/jukebox_song/seafoam.json @@ -0,0 +1,8 @@ +{ + "comparator_output": 15, + "description": { + "translate": "item.unusualfishmod.music_disc_seafoam.desc" + }, + "length_in_seconds": 155.0, + "sound_event": "unusualfishmod:seafoam" +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/ancient_weapon_smithing_template.json b/src/main/resources/data/unusualfishmod/recipe/ancient_weapon_smithing_template.json new file mode 100644 index 0000000..ea41437 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/ancient_weapon_smithing_template.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "minecraft:sand" + }, + "C": { + "tag": "unusualfishmod:raw_unusual_fish" + }, + "S": { + "item": "unusualfishmod:ancient_weapon_smithing_template" + } + }, + "pattern": [ + "#S#", + "#C#", + "###" + ], + "result": { + "count": 2, + "id": "unusualfishmod:ancient_weapon_smithing_template" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks.json b/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks.json new file mode 100644 index 0000000..b6255b3 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "_", + "_" + ], + "key": { + "_": { + "item": "unusualfishmod:crimson_brick_slab" + } + }, + "result": { + "id": "unusualfishmod:chiseled_crimson_bricks", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_from_tiles.json b/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_from_tiles.json new file mode 100644 index 0000000..57159ac --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_from_tiles.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "_", + "_" + ], + "key": { + "_": { + "item": "unusualfishmod:crimson_tile_slab" + } + }, + "result": { + "id": "unusualfishmod:chiseled_crimson_bricks", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_from_tiles_stonecutting.json new file mode 100644 index 0000000..1266fed --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_from_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_tiles" + }, + "result": { + "id": "unusualfishmod:chiseled_crimson_bricks", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_stonecutting.json new file mode 100644 index 0000000..039bff3 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/chiseled_crimson_bricks_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_bricks" + }, + "result": { + "id": "unusualfishmod:chiseled_crimson_bricks", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks.json b/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks.json new file mode 100644 index 0000000..1843fc3 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "_", + "_" + ], + "key": { + "_": { + "item": "unusualfishmod:relucent_brick_slab" + } + }, + "result": { + "id": "unusualfishmod:chiseled_relucent_bricks", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_from_tiles.json b/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_from_tiles.json new file mode 100644 index 0000000..26740f9 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_from_tiles.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "_", + "_" + ], + "key": { + "_": { + "item": "unusualfishmod:relucent_tile_slab" + } + }, + "result": { + "id": "unusualfishmod:chiseled_relucent_bricks", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_from_tiles_stonecutting.json new file mode 100644 index 0000000..f5d4277 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_from_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_tiles" + }, + "result": { + "id": "unusualfishmod:chiseled_relucent_bricks", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_stonecutting.json new file mode 100644 index 0000000..d77d3e4 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/chiseled_relucent_bricks_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_bricks" + }, + "result": { + "id": "unusualfishmod:chiseled_relucent_bricks", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick.json b/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick.json new file mode 100644 index 0000000..bdb2354 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "unusualfishmod:raw_aero_mono_stick" + }, + "result": { + "id": "unusualfishmod:cooked_aero_mono_stick" + }, + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick_from_campfire_cooking.json new file mode 100644 index 0000000..661b724 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick_from_campfire_cooking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "unusualfishmod:raw_aero_mono_stick" + }, + "result": { + "id": "unusualfishmod:cooked_aero_mono_stick" + }, + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick_from_smoking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick_from_smoking.json new file mode 100644 index 0000000..b422893 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_aero_mono_stick_from_smoking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "unusualfishmod:raw_aero_mono_stick" + }, + "result": { + "id": "unusualfishmod:cooked_aero_mono_stick" + }, + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna.json b/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna.json new file mode 100644 index 0000000..b8818bc --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "unusualfishmod:raw_blizzard_tuna" + }, + "result": { + "id": "unusualfishmod:cooked_blizzard_tuna" + }, + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna_from_campfire_cooking.json new file mode 100644 index 0000000..eb206dd --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna_from_campfire_cooking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "unusualfishmod:raw_blizzard_tuna" + }, + "result": { + "id": "unusualfishmod:cooked_blizzard_tuna" + }, + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna_from_smoking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna_from_smoking.json new file mode 100644 index 0000000..87646a7 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_blizzard_tuna_from_smoking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "unusualfishmod:raw_blizzard_tuna" + }, + "result": { + "id": "unusualfishmod:cooked_blizzard_tuna" + }, + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_fillet.json b/src/main/resources/data/unusualfishmod/recipe/cooked_fillet.json new file mode 100644 index 0000000..95fcb9a --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_fillet.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "tag": "unusualfishmod:raw_unusual_fish" + }, + "result": { + "id": "unusualfishmod:cooked_unusual_fillet" + }, + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_fillet_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_fillet_from_campfire_cooking.json new file mode 100644 index 0000000..e35a511 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_fillet_from_campfire_cooking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "tag": "unusualfishmod:raw_unusual_fish" + }, + "result": { + "id": "unusualfishmod:cooked_unusual_fillet" + }, + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_fillet_from_smoking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_fillet_from_smoking.json new file mode 100644 index 0000000..432c3c5 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_fillet_from_smoking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "tag": "unusualfishmod:raw_unusual_fish" + }, + "result": { + "id": "unusualfishmod:cooked_unusual_fillet" + }, + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_lobster.json b/src/main/resources/data/unusualfishmod/recipe/cooked_lobster.json new file mode 100644 index 0000000..920531f --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_lobster.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "unusualfishmod:raw_lobster" + }, + "result": { + "id": "unusualfishmod:cooked_lobster" + }, + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_lobster_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_lobster_from_campfire_cooking.json new file mode 100644 index 0000000..60bc156 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_lobster_from_campfire_cooking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "unusualfishmod:raw_lobster" + }, + "result": { + "id": "unusualfishmod:cooked_lobster" + }, + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_lobster_from_smoking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_lobster_from_smoking.json new file mode 100644 index 0000000..b2143e1 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_lobster_from_smoking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "unusualfishmod:raw_lobster" + }, + "result": { + "id": "unusualfishmod:cooked_lobster" + }, + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn.json b/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn.json new file mode 100644 index 0000000..c212d6c --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "unusualfishmod:raw_mossthorn" + }, + "result": { + "id": "unusualfishmod:cooked_mossthorn" + }, + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn_from_campfire_cooking.json new file mode 100644 index 0000000..2dbce91 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn_from_campfire_cooking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "unusualfishmod:raw_mossthorn" + }, + "result": { + "id": "unusualfishmod:cooked_mossthorn" + }, + "experience": 0.35, + "cookingtime": 300 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn_from_smoking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn_from_smoking.json new file mode 100644 index 0000000..f213c67 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_mossthorn_from_smoking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "unusualfishmod:raw_mossthorn" + }, + "result": { + "id": "unusualfishmod:cooked_mossthorn" + }, + "experience": 0.35, + "cookingtime": 75 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat.json b/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat.json new file mode 100644 index 0000000..4071ad5 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "unusualfishmod:raw_shockcat" + }, + "result": { + "id": "unusualfishmod:cooked_shockcat" + }, + "experience": 0.35, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat_from_campfire_cooking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat_from_campfire_cooking.json new file mode 100644 index 0000000..605eb3f --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat_from_campfire_cooking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:campfire_cooking", + "ingredient": { + "item": "unusualfishmod:raw_shockcat" + }, + "result": { + "id": "unusualfishmod:cooked_shockcat" + }, + "experience": 0.35, + "cookingtime": 600 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat_from_smoking.json b/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat_from_smoking.json new file mode 100644 index 0000000..e080477 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/cooked_shockcat_from_smoking.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:smoking", + "ingredient": { + "item": "unusualfishmod:raw_shockcat" + }, + "result": { + "id": "unusualfishmod:cooked_shockcat" + }, + "experience": 0.35, + "cookingtime": 100 +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/copper_antenna.json b/src/main/resources/data/unusualfishmod/recipe/copper_antenna.json new file mode 100644 index 0000000..6604fd4 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/copper_antenna.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "K", + "c" + ], + "key": { + "K": { + "item": "unusualfishmod:tendril" + }, + "c": { + "item": "minecraft:copper_ingot" + } + }, + "result": { + "id": "unusualfishmod:copper_antenna", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_brick_slab.json b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_slab.json new file mode 100644 index 0000000..5db79ff --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:crimson_bricks" + } + }, + "result": { + "id": "unusualfishmod:crimson_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_brick_slab_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_slab_stonecutting.json new file mode 100644 index 0000000..96ce95b --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_slab_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_bricks" + }, + "result": { + "id": "unusualfishmod:crimson_brick_slab", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_brick_stairs.json b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_stairs.json new file mode 100644 index 0000000..4b0baf0 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:crimson_bricks" + } + }, + "result": { + "id": "unusualfishmod:crimson_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_brick_stairs_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_stairs_stonecutting.json new file mode 100644 index 0000000..74f7c28 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_stairs_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_bricks" + }, + "result": { + "id": "unusualfishmod:crimson_brick_stairs", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_brick_wall.json b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_wall.json new file mode 100644 index 0000000..ef56829 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:crimson_bricks" + } + }, + "result": { + "id": "unusualfishmod:crimson_brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_brick_wall_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_wall_stonecutting.json new file mode 100644 index 0000000..1c31a43 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_brick_wall_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_bricks" + }, + "result": { + "id": "unusualfishmod:crimson_brick_wall", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_bricks.json b/src/main/resources/data/unusualfishmod/recipe/crimson_bricks.json new file mode 100644 index 0000000..f8469bf --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "unusualfishmod:crimson_shard" + } + }, + "result": { + "id": "unusualfishmod:crimson_bricks", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab.json new file mode 100644 index 0000000..ebce485 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:crimson_tiles" + } + }, + "result": { + "id": "unusualfishmod:crimson_tile_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab_from_tiles_stonecutting.json new file mode 100644 index 0000000..83efddd --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab_from_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_tiles" + }, + "result": { + "id": "unusualfishmod:crimson_tile_slab", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab_stonecutting.json new file mode 100644 index 0000000..2d379a6 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_slab_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_bricks" + }, + "result": { + "id": "unusualfishmod:crimson_tile_slab", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs.json new file mode 100644 index 0000000..ca64575 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:crimson_tiles" + } + }, + "result": { + "id": "unusualfishmod:crimson_tile_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs_from_tiles_stonecutting.json new file mode 100644 index 0000000..d179468 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs_from_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_tiles" + }, + "result": { + "id": "unusualfishmod:crimson_tile_stairs", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs_stonecutting.json new file mode 100644 index 0000000..23d17f2 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_stairs_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_bricks" + }, + "result": { + "id": "unusualfishmod:crimson_tile_stairs", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall.json new file mode 100644 index 0000000..76b9264 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:crimson_tiles" + } + }, + "result": { + "id": "unusualfishmod:crimson_tile_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall_from_tiles_stonecutting.json new file mode 100644 index 0000000..881ee82 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall_from_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_tiles" + }, + "result": { + "id": "unusualfishmod:crimson_tile_wall", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall_stonecutting.json new file mode 100644 index 0000000..4a723f6 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tile_wall_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_bricks" + }, + "result": { + "id": "unusualfishmod:crimson_tile_wall", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tiles.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tiles.json new file mode 100644 index 0000000..281a642 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tiles.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "unusualfishmod:crimson_bricks" + } + }, + "result": { + "id": "unusualfishmod:crimson_tiles", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/crimson_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/crimson_tiles_stonecutting.json new file mode 100644 index 0000000..f5625de --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/crimson_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:crimson_bricks" + }, + "result": { + "id": "unusualfishmod:crimson_tiles", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/depth_scythe_smithing.json b/src/main/resources/data/unusualfishmod/recipe/depth_scythe_smithing.json new file mode 100644 index 0000000..8031d0f --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/depth_scythe_smithing.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:smithing_transform", + "template": { + "item": "unusualfishmod:ancient_weapon_smithing_template" + }, + "addition": { + "item": "unusualfishmod:depth_claw" + }, + "base": { + "item": "unusualfishmod:weapon_parts" + }, + "result": { + "id": "unusualfishmod:depth_scythe" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/lobster_roll.json b/src/main/resources/data/unusualfishmod/recipe/lobster_roll.json new file mode 100644 index 0000000..a3feefa --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/lobster_roll.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "unusualfishmod:cooked_lobster" + }, + { + "item": "minecraft:bread" + } + ], + "result": { + "id": "unusualfishmod:lobster_roll", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/nautical_lamp.json b/src/main/resources/data/unusualfishmod/recipe/nautical_lamp.json new file mode 100644 index 0000000..44ec4ab --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/nautical_lamp.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#P#", + "GSG", + "###" + ], + "key": { + "#": { + "item": "minecraft:prismarine_shard" + }, + "P": { + "item": "minecraft:prismarine_crystals" + }, + "G": { + "tag": "c:glass_panes" + }, + "S": { + "item": "unusualfishmod:tendril" + } + }, + "result": { + "id": "unusualfishmod:nautical_lamp", + "count": 3 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/odd_fishsticks.json b/src/main/resources/data/unusualfishmod/recipe/odd_fishsticks.json new file mode 100644 index 0000000..35d7a6d --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/odd_fishsticks.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# #" + ], + "key": { + "#": { + "item": "unusualfishmod:cooked_unusual_fillet" + } + }, + "result": { + "id": "unusualfishmod:odd_fishsticks", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/pickledish.json b/src/main/resources/data/unusualfishmod/recipe/pickledish.json new file mode 100644 index 0000000..8b98850 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/pickledish.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#US", + " B " + ], + "key": { + "#": { + "item": "minecraft:carrot" + }, + "U": { + "item": "unusualfishmod:raw_picklefish" + }, + "S": { + "item": "minecraft:sea_pickle" + }, + "B": { + "item": "minecraft:bowl" + } + }, + "result": { + "id": "unusualfishmod:pickledish", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/prismarine_spear.json b/src/main/resources/data/unusualfishmod/recipe/prismarine_spear.json new file mode 100644 index 0000000..8a46500 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/prismarine_spear.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " #P", + " P#", + "P " + ], + "key": { + "#": { + "item": "unusualfishmod:lobster_spike" + }, + "P": { + "item": "minecraft:prismarine_shard" + } + }, + "result": { + "id": "unusualfishmod:prismarine_spear", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/raw_aero_mono_stick.json b/src/main/resources/data/unusualfishmod/recipe/raw_aero_mono_stick.json new file mode 100644 index 0000000..b80e0b1 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/raw_aero_mono_stick.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "unusualfishmod:raw_aero_mono" + }, + { + "item": "minecraft:stick" + } + ], + "result": { + "id": "unusualfishmod:raw_aero_mono_stick", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_brick_slab.json b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_slab.json new file mode 100644 index 0000000..f840c83 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:relucent_bricks" + } + }, + "result": { + "id": "unusualfishmod:relucent_brick_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_brick_slab_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_slab_stonecutting.json new file mode 100644 index 0000000..80bca3a --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_slab_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_bricks" + }, + "result": { + "id": "unusualfishmod:relucent_brick_slab", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_brick_stairs.json b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_stairs.json new file mode 100644 index 0000000..abf0be4 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:relucent_bricks" + } + }, + "result": { + "id": "unusualfishmod:relucent_brick_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_brick_stairs_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_stairs_stonecutting.json new file mode 100644 index 0000000..940bde9 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_stairs_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_bricks" + }, + "result": { + "id": "unusualfishmod:relucent_brick_stairs", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_brick_wall.json b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_wall.json new file mode 100644 index 0000000..768022e --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:relucent_bricks" + } + }, + "result": { + "id": "unusualfishmod:relucent_brick_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_brick_wall_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_wall_stonecutting.json new file mode 100644 index 0000000..3d21075 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_brick_wall_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_bricks" + }, + "result": { + "id": "unusualfishmod:relucent_brick_wall", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_bricks.json b/src/main/resources/data/unusualfishmod/recipe/relucent_bricks.json new file mode 100644 index 0000000..bf83b62 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_bricks.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "unusualfishmod:relucent_shard" + } + }, + "result": { + "id": "unusualfishmod:relucent_bricks", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab.json new file mode 100644 index 0000000..6a6287f --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:relucent_tiles" + } + }, + "result": { + "id": "unusualfishmod:relucent_tile_slab", + "count": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab_from_tiles_stonecutting.json new file mode 100644 index 0000000..750a82e --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab_from_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_tiles" + }, + "result": { + "id": "unusualfishmod:relucent_tile_slab", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab_stonecutting.json new file mode 100644 index 0000000..061adef --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_slab_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_bricks" + }, + "result": { + "id": "unusualfishmod:relucent_tile_slab", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs.json new file mode 100644 index 0000000..d55e648 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "# ", + "## ", + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:relucent_tiles" + } + }, + "result": { + "id": "unusualfishmod:relucent_tile_stairs", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs_from_tiles_stonecutting.json new file mode 100644 index 0000000..d8412e0 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs_from_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_tiles" + }, + "result": { + "id": "unusualfishmod:relucent_tile_stairs", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs_stonecutting.json new file mode 100644 index 0000000..9006b60 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_stairs_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_bricks" + }, + "result": { + "id": "unusualfishmod:relucent_tile_stairs", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall.json new file mode 100644 index 0000000..85cc0a6 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "###", + "###" + ], + "key": { + "#": { + "item": "unusualfishmod:relucent_tiles" + } + }, + "result": { + "id": "unusualfishmod:relucent_tile_wall", + "count": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall_from_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall_from_tiles_stonecutting.json new file mode 100644 index 0000000..1f69600 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall_from_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_tiles" + }, + "result": { + "id": "unusualfishmod:relucent_tile_wall", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall_stonecutting.json new file mode 100644 index 0000000..0b8d4e8 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tile_wall_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_bricks" + }, + "result": { + "id": "unusualfishmod:relucent_tile_wall", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tiles.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tiles.json new file mode 100644 index 0000000..ae56747 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tiles.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "##", + "##" + ], + "key": { + "#": { + "item": "unusualfishmod:relucent_bricks" + } + }, + "result": { + "id": "unusualfishmod:relucent_tiles", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/relucent_tiles_stonecutting.json b/src/main/resources/data/unusualfishmod/recipe/relucent_tiles_stonecutting.json new file mode 100644 index 0000000..ee37443 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/relucent_tiles_stonecutting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:stonecutting", + "ingredient": { + "item": "unusualfishmod:relucent_bricks" + }, + "result": { + "id": "unusualfishmod:relucent_tiles", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/ripsaw_smithing.json b/src/main/resources/data/unusualfishmod/recipe/ripsaw_smithing.json new file mode 100644 index 0000000..6cb150b --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/ripsaw_smithing.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:smithing_transform", + "template": { + "item": "unusualfishmod:ancient_weapon_smithing_template" + }, + "addition": { + "item": "unusualfishmod:ripper_tooth" + }, + "base": { + "item": "unusualfishmod:weapon_parts" + }, + "result": { + "id": "unusualfishmod:ripsaw" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/sea_boom.json b/src/main/resources/data/unusualfishmod/recipe/sea_boom.json new file mode 100644 index 0000000..f16938c --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/sea_boom.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "CSC", + "SPS", + "CSC" + ], + "key": { + "S": { + "item": "unusualfishmod:lobster_spike" + }, + "P": { + "item": "minecraft:prismarine_bricks" + }, + "C": { + "item": "minecraft:copper_ingot" + } + }, + "result": { + "id": "unusualfishmod:sea_boom", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/strange_broth.json b/src/main/resources/data/unusualfishmod/recipe/strange_broth.json new file mode 100644 index 0000000..fa0ff1b --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/strange_broth.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " # ", + "KUS", + " B " + ], + "key": { + "#": { + "item": "minecraft:seagrass" + }, + "K": { + "item": "minecraft:kelp" + }, + "U": { + "item": "unusualfishmod:cooked_unusual_fillet" + }, + "S": { + "item": "minecraft:sea_pickle" + }, + "B": { + "item": "minecraft:bowl" + } + }, + "result": { + "id": "unusualfishmod:strange_broth", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/unusual_sandwich.json b/src/main/resources/data/unusualfishmod/recipe/unusual_sandwich.json new file mode 100644 index 0000000..b81406e --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/unusual_sandwich.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " # ", + "KUK", + " # " + ], + "key": { + "#": { + "item": "minecraft:bread" + }, + "K": { + "item": "minecraft:kelp" + }, + "U": { + "item": "unusualfishmod:cooked_unusual_fillet" + } + }, + "result": { + "id": "unusualfishmod:unusual_sandwich", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/volt_detector.json b/src/main/resources/data/unusualfishmod/recipe/volt_detector.json new file mode 100644 index 0000000..1cb945e --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/volt_detector.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "#K#", + "cRc", + "ccc" + ], + "key": { + "#": { + "item": "minecraft:prismarine_crystals" + }, + "K": { + "item": "unusualfishmod:tendril" + }, + "c": { + "item": "minecraft:copper_ingot" + }, + "R": { + "item": "minecraft:redstone_block" + } + }, + "result": { + "id": "unusualfishmod:volt_detector", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/recipe/weird_goldfish.json b/src/main/resources/data/unusualfishmod/recipe/weird_goldfish.json new file mode 100644 index 0000000..c061649 --- /dev/null +++ b/src/main/resources/data/unusualfishmod/recipe/weird_goldfish.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "minecraft:wheat" + }, + { + "item": "unusualfishmod:cooked_unusual_fillet" + }, + { + "item": "minecraft:wheat" + }, + { + "item": "minecraft:water_bucket" + } + ], + "result": { + "id": "unusualfishmod:weird_goldfish", + "count": 3 + } +} \ No newline at end of file From 69029b0016f848d8fe3b058729a1d2cf9f04f9db Mon Sep 17 00:00:00 2001 From: Chakyl Date: Wed, 17 Jun 2026 17:07:19 -0400 Subject: [PATCH 04/12] loot tables, renames --- .../unusualfishmod/UnusualFishMod.java | 5 +- .../unusualfishmod/client/ClientEvents.java | 24 ++++++-- .../unusualfishmod/common/CommonEvents.java | 13 +--- .../common/entity/CopperflameAnthias.java | 8 +++ .../common/entity/DemonHerring.java | 8 +++ .../common/entity/DualityDamselfish.java | 8 +++ .../common/entity/EyelashFish.java | 8 +++ ...wflakeTailFish.java => FrostyFinFish.java} | 8 +-- .../common/entity/RhinoTetra.java | 2 +- .../unusualfishmod/common/entity/Skrimp.java | 8 +++ .../entity/item/FallingTreeBlockEntity.java | 5 -- .../entity/item/ThrownPrismarineSpear.java | 1 - .../common/loot/UnusualCatchLootModifier.java | 56 +++++++++--------- .../core/registry/UFEntities.java | 2 +- .../core/registry/UFFoodProperties.java | 2 +- .../unusualfishmod/core/registry/UFItems.java | 10 ++-- .../unusualfishmod/core/registry/UFTabs.java | 6 -- ...nimation.json => frostyfin.animation.json} | 0 ...wflaketail.geo.json => frostyfin.geo.json} | 2 +- .../assets/unusualfishmod/lang/en_us.json | 8 +-- .../assets/unusualfishmod/lang/ko_kr.json | 8 +-- .../assets/unusualfishmod/lang/uk_ua.json | 8 +-- .../models/item/frosty_fin_fish_bucket.json | 6 ++ ...gg.json => frosty_fin_fish_spawn_egg.json} | 0 .../models/item/raw_frosty_fin.json | 6 ++ .../models/item/raw_snowflake.json | 6 -- .../item/snowflake_tail_fish_bucket.json | 6 -- .../{snowflaketail.png => frostyfin.png} | Bin ..._tail_bucket.png => frosty_fin_bucket.png} | Bin ..._tail_fish.png => raw_frosty_fin_fish.png} | Bin .../tags/block/mineable/pickaxe.json | 4 +- .../blocks/chiseled_crimson_bricks.json | 0 .../blocks/chiseled_relucent_bricks.json | 0 .../blocks/copper_antenna.json | 0 .../blocks/crimson_brick_slab.json | 0 .../blocks/crimson_brick_stairs.json | 0 .../blocks/crimson_brick_wall.json | 0 .../blocks/crimson_bricks.json | 0 .../blocks/crimson_tile_slab.json | 0 .../blocks/crimson_tile_stairs.json | 0 .../blocks/crimson_tile_wall.json | 0 .../blocks/crimson_tiles.json | 0 .../blocks/nautical_lamp.json | 0 .../blocks/relucent_brick_slab.json | 0 .../blocks/relucent_brick_stairs.json | 0 .../blocks/relucent_brick_wall.json | 0 .../blocks/relucent_bricks.json | 0 .../blocks/relucent_tile_slab.json | 0 .../blocks/relucent_tile_stairs.json | 0 .../blocks/relucent_tile_wall.json | 0 .../blocks/relucent_tiles.json | 0 .../blocks/sea_boom.json | 0 .../blocks/volt_detector.json | 0 .../entities/aero_mono.json | 0 .../entities/amber_goby.json | 0 .../entities/bark_angelfish.json | 0 .../entities/beaked_herring.json | 0 .../entities/blindsailfin.json | 0 .../entities/blizzardfin.json | 0 .../entities/circus.json | 0 .../entities/copperflame.json | 0 .../entities/crimsonshell.json | 0 .../entities/demon_herring.json | 0 .../entities/drooping_gourami.json | 0 .../entities/duality_damselfish.json | 0 .../entities/eyelash.json | 0 .../entities/forkfish.json | 0 .../entities/gnasher.json | 0 .../entities/hatchet_fish.json | 0 .../entities/mossthorn.json | 0 .../entities/picklefish.json | 0 .../entities/pinkfin.json | 0 .../entities/porcupine_lobsta.json | 0 .../entities/prawn.json | 0 .../entities/ripper.json | 0 .../entities/rootball.json | 0 .../entities/sailor_barb.json | 0 .../entities/shockcat.json | 0 .../entities/sneep_snorp.json | 0 .../entities/sneepsnorp.json | 0 .../entities/snowflaketail.json | 2 +- .../entities/spindlefish.json | 0 .../entities/triple_twirl_pleco.json | 0 .../entities/trumpet_squid.json | 0 .../entities/voltangler.json | 0 .../gameplay/sea_pancake_search.json | 0 .../biome_modifier/snowflake_tail_fish.json | 2 +- .../tags/item/raw_unusual_fish.json | 2 +- 88 files changed, 134 insertions(+), 100 deletions(-) rename src/main/java/codyhuh/unusualfishmod/common/entity/{SnowflakeTailFish.java => FrostyFinFish.java} (91%) rename src/main/resources/assets/unusualfishmod/animations/entity/{snowflaketail.animation.json => frostyfin.animation.json} (100%) rename src/main/resources/assets/unusualfishmod/geo/entity/{snowflaketail.geo.json => frostyfin.geo.json} (97%) create mode 100644 src/main/resources/assets/unusualfishmod/models/item/frosty_fin_fish_bucket.json rename src/main/resources/assets/unusualfishmod/models/item/{snowflake_tail_fish_spawn_egg.json => frosty_fin_fish_spawn_egg.json} (100%) create mode 100644 src/main/resources/assets/unusualfishmod/models/item/raw_frosty_fin.json delete mode 100644 src/main/resources/assets/unusualfishmod/models/item/raw_snowflake.json delete mode 100644 src/main/resources/assets/unusualfishmod/models/item/snowflake_tail_fish_bucket.json rename src/main/resources/assets/unusualfishmod/textures/entity/{snowflaketail.png => frostyfin.png} (100%) rename src/main/resources/assets/unusualfishmod/textures/item/{snowflake_tail_bucket.png => frosty_fin_bucket.png} (100%) rename src/main/resources/assets/unusualfishmod/textures/item/{raw_snowflake_tail_fish.png => raw_frosty_fin_fish.png} (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/chiseled_crimson_bricks.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/chiseled_relucent_bricks.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/copper_antenna.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/crimson_brick_slab.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/crimson_brick_stairs.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/crimson_brick_wall.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/crimson_bricks.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/crimson_tile_slab.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/crimson_tile_stairs.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/crimson_tile_wall.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/crimson_tiles.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/nautical_lamp.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/relucent_brick_slab.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/relucent_brick_stairs.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/relucent_brick_wall.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/relucent_bricks.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/relucent_tile_slab.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/relucent_tile_stairs.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/relucent_tile_wall.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/relucent_tiles.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/sea_boom.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/blocks/volt_detector.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/aero_mono.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/amber_goby.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/bark_angelfish.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/beaked_herring.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/blindsailfin.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/blizzardfin.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/circus.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/copperflame.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/crimsonshell.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/demon_herring.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/drooping_gourami.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/duality_damselfish.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/eyelash.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/forkfish.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/gnasher.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/hatchet_fish.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/mossthorn.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/picklefish.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/pinkfin.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/porcupine_lobsta.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/prawn.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/ripper.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/rootball.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/sailor_barb.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/shockcat.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/sneep_snorp.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/sneepsnorp.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/snowflaketail.json (89%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/spindlefish.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/triple_twirl_pleco.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/trumpet_squid.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/entities/voltangler.json (100%) rename src/main/resources/data/unusualfishmod/{loot_tables => loot_table}/gameplay/sea_pancake_search.json (100%) diff --git a/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java b/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java index 98a7e38..aef87fb 100644 --- a/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java +++ b/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java @@ -1,12 +1,10 @@ package codyhuh.unusualfishmod; import codyhuh.unusualfishmod.core.registry.*; -import net.minecraft.core.MappedRegistry; import net.minecraft.resources.ResourceLocation; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.common.NeoForge; @Mod(UnusualFishMod.MOD_ID) public class UnusualFishMod { @@ -20,7 +18,7 @@ public UnusualFishMod(IEventBus bus, ModContainer modContainer) { UFItems.ITEMS.register(bus); UFTabs.CREATIVE_TABS.register(bus); UFLootModifiers.LOOT_MODIFIERS.register(bus); - +// don't need this prob // NeoForge.EVENT_BUS.register(this); } @@ -28,3 +26,4 @@ public static ResourceLocation loc(String path) { return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); } } + diff --git a/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java b/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java index e85fd1e..cf4f33b 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java +++ b/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java @@ -14,13 +14,18 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.client.renderer.entity.EntityRenderers; import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import net.neoforged.neoforge.registries.DeferredRegister; import java.util.ArrayList; @@ -36,9 +41,20 @@ public static void clientSetup(FMLClientSetupEvent e) { ItemProperties.register(UFItems.THUNDEROUS_SHELL.get(), loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); ItemProperties.register(UFItems.PRISMARINE_SPEAR.get(), loc("using"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); ///ItemProperties.register(UFItems.RIPSAW.get(), new ResourceLocation("sawing"), (stack, level, player, i) -> player != null && player.isUsingItem() && stack.hasTag() ? stack.getOrCreateTag().getFloat("SawingProgress") : 0.0F); -// ItemProperties.register(UFItems.CORAL_SKRIMP_BUCKET.get(), loc("variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); -// ItemProperties.register(UFItems.COPPERFLAME_BUCKET.get(), loc("variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); -// ItemProperties.register(UFItems.DEMON_HERRING_BUCKET.get(), loc("variant"), (stack, world, player, i) -> stack.hasTag() ? stack.getOrCreateTag().getInt("Variant") : 0); + ItemProperties.register(UFItems.CORAL_SKRIMP_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); + ItemProperties.register(UFItems.COPPERFLAME_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); + ItemProperties.register(UFItems.DEMON_HERRING_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); + } + + private static int getBucketVariant(ItemStack stack) { + CustomData customData = stack.get(DataComponents.BUCKET_ENTITY_DATA); + if (customData != null) { + CompoundTag tag = customData.copyTag(); + if (customData.contains("Variant")) { + return tag.getInt("Variant"); + } + } + return 0; } private static void make(EntityType type, String name){ @@ -55,7 +71,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { UFEntities.LOBED_SKIPPER.get(), UFEntities.MOSSTHORN.get(), UFEntities.MUDDYTOP_SNAIL.get(), UFEntities.PINKFIN.get(), UFEntities.PORCUPINE_LOBSTA.get(), UFEntities.PRAWN.get(), UFEntities.RHINO_TETRA.get(), UFEntities.RIPPER.get(), UFEntities.ROUGHBACK.get(), UFEntities.SAILOR_BARB.get(), UFEntities.SEA_MOSQUITO.get(), - UFEntities.SEA_PANCAKE.get(), UFEntities.SEA_SPIDER.get(), UFEntities.SNEEPSNORP.get(), UFEntities.SNOWFLAKE.get(), + UFEntities.SEA_PANCAKE.get(), UFEntities.SEA_SPIDER.get(), UFEntities.SNEEPSNORP.get(), UFEntities.FROSTY_FIN.get(), UFEntities.SPINDLEFISH.get(), UFEntities.SPOON_SHARK.get(), UFEntities.SQUODDLE.get(), UFEntities.STOUT_BICHIR.get(), UFEntities.TIGER_JUNGLE_SHARK.get(), UFEntities.TIGER_PUFFER.get(), UFEntities.TRIBBLE.get(), UFEntities.TRUMPET_SQUID.get(), UFEntities.ZEBRA_CORNETFISH.get(), UFEntities.TRIPLE_TWIRL_PLECO.get(), // todo - triple twirl pleco variants diff --git a/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java b/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java index 628afd7..1f26dbf 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java +++ b/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java @@ -2,17 +2,10 @@ import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.common.entity.*; -import codyhuh.unusualfishmod.common.entity.item.ThrownPrismarineSpear; import codyhuh.unusualfishmod.core.registry.UFEntities; import codyhuh.unusualfishmod.core.registry.UFItems; -import net.minecraft.core.Position; -import net.minecraft.core.dispenser.ProjectileDispenseBehavior; import net.minecraft.world.entity.SpawnPlacementTypes; -import net.minecraft.world.entity.SpawnPlacements; -import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; +import net.minecraft.world.item.TridentItem; import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.levelgen.Heightmap; import net.neoforged.bus.api.SubscribeEvent; @@ -65,7 +58,7 @@ public static void registerSpawnPlacements(RegisterSpawnPlacementsEvent e) { e.register(UFEntities.CIRCUS_FISH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, CircusFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); e.register(UFEntities.BLIZZARDFIN_TUNA.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, BlizzardfinTuna::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); e.register(UFEntities.TIGER_JUNGLE_SHARK.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, TigerJungleShark::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); - e.register(UFEntities.SNOWFLAKE.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, SnowflakeTailFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); + e.register(UFEntities.FROSTY_FIN.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, FrostyFinFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); e.register(UFEntities.EYELASH.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, EyelashFish::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); e.register(UFEntities.CRIMSONSHELL_SQUID.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, CrimsonshellSquid::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); e.register(UFEntities.VOLT_ANGLER.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, VoltAngler::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); @@ -139,7 +132,7 @@ public static void registerAttributes(EntityAttributeCreationEvent event) { event.put(UFEntities.CIRCUS_FISH.get(), CircusFish.createAttributes().build()); event.put(UFEntities.BLIZZARDFIN_TUNA.get(), BlizzardfinTuna.createAttributes().build()); event.put(UFEntities.EYELASH.get(), EyelashFish.createAttributes().build()); - event.put(UFEntities.SNOWFLAKE.get(), SnowflakeTailFish.createAttributes().build()); + event.put(UFEntities.FROSTY_FIN.get(), FrostyFinFish.createAttributes().build()); event.put(UFEntities.TIGER_JUNGLE_SHARK.get(), TigerJungleShark.createAttributes().build()); event.put(UFEntities.CRIMSONSHELL_SQUID.get(), CrimsonshellSquid.createAttributes().build()); event.put(UFEntities.VOLT_ANGLER.get(), VoltAngler.createAttributes().build()); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java index 005378c..9281941 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java @@ -150,6 +150,14 @@ public void saveToBucketTag(ItemStack bucket) { }); } + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + public int getVariant() { return this.entityData.get(VARIANT); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java index 1e2a91f..6e844c7 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java @@ -157,6 +157,14 @@ public void saveToBucketTag(ItemStack bucket) { }); } + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java index b8bfae5..2575a7c 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java @@ -134,6 +134,14 @@ public void saveToBucketTag(ItemStack bucket) { }); } + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java index 9ad944e..4256aca 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java @@ -154,6 +154,14 @@ public void saveToBucketTag(ItemStack bucket) { }); } + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SnowflakeTailFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/FrostyFinFish.java similarity index 91% rename from src/main/java/codyhuh/unusualfishmod/common/entity/SnowflakeTailFish.java rename to src/main/java/codyhuh/unusualfishmod/common/entity/FrostyFinFish.java index e52b611..fa8f19e 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SnowflakeTailFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/FrostyFinFish.java @@ -32,10 +32,10 @@ import software.bernie.geckolib.animation.PlayState; import software.bernie.geckolib.util.GeckoLibUtil; -public class SnowflakeTailFish extends BucketableSchoolingWaterAnimal implements GeoEntity { +public class FrostyFinFish extends BucketableSchoolingWaterAnimal implements GeoEntity { private boolean isSchool = true; - public SnowflakeTailFish(EntityType entityType, Level level) { + public FrostyFinFish(EntityType entityType, Level level) { super(entityType, level); this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); this.lookControl = new SmoothSwimmingLookControl(this, 10); @@ -43,7 +43,7 @@ public SnowflakeTailFish(EntityType en @Override public ItemStack getBucketStack() { - return new ItemStack(UFItems.SNOWFLAKE_TAIL_FISH_BUCKET.get()); + return new ItemStack(UFItems.FROSTY_FIN_FISH_BUCKET.get()); } public static AttributeSupplier.Builder createAttributes() { @@ -107,7 +107,7 @@ protected SoundEvent getFlopSound() { return SoundEvents.COD_FLOP; } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java b/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java index 7422933..253db44 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java @@ -67,7 +67,7 @@ public RhinoTetra(EntityType entityTyp @Override public ItemStack getBucketStack() { - return ItemStack.EMPTY; + return new ItemStack(UFItems.RHINO_TETRA_BUCKET.get()); } protected InteractionResult mobInteract(Player p_27477_, InteractionHand p_27478_) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java index 63d946d..d45a6ce 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java @@ -109,6 +109,14 @@ public void saveToBucketTag(ItemStack bucket) { }); } + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java index 2a81288..be8c738 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java @@ -24,11 +24,6 @@ public class FallingTreeBlockEntity extends AbstractMovingBlockEntity { public FallingTreeBlockEntity(EntityType entityType, Level level) { super(entityType, level); } - -// public FallingTreeBlockEntity(PlayMessages.SpawnEntity spawnEntity, Level level) { -// this(UFEntities.FALLING_TREE.get(), level); -// this.setBoundingBox(this.makeBoundingBox()); -// } @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java index 310f5cb..7dbe23f 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java @@ -79,7 +79,6 @@ protected void onHitEntity(EntityHitResult result) { Entity entity = result.getEntity(); float f = 5.0F; if (entity instanceof LivingEntity livingentity && this.level() instanceof net.minecraft.server.level.ServerLevel serverLevel) { - // Todo: Chakyl check for crash with dispenser? DamageSource damageSource = this.damageSources().mobAttack((LivingEntity) this.getOwner()); f = EnchantmentHelper.modifyDamage(serverLevel, this.spearItem, livingentity, damageSource, (float) this.getBaseDamage()); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/loot/UnusualCatchLootModifier.java b/src/main/java/codyhuh/unusualfishmod/common/loot/UnusualCatchLootModifier.java index 501b19a..a14c164 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/loot/UnusualCatchLootModifier.java +++ b/src/main/java/codyhuh/unusualfishmod/common/loot/UnusualCatchLootModifier.java @@ -8,55 +8,53 @@ import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; -import net.minecraft.tags.ItemTags; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.loot.IGlobalLootModifier; import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; -import java.util.Optional; +import java.util.List; public class UnusualCatchLootModifier extends LootModifier { - public UnusualCatchLootModifier(LootItemCondition[] condition) { - super(condition); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, UnusualCatchLootModifier::new)); + + public UnusualCatchLootModifier(LootItemCondition[] conditions) { + super(conditions); } - // TODO: Chakyl test this @Override protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { -// var tagOptional = BuiltInRegistries.ITEM.getOrCreateTag(UFTags.UNUSUAL_CATCH_ITEMS); -// var items = tagOptional.stream().map(Holder::value).toList(); -// int size = items.size(); -// -// ObjectArrayList ret = new ObjectArrayList<>(); -// ItemStack stack = context.getParamOrNull(LootContextParams.TOOL); -// -// if (stack != null) { -// Optional> unusualCatch = context.getLevel().registryAccess().lookupOrThrow(Registries.ENCHANTMENT).get(UFEnchantments.UNUSUAL_CATCH); -// int i = 0; -// if (unusualCatch.isPresent()) { -// i = EnchantmentHelper.getItemEnchantmentLevel(unusualCatch.get(), stack); -// } -// if (stack.is(ItemTags.FISHING_ENCHANTABLE) && i > 0) { -// ret.add(new ItemStack(items.get(context.getRandom().nextInt(size)))); -// } -// else { -// ret = generatedLoot; -// } -// } - return new ObjectArrayList<>(); - } + List items = BuiltInRegistries.ITEM.getTag(UFTags.UNUSUAL_CATCH_ITEMS).map(holderSet -> holderSet.stream().map(ItemStack::new).toList()).orElse(List.of()); - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, UnusualCatchLootModifier::new)); + if (items.isEmpty()) { + return generatedLoot; + } + ItemStack stack = context.getParamOrNull(LootContextParams.TOOL); + if (stack != null) { + Holder.Reference unusualCatch = context.getLevel().holderLookup(Registries.ENCHANTMENT).get(UFEnchantments.UNUSUAL_CATCH).orElse(null); + if (unusualCatch != null) { + int enchantmentLevel = EnchantmentHelper.getTagEnchantmentLevel(unusualCatch, stack); + if (stack.is(Tags.Items.TOOLS_FISHING_ROD) && enchantmentLevel > 0) { + ObjectArrayList ret = new ObjectArrayList<>(); + ret.add(items.get(context.getRandom().nextInt(items.size()))); + return ret; + } + } + } + + return generatedLoot; + } @Override public MapCodec codec() { return CODEC; } -} \ No newline at end of file +} + diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java index 92684b1..931a2cb 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java @@ -64,7 +64,7 @@ public class UFEntities { public static final DeferredHolder, EntityType> CORAL_SKRIMP = ENTITIES.register("coral_skrimp", () -> EntityType.Builder.of(Skrimp::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("coral_skrimp")); public static final DeferredHolder, EntityType> CIRCUS_FISH = ENTITIES.register("circus", () -> EntityType.Builder.of(CircusFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.8f).build("circus")); public static final DeferredHolder, EntityType> BLIZZARDFIN_TUNA = ENTITIES.register("blizzardfin", () -> EntityType.Builder.of(BlizzardfinTuna::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build("blizzardfin")); - public static final DeferredHolder, EntityType> SNOWFLAKE = ENTITIES.register("snowflaketail", () -> EntityType.Builder.of(SnowflakeTailFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("snowflaketail")); + public static final DeferredHolder, EntityType> FROSTY_FIN = ENTITIES.register("frostyfin", () -> EntityType.Builder.of(FrostyFinFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("frostyfin")); public static final DeferredHolder, EntityType> EYELASH = ENTITIES.register("eyelash", () -> EntityType.Builder.of(EyelashFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("eyelash")); public static final DeferredHolder, EntityType> TIGER_JUNGLE_SHARK = ENTITIES.register("jungleshark", () -> EntityType.Builder.of(TigerJungleShark::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.4f).build("jungleshark")); public static final DeferredHolder, EntityType> CRIMSONSHELL_SQUID = ENTITIES.register("crimsonshell", () -> EntityType.Builder.of(CrimsonshellSquid::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("crimsonshell")); diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFFoodProperties.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFFoodProperties.java index c28c4ee..8cf0c62 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFFoodProperties.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFFoodProperties.java @@ -21,7 +21,7 @@ public class UFFoodProperties { public static final FoodProperties RAW_SHOCKCAT = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); public static final FoodProperties RAW_MOSSTHORN = new FoodProperties.Builder().nutrition(1).saturationModifier(0.1F).effect(() -> new MobEffectInstance(MobEffects.POISON, 200, 1), 1.0F).build(); public static final FoodProperties RAW_LOBSTER = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); - public static final FoodProperties RAW_SNOWFLAKE = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 150, 1), 1.0F).build(); + public static final FoodProperties RAW_FROSTY_FIN = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).effect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 150, 1), 1.0F).build(); public static final FoodProperties RAW_EYELASH = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); public static final FoodProperties UNUSUAL_FILLET = new FoodProperties.Builder().nutrition(3).saturationModifier(0.15F).build(); public static final FoodProperties RAW_PICKLEFISH = new FoodProperties.Builder().nutrition(2).saturationModifier(0.1F).build(); diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java index b8cee8b..32474dd 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java @@ -4,9 +4,7 @@ import codyhuh.unusualfishmod.common.item.*; import net.minecraft.ChatFormatting; import net.minecraft.Util; - import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; - import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.*; @@ -35,7 +33,7 @@ public final class UFItems { // Foods public static final DeferredItem RAW_EYELASH = ITEMS.register("raw_eyelash", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_EYELASH))); public static final DeferredItem RAW_SPINDLEFISH = ITEMS.register("raw_spindlefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SPINDLEFISH))); - public static final DeferredItem RAW_SNOWFLAKE = ITEMS.register("raw_snowflake", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SNOWFLAKE))); + public static final DeferredItem RAW_FROSTY_FIN = ITEMS.register("raw_frosty_fin", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_FROSTY_FIN))); public static final DeferredItem RAW_AERO_MONO = ITEMS.register("raw_aero_mono", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO))); public static final DeferredItem RAW_PICKLEFSIH = ITEMS.register("raw_picklefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_PICKLEFISH))); public static final DeferredItem RAW_AMBER_GOBY = ITEMS.register("raw_amber_goby", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AMBER_GOBY))); @@ -96,7 +94,7 @@ public final class UFItems { // Buckets public static final DeferredItem AERO_MONO_BUCKET = ITEMS.register("aero_mono_bucket", () -> new UFFishBucketItem(UFEntities.AERO_MONO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - //public static final DeferredItem RHINO_TETRA_BUCKET = ITEMS.register("rhino_tetra_bucket", () -> new UFFishBucketItem(UFEntities.RHINO_TETRA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem RHINO_TETRA_BUCKET = ITEMS.register("rhino_tetra_bucket", () -> new UFFishBucketItem(UFEntities.RHINO_TETRA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); public static final DeferredItem DUALITY_DAMSELFISH_BUCKET = ITEMS.register("duality_damselfish_bucket", () -> new UFFishBucketItem(UFEntities.DUALITY_DAMSELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); public static final DeferredItem DROOPING_GOURAMI_BUCKET = ITEMS.register("drooping_gourami_bucket", () -> new UFFishBucketItem(UFEntities.DROOPING_GOURAMI, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); public static final DeferredItem MOSSTHORN_BUCKET = ITEMS.register("mossthorn_bucket", () -> new UFFishBucketItem(UFEntities.MOSSTHORN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); @@ -129,7 +127,7 @@ public final class UFItems { public static final DeferredItem CORAL_SKRIMP_BUCKET = ITEMS.register("coral_skrimp_bucket", () -> new UFFishBucketItem(UFEntities.CORAL_SKRIMP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); public static final DeferredItem CIRCUS_FISH_BUCKET = ITEMS.register("circus_fish_bucket", () -> new UFFishBucketItem(UFEntities.CIRCUS_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); public static final DeferredItem EYELASH_FISH_BUCKET = ITEMS.register("eyelash_fish_bucket", () -> new UFFishBucketItem(UFEntities.EYELASH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SNOWFLAKE_TAIL_FISH_BUCKET = ITEMS.register("snowflake_tail_fish_bucket", () -> new UFFishBucketItem(UFEntities.SNOWFLAKE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem FROSTY_FIN_FISH_BUCKET = ITEMS.register("frosty_fin_fish_bucket", () -> new UFFishBucketItem(UFEntities.FROSTY_FIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); public static final DeferredItem CRIMSONSHELL_SQUID_BUCKET = ITEMS.register("crimsonshell_squid_bucket", () -> new UFFishBucketItem(UFEntities.CRIMSONSHELL_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); public static final DeferredItem VOLT_ANGLER_BUCKET = ITEMS.register("volt_angler_bucket", () -> new UFFishBucketItem(UFEntities.VOLT_ANGLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); public static final DeferredItem BLIZZARDFIN_BUCKET = ITEMS.register("blizzardfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIZZARDFIN_TUNA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); @@ -191,7 +189,7 @@ public final class UFItems { public static final DeferredItem CIRCUS_FISH_SPAWN_EGG = ITEMS.register("circus_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.CIRCUS_FISH.get(), 0xab4b36, 0xc88f62, new Item.Properties())); public static final DeferredItem BLIZZARDFIN_SPAWN_EGG = ITEMS.register("blizzardfin_spawn_egg", () -> new SpawnEggItem(UFEntities.BLIZZARDFIN_TUNA.get(), 0x9ed7dc, 0x6182a6, new Item.Properties())); public static final DeferredItem EYELASH_FISH_SPAWN_EGG = ITEMS.register("eyelash_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.EYELASH.get(), 0xb7b7ba, 0xfcfcfa, new Item.Properties())); - public static final DeferredItem SNOWFLAKE_TAIL_FISH_SPAWN_EGG = ITEMS.register("snowflake_tail_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.SNOWFLAKE.get(), 0x649ccc, 0xcbe8e6, new Item.Properties())); + public static final DeferredItem FROSTY_FIN_FISH_SPAWN_EGG = ITEMS.register("frosty_fin_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.FROSTY_FIN.get(), 0x649ccc, 0xcbe8e6, new Item.Properties())); public static final DeferredItem TIGER_JUNGLE_SHARK_SPAWN_EGG = ITEMS.register("tiger_jungle_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.TIGER_JUNGLE_SHARK.get(), 0x272530, 0xa5a8c6, new Item.Properties())); public static final DeferredItem CRIMSONSHELL_SQUID_SPAWN_EGG = ITEMS.register("crimsonshell_squid_spawn_egg", () -> new SpawnEggItem(UFEntities.CRIMSONSHELL_SQUID.get(), 0xab101c, 0x432c39, new Item.Properties())); public static final DeferredItem VOLT_ANGLER_SPAWN_EGG = ITEMS.register("volt_angler_spawn_egg", () -> new SpawnEggItem(UFEntities.VOLT_ANGLER.get(), 0x2d4035, 0x509033, new Item.Properties())); diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java index 03deab2..9d373ed 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java @@ -4,14 +4,8 @@ import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; public class UFTabs { public static final DeferredRegister CREATIVE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, UnusualFishMod.MOD_ID); diff --git a/src/main/resources/assets/unusualfishmod/animations/entity/snowflaketail.animation.json b/src/main/resources/assets/unusualfishmod/animations/entity/frostyfin.animation.json similarity index 100% rename from src/main/resources/assets/unusualfishmod/animations/entity/snowflaketail.animation.json rename to src/main/resources/assets/unusualfishmod/animations/entity/frostyfin.animation.json diff --git a/src/main/resources/assets/unusualfishmod/geo/entity/snowflaketail.geo.json b/src/main/resources/assets/unusualfishmod/geo/entity/frostyfin.geo.json similarity index 97% rename from src/main/resources/assets/unusualfishmod/geo/entity/snowflaketail.geo.json rename to src/main/resources/assets/unusualfishmod/geo/entity/frostyfin.geo.json index 3718fb7..853ae0a 100644 --- a/src/main/resources/assets/unusualfishmod/geo/entity/snowflaketail.geo.json +++ b/src/main/resources/assets/unusualfishmod/geo/entity/frostyfin.geo.json @@ -3,7 +3,7 @@ "minecraft:geometry": [ { "description": { - "identifier": "geometry.snowflake_tail_fish", + "identifier": "geometry.frosty_fin_fish", "texture_width": 64, "texture_height": 64, "visible_bounds_width": 3, diff --git a/src/main/resources/assets/unusualfishmod/lang/en_us.json b/src/main/resources/assets/unusualfishmod/lang/en_us.json index 9d368be..c8ff584 100644 --- a/src/main/resources/assets/unusualfishmod/lang/en_us.json +++ b/src/main/resources/assets/unusualfishmod/lang/en_us.json @@ -13,7 +13,7 @@ "item.unusualfishmod.raw_shockcat": "Raw Shockcat Fillet", "item.unusualfishmod.raw_lobster": "Raw Porcupine Lobster Tail", "item.unusualfishmod.raw_eyelash": "Eyelash Fish", - "item.unusualfishmod.raw_snowflake": "Frosty Fin", + "item.unusualfishmod.raw_frosty_fin": "Frosty Fin", "item.unusualfishmod.unusual_fillet": "Raw Unusual Fillet", "item.unusualfishmod.raw_picklefish": "Picklefish", "item.unusualfishmod.raw_amber_goby": "Amber Goby", @@ -114,7 +114,7 @@ "item.unusualfishmod.circus_fish_spawn_egg": "Circus Fish Spawn Egg", "item.unusualfishmod.blizzardfin_spawn_egg": "Blizzardfin Tuna Spawn Egg", "item.unusualfishmod.eyelash_fish_spawn_egg": "Eyelash Fish Spawn Egg", - "item.unusualfishmod.snowflake_tail_fish_spawn_egg": "Frosty Fin Spawn Egg", + "item.unusualfishmod.frosty_fin_fish_spawn_egg": "Frosty Fin Spawn Egg", "item.unusualfishmod.tiger_jungle_shark_spawn_egg": "Tiger Jungle Shark Spawn Egg", "item.unusualfishmod.crimsonshell_squid_spawn_egg": "Crimsonshell Squid Spawn Egg", "item.unusualfishmod.volt_angler_spawn_egg": "Volt Angler Spawn Egg", @@ -159,7 +159,7 @@ "item.unusualfishmod.coral_skrimp_bucket": "Bucket of Skrimp", "item.unusualfishmod.circus_fish_bucket": "Bucket of Circus Fish", "item.unusualfishmod.eyelash_fish_bucket": "Bucket of Eyelash Fish", - "item.unusualfishmod.snowflake_tail_fish_bucket": "Bucket of Frosty Fin", + "item.unusualfishmod.frosty_fin_fish_bucket": "Bucket of Frosty Fin", "item.unusualfishmod.crimsonshell_squid_bucket": "Bucket of Crimsonshell Squid", "item.unusualfishmod.volt_angler_bucket": "Bucket of Volt Anglerfish", "item.unusualfishmod.blizzardfin_bucket": "Bucket of Blizzardfin Tuna", @@ -245,7 +245,7 @@ "entity.unusualfishmod.circus":"Circus Fish", "entity.unusualfishmod.blizzardfin":"Blizzardfin Tuna", "entity.unusualfishmod.eyelash":"Eyelash Fish", - "entity.unusualfishmod.snowflaketail":"Frosty Fin", + "entity.unusualfishmod.frostyfin":"Frosty Fin", "entity.unusualfishmod.jungleshark":"Tiger Jungle Shark", "entity.unusualfishmod.crimsonshell":"Crimsonshell Squid", "entity.unusualfishmod.volt_angler":"Volt Anglerfish", diff --git a/src/main/resources/assets/unusualfishmod/lang/ko_kr.json b/src/main/resources/assets/unusualfishmod/lang/ko_kr.json index 61c13ff..39ea9e9 100644 --- a/src/main/resources/assets/unusualfishmod/lang/ko_kr.json +++ b/src/main/resources/assets/unusualfishmod/lang/ko_kr.json @@ -13,7 +13,7 @@ "item.unusualfishmod.raw_shockcat": "익히지 않은 전기메기 살점", "item.unusualfishmod.raw_lobster": "익히지 않은 고슴도치 바닷가재 꼬리", "item.unusualfishmod.raw_eyelash": "익히지 않은 속눈썹고기", - "item.unusualfishmod.raw_snowflake": "익히지 않은 눈송이 지느러미고기", + "item.unusualfishmod.raw_frosty_fin": "익히지 않은 눈송이 지느러미고기", "item.unusualfishmod.unusual_fillet": "익히지 않은 특이한 살점", "item.unusualfishmod.raw_picklefish": "익히지 않은 피클고기", "item.unusualfishmod.raw_amber_goby": "익히지 않은 호박고비", @@ -114,7 +114,7 @@ "item.unusualfishmod.circus_fish_spawn_egg": "서커스고기 스폰 알", "item.unusualfishmod.blizzardfin_spawn_egg": "눈보라 지느러미참치 스폰 알", "item.unusualfishmod.eyelash_fish_spawn_egg": "속눈썹고기 스폰 알", - "item.unusualfishmod.snowflake_tail_fish_spawn_egg": "눈송이 지느러미고기 스폰 알", + "item.unusualfishmod.frosty_fin_fish_spawn_egg": "눈송이 지느러미고기 스폰 알", "item.unusualfishmod.tiger_jungle_shark_spawn_egg": "정글 호랑이 상어 스폰 알", "item.unusualfishmod.crimsonshell_squid_spawn_egg": "진홍조개 오징어 스폰 알", "item.unusualfishmod.volt_angler_spawn_egg": "전압 아귀 스폰 알", @@ -159,7 +159,7 @@ "item.unusualfishmod.coral_skrimp_bucket": "산호 새우 양동이", "item.unusualfishmod.circus_fish_bucket": "서커스고기 양동이", "item.unusualfishmod.eyelash_fish_bucket": "속눈썹고기 양동이", - "item.unusualfishmod.snowflake_tail_fish_bucket": "눈송이 지느러미고기 양동이", + "item.unusualfishmod.frosty_fin_fish_bucket": "눈송이 지느러미고기 양동이", "item.unusualfishmod.crimsonshell_squid_bucket": "진홍껍질 오징어 양동이", "item.unusualfishmod.volt_angler_bucket": "볼트 아귀 양동이", "item.unusualfishmod.blizzardfin_bucket": "눈보라 지느러미참치 양동이", @@ -245,7 +245,7 @@ "entity.unusualfishmod.circus": "서커스고기", "entity.unusualfishmod.blizzardfin": "눈보라 지느러미참치", "entity.unusualfishmod.eyelash": "속눈썹고기", - "entity.unusualfishmod.snowflaketail": "눈송이 지느러미고기", + "entity.unusualfishmod.frostyfin": "눈송이 지느러미고기", "entity.unusualfishmod.jungleshark": "정글 호랑이 상어", "entity.unusualfishmod.crimsonshell": "진홍껍질 오징어", "entity.unusualfishmod.volt_angler": "볼트 아귀", diff --git a/src/main/resources/assets/unusualfishmod/lang/uk_ua.json b/src/main/resources/assets/unusualfishmod/lang/uk_ua.json index bbf65a8..895027c 100644 --- a/src/main/resources/assets/unusualfishmod/lang/uk_ua.json +++ b/src/main/resources/assets/unusualfishmod/lang/uk_ua.json @@ -13,7 +13,7 @@ "item.unusualfishmod.raw_shockcat": "Сирий шококіт", "item.unusualfishmod.raw_lobster": "Сирий хвіст голчастого лобстера", "item.unusualfishmod.raw_eyelash": "Сира війкориба", - "item.unusualfishmod.raw_snowflake": "Сирий сніжинкохвіст", + "item.unusualfishmod.raw_frosty_fin": "Сирий сніжинкохвіст", "item.unusualfishmod.unusual_fillet": "Незвичайне філе", "item.unusualfishmod.raw_picklefish": "Сира маринориба", "item.unusualfishmod.raw_amber_goby": "Сирий бурштиновий бичок", @@ -112,7 +112,7 @@ "item.unusualfishmod.circus_fish_spawn_egg": "Яйце виклику циркової риби", "item.unusualfishmod.blizzardfin_spawn_egg": "Яйце виклику тунця завірюхи", "item.unusualfishmod.eyelash_fish_spawn_egg": "Яйце виклику війкориби", - "item.unusualfishmod.snowflake_tail_fish_spawn_egg": "Яйце виклику сніжинкохвоста", + "item.unusualfishmod.frosty_fin_fish_spawn_egg": "Яйце виклику сніжинкохвоста", "item.unusualfishmod.tiger_jungle_shark_spawn_egg": "Яйце виклику джунглевої тигрової акули", "item.unusualfishmod.crimsonshell_squid_spawn_egg": "Яйце виклику багряного наутилуса", "item.unusualfishmod.volt_angler_spawn_egg": "Яйце виклику вольт-удильника", @@ -157,7 +157,7 @@ "item.unusualfishmod.coral_skrimp_bucket": "Відро з кораловою креветкою", "item.unusualfishmod.circus_fish_bucket": "Відро з цирковою рибою", "item.unusualfishmod.eyelash_fish_bucket": "Відро з війкорибою", - "item.unusualfishmod.snowflake_tail_fish_bucket": "Відро зі сніжинкохвостом", + "item.unusualfishmod.frosty_fin_fish_bucket": "Відро зі сніжинкохвостом", "item.unusualfishmod.crimsonshell_squid_bucket": "Відро з багряним наутилусом", "item.unusualfishmod.volt_angler_bucket": "Відро з вольт-удильником", "item.unusualfishmod.blizzardfin_bucket": "Відро з тунцем завірюхи", @@ -243,7 +243,7 @@ "entity.unusualfishmod.circus": "Циркова риба", "entity.unusualfishmod.blizzardfin": "Тунець завірюхи", "entity.unusualfishmod.eyelash": "Війкориба", - "entity.unusualfishmod.snowflake_tail_fish": "Сніжинкохвіст", + "entity.unusualfishmod.frosty_fin_fish": "Сніжинкохвіст", "entity.unusualfishmod.tiger_jungle_shark": "Джунглева тигрова акула", "entity.unusualfishmod.crimsonshell": "Багряний наутилус", "entity.unusualfishmod.volt_angler": "Вольт-удильник", diff --git a/src/main/resources/assets/unusualfishmod/models/item/frosty_fin_fish_bucket.json b/src/main/resources/assets/unusualfishmod/models/item/frosty_fin_fish_bucket.json new file mode 100644 index 0000000..dbb45ce --- /dev/null +++ b/src/main/resources/assets/unusualfishmod/models/item/frosty_fin_fish_bucket.json @@ -0,0 +1,6 @@ +{ + "parent" : "item/generated", + "textures" : { + "layer0" : "unusualfishmod:item/frosty_fin_bucket" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unusualfishmod/models/item/snowflake_tail_fish_spawn_egg.json b/src/main/resources/assets/unusualfishmod/models/item/frosty_fin_fish_spawn_egg.json similarity index 100% rename from src/main/resources/assets/unusualfishmod/models/item/snowflake_tail_fish_spawn_egg.json rename to src/main/resources/assets/unusualfishmod/models/item/frosty_fin_fish_spawn_egg.json diff --git a/src/main/resources/assets/unusualfishmod/models/item/raw_frosty_fin.json b/src/main/resources/assets/unusualfishmod/models/item/raw_frosty_fin.json new file mode 100644 index 0000000..487f957 --- /dev/null +++ b/src/main/resources/assets/unusualfishmod/models/item/raw_frosty_fin.json @@ -0,0 +1,6 @@ +{ + "parent" : "item/generated", + "textures" : { + "layer0" : "unusualfishmod:item/raw_frosty_fin_fish" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unusualfishmod/models/item/raw_snowflake.json b/src/main/resources/assets/unusualfishmod/models/item/raw_snowflake.json deleted file mode 100644 index 66583e5..0000000 --- a/src/main/resources/assets/unusualfishmod/models/item/raw_snowflake.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent" : "item/generated", - "textures" : { - "layer0" : "unusualfishmod:item/raw_snowflake_tail_fish" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/unusualfishmod/models/item/snowflake_tail_fish_bucket.json b/src/main/resources/assets/unusualfishmod/models/item/snowflake_tail_fish_bucket.json deleted file mode 100644 index 4002db9..0000000 --- a/src/main/resources/assets/unusualfishmod/models/item/snowflake_tail_fish_bucket.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent" : "item/generated", - "textures" : { - "layer0" : "unusualfishmod:item/snowflake_tail_bucket" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/unusualfishmod/textures/entity/snowflaketail.png b/src/main/resources/assets/unusualfishmod/textures/entity/frostyfin.png similarity index 100% rename from src/main/resources/assets/unusualfishmod/textures/entity/snowflaketail.png rename to src/main/resources/assets/unusualfishmod/textures/entity/frostyfin.png diff --git a/src/main/resources/assets/unusualfishmod/textures/item/snowflake_tail_bucket.png b/src/main/resources/assets/unusualfishmod/textures/item/frosty_fin_bucket.png similarity index 100% rename from src/main/resources/assets/unusualfishmod/textures/item/snowflake_tail_bucket.png rename to src/main/resources/assets/unusualfishmod/textures/item/frosty_fin_bucket.png diff --git a/src/main/resources/assets/unusualfishmod/textures/item/raw_snowflake_tail_fish.png b/src/main/resources/assets/unusualfishmod/textures/item/raw_frosty_fin_fish.png similarity index 100% rename from src/main/resources/assets/unusualfishmod/textures/item/raw_snowflake_tail_fish.png rename to src/main/resources/assets/unusualfishmod/textures/item/raw_frosty_fin_fish.png diff --git a/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json index 0b0521f..970a5f1 100644 --- a/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -19,6 +19,8 @@ "unusualfishmod:relucent_tile_slab", "unusualfishmod:relucent_tile_wall", "unusualfishmod:nautical_lamp", - "unusualfishmod:sea_boom" + "unusualfishmod:sea_boom", + "unusualfishmod:copper_antenna", + "unusualfishmod:volt_detector" ] } \ No newline at end of file diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/chiseled_crimson_bricks.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/chiseled_crimson_bricks.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/chiseled_crimson_bricks.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/chiseled_crimson_bricks.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/chiseled_relucent_bricks.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/chiseled_relucent_bricks.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/chiseled_relucent_bricks.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/chiseled_relucent_bricks.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/copper_antenna.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/copper_antenna.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/copper_antenna.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/copper_antenna.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_brick_slab.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_brick_slab.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_brick_slab.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_brick_slab.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_brick_stairs.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_brick_stairs.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_brick_stairs.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_brick_stairs.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_brick_wall.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_brick_wall.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_brick_wall.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_brick_wall.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_bricks.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_bricks.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_bricks.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_bricks.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_tile_slab.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_tile_slab.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_tile_slab.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_tile_slab.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_tile_stairs.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_tile_stairs.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_tile_stairs.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_tile_stairs.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_tile_wall.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_tile_wall.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_tile_wall.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_tile_wall.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_tiles.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_tiles.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/crimson_tiles.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/crimson_tiles.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/nautical_lamp.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/nautical_lamp.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/nautical_lamp.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/nautical_lamp.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_brick_slab.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_brick_slab.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_brick_slab.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_brick_slab.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_brick_stairs.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_brick_stairs.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_brick_stairs.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_brick_stairs.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_brick_wall.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_brick_wall.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_brick_wall.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_brick_wall.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_bricks.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_bricks.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_bricks.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_bricks.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_tile_slab.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_tile_slab.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_tile_slab.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_tile_slab.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_tile_stairs.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_tile_stairs.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_tile_stairs.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_tile_stairs.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_tile_wall.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_tile_wall.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_tile_wall.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_tile_wall.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_tiles.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_tiles.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/relucent_tiles.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/relucent_tiles.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/sea_boom.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/sea_boom.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/sea_boom.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/sea_boom.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/blocks/volt_detector.json b/src/main/resources/data/unusualfishmod/loot_table/blocks/volt_detector.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/blocks/volt_detector.json rename to src/main/resources/data/unusualfishmod/loot_table/blocks/volt_detector.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/aero_mono.json b/src/main/resources/data/unusualfishmod/loot_table/entities/aero_mono.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/aero_mono.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/aero_mono.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/amber_goby.json b/src/main/resources/data/unusualfishmod/loot_table/entities/amber_goby.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/amber_goby.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/amber_goby.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/bark_angelfish.json b/src/main/resources/data/unusualfishmod/loot_table/entities/bark_angelfish.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/bark_angelfish.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/bark_angelfish.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/beaked_herring.json b/src/main/resources/data/unusualfishmod/loot_table/entities/beaked_herring.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/beaked_herring.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/beaked_herring.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/blindsailfin.json b/src/main/resources/data/unusualfishmod/loot_table/entities/blindsailfin.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/blindsailfin.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/blindsailfin.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/blizzardfin.json b/src/main/resources/data/unusualfishmod/loot_table/entities/blizzardfin.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/blizzardfin.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/blizzardfin.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/circus.json b/src/main/resources/data/unusualfishmod/loot_table/entities/circus.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/circus.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/circus.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/copperflame.json b/src/main/resources/data/unusualfishmod/loot_table/entities/copperflame.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/copperflame.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/copperflame.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/crimsonshell.json b/src/main/resources/data/unusualfishmod/loot_table/entities/crimsonshell.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/crimsonshell.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/crimsonshell.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/demon_herring.json b/src/main/resources/data/unusualfishmod/loot_table/entities/demon_herring.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/demon_herring.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/demon_herring.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/drooping_gourami.json b/src/main/resources/data/unusualfishmod/loot_table/entities/drooping_gourami.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/drooping_gourami.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/drooping_gourami.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/duality_damselfish.json b/src/main/resources/data/unusualfishmod/loot_table/entities/duality_damselfish.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/duality_damselfish.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/duality_damselfish.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/eyelash.json b/src/main/resources/data/unusualfishmod/loot_table/entities/eyelash.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/eyelash.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/eyelash.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/forkfish.json b/src/main/resources/data/unusualfishmod/loot_table/entities/forkfish.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/forkfish.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/forkfish.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/gnasher.json b/src/main/resources/data/unusualfishmod/loot_table/entities/gnasher.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/gnasher.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/gnasher.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/hatchet_fish.json b/src/main/resources/data/unusualfishmod/loot_table/entities/hatchet_fish.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/hatchet_fish.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/hatchet_fish.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/mossthorn.json b/src/main/resources/data/unusualfishmod/loot_table/entities/mossthorn.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/mossthorn.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/mossthorn.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/picklefish.json b/src/main/resources/data/unusualfishmod/loot_table/entities/picklefish.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/picklefish.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/picklefish.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/pinkfin.json b/src/main/resources/data/unusualfishmod/loot_table/entities/pinkfin.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/pinkfin.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/pinkfin.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/porcupine_lobsta.json b/src/main/resources/data/unusualfishmod/loot_table/entities/porcupine_lobsta.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/porcupine_lobsta.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/porcupine_lobsta.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/prawn.json b/src/main/resources/data/unusualfishmod/loot_table/entities/prawn.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/prawn.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/prawn.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/ripper.json b/src/main/resources/data/unusualfishmod/loot_table/entities/ripper.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/ripper.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/ripper.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/rootball.json b/src/main/resources/data/unusualfishmod/loot_table/entities/rootball.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/rootball.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/rootball.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/sailor_barb.json b/src/main/resources/data/unusualfishmod/loot_table/entities/sailor_barb.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/sailor_barb.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/sailor_barb.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/shockcat.json b/src/main/resources/data/unusualfishmod/loot_table/entities/shockcat.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/shockcat.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/shockcat.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/sneep_snorp.json b/src/main/resources/data/unusualfishmod/loot_table/entities/sneep_snorp.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/sneep_snorp.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/sneep_snorp.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/sneepsnorp.json b/src/main/resources/data/unusualfishmod/loot_table/entities/sneepsnorp.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/sneepsnorp.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/sneepsnorp.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/snowflaketail.json b/src/main/resources/data/unusualfishmod/loot_table/entities/snowflaketail.json similarity index 89% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/snowflaketail.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/snowflaketail.json index acb00fb..87f5459 100644 --- a/src/main/resources/data/unusualfishmod/loot_tables/entities/snowflaketail.json +++ b/src/main/resources/data/unusualfishmod/loot_table/entities/snowflaketail.json @@ -21,7 +21,7 @@ "entries": [ { "type": "minecraft:item", - "name": "unusualfishmod:raw_snowflake" + "name": "unusualfishmod:raw_frosty_fin" } ] } diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/spindlefish.json b/src/main/resources/data/unusualfishmod/loot_table/entities/spindlefish.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/spindlefish.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/spindlefish.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/triple_twirl_pleco.json b/src/main/resources/data/unusualfishmod/loot_table/entities/triple_twirl_pleco.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/triple_twirl_pleco.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/triple_twirl_pleco.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/trumpet_squid.json b/src/main/resources/data/unusualfishmod/loot_table/entities/trumpet_squid.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/trumpet_squid.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/trumpet_squid.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/entities/voltangler.json b/src/main/resources/data/unusualfishmod/loot_table/entities/voltangler.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/entities/voltangler.json rename to src/main/resources/data/unusualfishmod/loot_table/entities/voltangler.json diff --git a/src/main/resources/data/unusualfishmod/loot_tables/gameplay/sea_pancake_search.json b/src/main/resources/data/unusualfishmod/loot_table/gameplay/sea_pancake_search.json similarity index 100% rename from src/main/resources/data/unusualfishmod/loot_tables/gameplay/sea_pancake_search.json rename to src/main/resources/data/unusualfishmod/loot_table/gameplay/sea_pancake_search.json diff --git a/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/snowflake_tail_fish.json b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/snowflake_tail_fish.json index 8ab2599..b1e4dd2 100644 --- a/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/snowflake_tail_fish.json +++ b/src/main/resources/data/unusualfishmod/neoforge/biome_modifier/snowflake_tail_fish.json @@ -5,7 +5,7 @@ ], "spawners": { - "type": "unusualfishmod:snowflaketail", + "type": "unusualfishmod:frostyfin", "weight": 20, "minCount": 3, "maxCount": 5 diff --git a/src/main/resources/data/unusualfishmod/tags/item/raw_unusual_fish.json b/src/main/resources/data/unusualfishmod/tags/item/raw_unusual_fish.json index 09789c0..a9dec23 100644 --- a/src/main/resources/data/unusualfishmod/tags/item/raw_unusual_fish.json +++ b/src/main/resources/data/unusualfishmod/tags/item/raw_unusual_fish.json @@ -3,7 +3,7 @@ "values": [ "unusualfishmod:raw_eyelash", "unusualfishmod:raw_spindlefish", - "unusualfishmod:raw_snowflake", + "unusualfishmod:raw_frosty_fin", "unusualfishmod:raw_aero_mono", "unusualfishmod:raw_sailor_barb", "unusualfishmod:raw_bark_angelfish", From 02b2e9cf599a79ef150e3c294985f394876ed256 Mon Sep 17 00:00:00 2001 From: Chakyl Date: Wed, 17 Jun 2026 17:54:57 -0400 Subject: [PATCH 05/12] logo --- .../codyhuh/unusualfishmod/UnusualFishMod.java | 2 -- .../core/registry/UFEnchantments.java | 5 +---- src/main/resources/logo.png | Bin 0 -> 127552 bytes src/main/templates/META-INF/neoforge.mods.toml | 3 +-- 4 files changed, 2 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/logo.png diff --git a/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java b/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java index aef87fb..aa8f5fe 100644 --- a/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java +++ b/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java @@ -18,8 +18,6 @@ public UnusualFishMod(IEventBus bus, ModContainer modContainer) { UFItems.ITEMS.register(bus); UFTabs.CREATIVE_TABS.register(bus); UFLootModifiers.LOOT_MODIFIERS.register(bus); -// don't need this prob -// NeoForge.EVENT_BUS.register(this); } public static ResourceLocation loc(String path) { diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEnchantments.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEnchantments.java index 0d1dc15..3a91558 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEnchantments.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEnchantments.java @@ -4,11 +4,8 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.enchantment.Enchantment; -import net.neoforged.neoforge.registries.DeferredRegister; public class UFEnchantments { - public static final ResourceKey UNUSUAL_CATCH = ResourceKey.create(Registries.ENCHANTMENT, ResourceLocation.fromNamespaceAndPath(UnusualFishMod.MOD_ID, "unusual_catch") - ); + public static final ResourceKey UNUSUAL_CATCH = ResourceKey.create(Registries.ENCHANTMENT, ResourceLocation.fromNamespaceAndPath(UnusualFishMod.MOD_ID, "unusual_catch")); } diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8992c5269709395803008897658ddb682b73176e GIT binary patch literal 127552 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 V Date: Wed, 17 Jun 2026 17:58:46 -0400 Subject: [PATCH 06/12] intelliji reformatting code, hopefully this doesn't ruin the diff --- .../unusualfishmod/UnusualFishMod.java | 27 +- .../unusualfishmod/client/ClientEvents.java | 325 ++++++------ .../geo/DemonHerringGlowRenderLayer.java | 3 - .../client/geo/GenericGeoModel.java | 1 - .../client/geo/GenericGeoRenderer.java | 80 ++- .../client/geo/TextureVariantModel.java | 2 +- .../misc/render/AbyssalBlastRenderer.java | 23 +- .../client/misc/render/RootballRenderer.java | 52 +- .../client/misc/render/SeaSpikeRenderer.java | 14 +- .../render/model/PrismarineSpearModel.java | 36 +- .../misc/render/model/RootballModel.java | 60 +-- .../unusualfishmod/common/CommonEvents.java | 2 +- .../common/block/SeaBoomBlock.java | 3 +- .../common/block/SquidEggsBlock.java | 11 +- .../block_entity/SeaBoomBlockEntity.java | 1 - .../block_entity/VoltDetectorBlockEntity.java | 26 +- .../common/entity/AeroMono.java | 203 ++++---- .../common/entity/AmberGoby.java | 216 ++++---- .../common/entity/BarkAngelfish.java | 207 ++++---- .../common/entity/BeakedHerring.java | 217 ++++---- .../common/entity/BlackCapSnail.java | 12 +- .../common/entity/BlindSailfin.java | 213 ++++---- .../common/entity/BlizzardfinTuna.java | 188 ++++--- .../common/entity/BrickSnail.java | 19 +- .../common/entity/CelestialFish.java | 26 +- .../common/entity/CircusFish.java | 161 +++--- .../common/entity/ClownthornShark.java | 189 ++++--- .../common/entity/CopperflameAnthias.java | 322 ++++++------ .../common/entity/CrimsonshellSquid.java | 35 +- .../common/entity/DeepCrawler.java | 207 ++++---- .../common/entity/DemonHerring.java | 312 ++++++------ .../common/entity/DroopingGourami.java | 185 ++++--- .../common/entity/DualityDamselfish.java | 322 ++++++------ .../common/entity/EyelashFish.java | 382 +++++++------- .../common/entity/Forkfish.java | 195 ++++--- .../common/entity/FreshwaterMantis.java | 274 +++++----- .../common/entity/FrostyFinFish.java | 206 ++++---- .../unusualfishmod/common/entity/Gnasher.java | 309 ++++++------ .../common/entity/HatchetFish.java | 224 ++++----- .../unusualfishmod/common/entity/Kalappa.java | 14 +- .../common/entity/LobedSkipper.java | 100 ++-- .../common/entity/ManaJellyfish.java | 44 +- .../common/entity/Mossthorn.java | 208 ++++---- .../common/entity/MuddytopSnail.java | 19 +- .../common/entity/Picklefish.java | 193 ++++--- .../common/entity/PinkfinIdol.java | 209 ++++---- .../common/entity/PorcupineLobster.java | 22 +- .../unusualfishmod/common/entity/Prawn.java | 12 +- .../common/entity/RhinoTetra.java | 474 +++++++++--------- .../unusualfishmod/common/entity/Ripper.java | 337 ++++++------- .../common/entity/Rootball.java | 58 +-- .../common/entity/RoughbackGuitarfish.java | 216 ++++---- .../common/entity/SailorBarb.java | 208 ++++---- .../common/entity/SeaMosquito.java | 197 ++++---- .../common/entity/SeaPancake.java | 254 +++++----- .../common/entity/SeaSpider.java | 221 ++++---- .../common/entity/Shockcat.java | 240 +++++---- .../unusualfishmod/common/entity/Skrimp.java | 310 ++++++------ .../common/entity/SneepSnorp.java | 208 ++++---- .../common/entity/Spindlefish.java | 237 +++++---- .../common/entity/SpoonShark.java | 187 ++++--- .../common/entity/Squoddle.java | 255 +++++----- .../common/entity/StoutBichir.java | 16 +- .../common/entity/TigerJungleShark.java | 20 +- .../common/entity/TigerPuffer.java | 25 +- .../unusualfishmod/common/entity/Tribble.java | 62 +-- .../common/entity/TripleTwirlPleco.java | 188 ++++--- .../common/entity/TrumpetSquid.java | 453 +++++++++-------- .../common/entity/VoltAngler.java | 26 +- .../common/entity/ZebraCornetfish.java | 17 +- .../item/AbstractMovingBlockEntity.java | 31 +- .../common/entity/item/AbyssalBlast.java | 35 +- .../entity/item/FallingTreeBlockEntity.java | 11 +- .../entity/item/ThrownPrismarineSpear.java | 2 +- .../util/base/BreedableWaterAnimal.java | 56 +-- .../base/BucketableSchoolingWaterAnimal.java | 5 +- .../util/base/BucketableWaterAnimal.java | 14 +- .../entity/util/goal/BottomStrollGoal.java | 4 +- .../goal/BreedableWaterAnimalBreedGoal.java | 10 +- .../entity/util/misc/MovingBlockData.java | 32 +- .../common/item/DepthScytheItem.java | 10 +- .../common/item/PrismarineSpearItem.java | 36 +- .../common/item/RipsawItem.java | 19 +- .../common/item/StargazerItem.java | 4 +- .../common/item/UFFishBucketItem.java | 6 +- .../common/item/WeatherShellItem.java | 6 +- .../loot/BuriedTreasureLootModifier.java | 10 +- .../loot/UnderwaterRuinsLootModifier.java | 7 +- .../core/registry/UFBlocks.java | 50 +- .../core/registry/UFEntities.java | 122 ++--- .../unusualfishmod/core/registry/UFItems.java | 378 +++++++------- .../core/registry/UFLootModifiers.java | 8 +- .../core/registry/UFSounds.java | 2 +- .../unusualfishmod/core/registry/UFTabs.java | 1 + 94 files changed, 5463 insertions(+), 5716 deletions(-) diff --git a/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java b/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java index aa8f5fe..380755a 100644 --- a/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java +++ b/src/main/java/codyhuh/unusualfishmod/UnusualFishMod.java @@ -8,20 +8,21 @@ @Mod(UnusualFishMod.MOD_ID) public class UnusualFishMod { - public static final String MOD_ID = "unusualfishmod"; - public UnusualFishMod(IEventBus bus, ModContainer modContainer) { + public static final String MOD_ID = "unusualfishmod"; - UFSounds.SOUND_EVENTS.register(bus); - UFBlocks.BLOCKS.register(bus); - UFBlockEntities.BLOCK_ENTITIES.register(bus); - UFEntities.ENTITIES.register(bus); - UFItems.ITEMS.register(bus); - UFTabs.CREATIVE_TABS.register(bus); - UFLootModifiers.LOOT_MODIFIERS.register(bus); - } + public UnusualFishMod(IEventBus bus, ModContainer modContainer) { - public static ResourceLocation loc(String path) { - return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); - } + UFSounds.SOUND_EVENTS.register(bus); + UFBlocks.BLOCKS.register(bus); + UFBlockEntities.BLOCK_ENTITIES.register(bus); + UFEntities.ENTITIES.register(bus); + UFItems.ITEMS.register(bus); + UFTabs.CREATIVE_TABS.register(bus); + UFLootModifiers.LOOT_MODIFIERS.register(bus); + } + + public static ResourceLocation loc(String path) { + return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); + } } diff --git a/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java b/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java index cf4f33b..653f574 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java +++ b/src/main/java/codyhuh/unusualfishmod/client/ClientEvents.java @@ -2,13 +2,9 @@ import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.client.geo.*; -import codyhuh.unusualfishmod.client.misc.render.AbyssalBlastRenderer; -import codyhuh.unusualfishmod.client.misc.render.FallingTreeBlockRenderer; -import codyhuh.unusualfishmod.client.misc.render.SeaSpikeRenderer; -import codyhuh.unusualfishmod.client.misc.render.ThrownPrismarineSpearRenderer; -import codyhuh.unusualfishmod.client.misc.render.model.RootballModel; +import codyhuh.unusualfishmod.client.misc.render.*; import codyhuh.unusualfishmod.client.misc.render.model.PrismarineSpearModel; -import codyhuh.unusualfishmod.client.misc.render.RootballRenderer; +import codyhuh.unusualfishmod.client.misc.render.model.RootballModel; import codyhuh.unusualfishmod.common.entity.*; import codyhuh.unusualfishmod.core.registry.UFEntities; import codyhuh.unusualfishmod.core.registry.UFItems; @@ -25,7 +21,6 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; -import net.neoforged.neoforge.registries.DeferredRegister; import java.util.ArrayList; @@ -34,164 +29,164 @@ @EventBusSubscriber(modid = UnusualFishMod.MOD_ID, value = Dist.CLIENT) public final class ClientEvents { - @SubscribeEvent - public static void clientSetup(FMLClientSetupEvent e) { - ItemProperties.register(UFItems.CLEMENT_SHELL.get(), loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); - ItemProperties.register(UFItems.FLUVIAL_SHELL.get(),loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); - ItemProperties.register(UFItems.THUNDEROUS_SHELL.get(), loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); - ItemProperties.register(UFItems.PRISMARINE_SPEAR.get(), loc("using"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); - ///ItemProperties.register(UFItems.RIPSAW.get(), new ResourceLocation("sawing"), (stack, level, player, i) -> player != null && player.isUsingItem() && stack.hasTag() ? stack.getOrCreateTag().getFloat("SawingProgress") : 0.0F); - ItemProperties.register(UFItems.CORAL_SKRIMP_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); - ItemProperties.register(UFItems.COPPERFLAME_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); - ItemProperties.register(UFItems.DEMON_HERRING_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); - } - - private static int getBucketVariant(ItemStack stack) { - CustomData customData = stack.get(DataComponents.BUCKET_ENTITY_DATA); - if (customData != null) { - CompoundTag tag = customData.copyTag(); - if (customData.contains("Variant")) { - return tag.getInt("Variant"); - } - } - return 0; - } - - private static void make(EntityType type, String name){ - EntityRenderers.register(type, (ctx) -> new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>(name), false)); - } - - @SubscribeEvent - public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { - EntityType[] simpleEntities = new EntityType[]{ - UFEntities.AERO_MONO.get(), UFEntities.AMBER_GOBY.get(), UFEntities.BARK_ANGELFISH.get(), UFEntities.BEAKED_HERRING.get(), - UFEntities.BLACKCAP_SNAIL.get(), UFEntities.BLIND_SAILFIN.get(), UFEntities.BLIZZARDFIN_TUNA.get(), UFEntities.BRICK_SNAIL.get(), - UFEntities.CIRCUS_FISH.get(), UFEntities.CLOWNTHORN_SHARK.get(), UFEntities.CRIMSONSHELL_SQUID.get(), UFEntities.DEEP_CRAWLER.get(), - UFEntities.DROOPING_GOURAMI.get(), UFEntities.FORKFISH.get(), UFEntities.FRESHWATER_MANTIS.get(), UFEntities.KALAPPA.get(), - UFEntities.LOBED_SKIPPER.get(), UFEntities.MOSSTHORN.get(), UFEntities.MUDDYTOP_SNAIL.get(), UFEntities.PINKFIN.get(), - UFEntities.PORCUPINE_LOBSTA.get(), UFEntities.PRAWN.get(), UFEntities.RHINO_TETRA.get(), UFEntities.RIPPER.get(), - UFEntities.ROUGHBACK.get(), UFEntities.SAILOR_BARB.get(), UFEntities.SEA_MOSQUITO.get(), - UFEntities.SEA_PANCAKE.get(), UFEntities.SEA_SPIDER.get(), UFEntities.SNEEPSNORP.get(), UFEntities.FROSTY_FIN.get(), - UFEntities.SPINDLEFISH.get(), UFEntities.SPOON_SHARK.get(), UFEntities.SQUODDLE.get(), UFEntities.STOUT_BICHIR.get(), - UFEntities.TIGER_JUNGLE_SHARK.get(), UFEntities.TIGER_PUFFER.get(), UFEntities.TRIBBLE.get(), UFEntities.TRUMPET_SQUID.get(), - UFEntities.ZEBRA_CORNETFISH.get(), UFEntities.TRIPLE_TWIRL_PLECO.get(), // todo - triple twirl pleco variants - }; - for (EntityType type : simpleEntities) { - make(type, type.getDescriptionId().substring("entity.unusualfishmod.".length())); - } - - e.registerEntityRenderer(UFEntities.DUALITY_DAMSELFISH.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { - TextureVariantModel model = new TextureVariantModel<>("duality_damselfish"); - ArrayList textures = new ArrayList<>(); - for (int i = 1; i <= 2; i++) { - textures.add(loc("textures/entity/duality_damselfish/duality_damselfish_" + i + ".png")); - } - model.setTextures(DualityDamselfish::getVariant, textures); - return model; - }, false); - return render; - }); - - e.registerEntityRenderer(UFEntities.CELESTIAL_FISH.get(), (ctx) -> new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("celestial_fish"), true)); - - e.registerEntityRenderer(UFEntities.COPPERFLAME.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { - TextureVariantModel model = new TextureVariantModel<>("copperflame"); - ArrayList textures = new ArrayList<>(); - for (int i = 1; i <= 2; i++) { - textures.add(loc("textures/entity/copperflame_anthias/copperflame_" + i + ".png")); - } - model.setTextures(CopperflameAnthias::getVariant, textures); - return model; - }, true); - return render; - }); - - e.registerEntityRenderer(UFEntities.DEMON_HERRING.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { - TextureVariantModel model = new TextureVariantModel<>("demon_herring"); - ArrayList textures = new ArrayList<>(); - for (int i = 1; i <= 3; i++) { - textures.add(loc("textures/entity/demon_herring/demon_herring_" + i + ".png")); - } - model.setTextures(DemonHerring::getVariant, textures); - return model; - }, false); - render.addRenderLayer(new DemonHerringGlowRenderLayer<>(render)); - return render; - }); - - e.registerEntityRenderer(UFEntities.GNASHER.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("gnasher"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/gnasher.png"))); - return render; - }); - - e.registerEntityRenderer(UFEntities.EYELASH.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { - TextureVariantModel model = new TextureVariantModel<>("eyelash_fish"); - ArrayList textures = new ArrayList<>(); - for (int i = 1; i <= 15; i++) { - textures.add(loc("textures/entity/eyelash_fish/eyelash_fish_" + i + ".png")); - } - model.setTextures(EyelashFish::getVariant, textures); - return model; - }, false); - return render; - }); - - e.registerEntityRenderer(UFEntities.HATCHET_FISH.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("hatchet_fish"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/hatchet_fish.png"))); - return render; - }); - - e.registerEntityRenderer(UFEntities.WIZARD_JELLY.get(), (ctx) -> new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("mana_jellyfish"), true)); - - e.registerEntityRenderer(UFEntities.PICKLEFISH.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("picklefish"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/picklefish.png"))); - return render; - }); - - e.registerEntityRenderer(UFEntities.CORAL_SKRIMP.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { - TextureVariantModel model = new TextureVariantModel<>("skrimp"); - ArrayList textures = new ArrayList<>(); - for (int i = 1; i <= 15; i++) { - textures.add(loc("textures/entity/skrimp/skrimp_" + i + ".png")); - } - model.setTextures(Skrimp::getVariant, textures); - return model; - }, false); - return render; - }); - - e.registerEntityRenderer(UFEntities.SHOCKCAT.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("shockcat"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/shockcat.png"))); - return render; - }); - - e.registerEntityRenderer(UFEntities.VOLT_ANGLER.get(), (ctx) -> { - GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("volt_angler"), false); - render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/volt_angler.png"))); - return render; - }); - - e.registerEntityRenderer(UFEntities.ABYSSAL_BLAST.get(), AbyssalBlastRenderer::new); - e.registerEntityRenderer(UFEntities.PRISMARINE_SPEAR.get(), ThrownPrismarineSpearRenderer::new); - e.registerEntityRenderer(UFEntities.SEA_SPIKE.get(), SeaSpikeRenderer::new); - e.registerEntityRenderer(UFEntities.FALLING_TREE.get(), FallingTreeBlockRenderer::new); - e.registerEntityRenderer(UFEntities.ROOTBALL.get(), RootballRenderer::new); - } - - @SubscribeEvent - public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions e) { - e.registerLayerDefinition(UFModelLayers.PRISMARINE_SPEAR, PrismarineSpearModel::createBodyLayer); - e.registerLayerDefinition(UFModelLayers.ROOTBALL, RootballModel::createBodyLayer); - } + @SubscribeEvent + public static void clientSetup(FMLClientSetupEvent e) { + ItemProperties.register(UFItems.CLEMENT_SHELL.get(), loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); + ItemProperties.register(UFItems.FLUVIAL_SHELL.get(), loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); + ItemProperties.register(UFItems.THUNDEROUS_SHELL.get(), loc("blowing"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); + ItemProperties.register(UFItems.PRISMARINE_SPEAR.get(), loc("using"), (p_234978_, p_234979_, p_234980_, p_234981_) -> p_234980_ != null && p_234980_.isUsingItem() && p_234980_.getUseItem() == p_234978_ ? 1.0F : 0.0F); + ///ItemProperties.register(UFItems.RIPSAW.get(), new ResourceLocation("sawing"), (stack, level, player, i) -> player != null && player.isUsingItem() && stack.hasTag() ? stack.getOrCreateTag().getFloat("SawingProgress") : 0.0F); + ItemProperties.register(UFItems.CORAL_SKRIMP_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); + ItemProperties.register(UFItems.COPPERFLAME_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); + ItemProperties.register(UFItems.DEMON_HERRING_BUCKET.get(), loc("variant"), (stack, level, entity, seed) -> getBucketVariant(stack)); + } + + private static int getBucketVariant(ItemStack stack) { + CustomData customData = stack.get(DataComponents.BUCKET_ENTITY_DATA); + if (customData != null) { + CompoundTag tag = customData.copyTag(); + if (customData.contains("Variant")) { + return tag.getInt("Variant"); + } + } + return 0; + } + + private static void make(EntityType type, String name) { + EntityRenderers.register(type, (ctx) -> new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>(name), false)); + } + + @SubscribeEvent + public static void registerRenderers(EntityRenderersEvent.RegisterRenderers e) { + EntityType[] simpleEntities = new EntityType[]{ + UFEntities.AERO_MONO.get(), UFEntities.AMBER_GOBY.get(), UFEntities.BARK_ANGELFISH.get(), UFEntities.BEAKED_HERRING.get(), + UFEntities.BLACKCAP_SNAIL.get(), UFEntities.BLIND_SAILFIN.get(), UFEntities.BLIZZARDFIN_TUNA.get(), UFEntities.BRICK_SNAIL.get(), + UFEntities.CIRCUS_FISH.get(), UFEntities.CLOWNTHORN_SHARK.get(), UFEntities.CRIMSONSHELL_SQUID.get(), UFEntities.DEEP_CRAWLER.get(), + UFEntities.DROOPING_GOURAMI.get(), UFEntities.FORKFISH.get(), UFEntities.FRESHWATER_MANTIS.get(), UFEntities.KALAPPA.get(), + UFEntities.LOBED_SKIPPER.get(), UFEntities.MOSSTHORN.get(), UFEntities.MUDDYTOP_SNAIL.get(), UFEntities.PINKFIN.get(), + UFEntities.PORCUPINE_LOBSTA.get(), UFEntities.PRAWN.get(), UFEntities.RHINO_TETRA.get(), UFEntities.RIPPER.get(), + UFEntities.ROUGHBACK.get(), UFEntities.SAILOR_BARB.get(), UFEntities.SEA_MOSQUITO.get(), + UFEntities.SEA_PANCAKE.get(), UFEntities.SEA_SPIDER.get(), UFEntities.SNEEPSNORP.get(), UFEntities.FROSTY_FIN.get(), + UFEntities.SPINDLEFISH.get(), UFEntities.SPOON_SHARK.get(), UFEntities.SQUODDLE.get(), UFEntities.STOUT_BICHIR.get(), + UFEntities.TIGER_JUNGLE_SHARK.get(), UFEntities.TIGER_PUFFER.get(), UFEntities.TRIBBLE.get(), UFEntities.TRUMPET_SQUID.get(), + UFEntities.ZEBRA_CORNETFISH.get(), UFEntities.TRIPLE_TWIRL_PLECO.get(), // todo - triple twirl pleco variants + }; + for (EntityType type : simpleEntities) { + make(type, type.getDescriptionId().substring("entity.unusualfishmod.".length())); + } + + e.registerEntityRenderer(UFEntities.DUALITY_DAMSELFISH.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { + TextureVariantModel model = new TextureVariantModel<>("duality_damselfish"); + ArrayList textures = new ArrayList<>(); + for (int i = 1; i <= 2; i++) { + textures.add(loc("textures/entity/duality_damselfish/duality_damselfish_" + i + ".png")); + } + model.setTextures(DualityDamselfish::getVariant, textures); + return model; + }, false); + return render; + }); + + e.registerEntityRenderer(UFEntities.CELESTIAL_FISH.get(), (ctx) -> new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("celestial_fish"), true)); + + e.registerEntityRenderer(UFEntities.COPPERFLAME.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { + TextureVariantModel model = new TextureVariantModel<>("copperflame"); + ArrayList textures = new ArrayList<>(); + for (int i = 1; i <= 2; i++) { + textures.add(loc("textures/entity/copperflame_anthias/copperflame_" + i + ".png")); + } + model.setTextures(CopperflameAnthias::getVariant, textures); + return model; + }, true); + return render; + }); + + e.registerEntityRenderer(UFEntities.DEMON_HERRING.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { + TextureVariantModel model = new TextureVariantModel<>("demon_herring"); + ArrayList textures = new ArrayList<>(); + for (int i = 1; i <= 3; i++) { + textures.add(loc("textures/entity/demon_herring/demon_herring_" + i + ".png")); + } + model.setTextures(DemonHerring::getVariant, textures); + return model; + }, false); + render.addRenderLayer(new DemonHerringGlowRenderLayer<>(render)); + return render; + }); + + e.registerEntityRenderer(UFEntities.GNASHER.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("gnasher"), false); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/gnasher.png"))); + return render; + }); + + e.registerEntityRenderer(UFEntities.EYELASH.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { + TextureVariantModel model = new TextureVariantModel<>("eyelash_fish"); + ArrayList textures = new ArrayList<>(); + for (int i = 1; i <= 15; i++) { + textures.add(loc("textures/entity/eyelash_fish/eyelash_fish_" + i + ".png")); + } + model.setTextures(EyelashFish::getVariant, textures); + return model; + }, false); + return render; + }); + + e.registerEntityRenderer(UFEntities.HATCHET_FISH.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("hatchet_fish"), false); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/hatchet_fish.png"))); + return render; + }); + + e.registerEntityRenderer(UFEntities.WIZARD_JELLY.get(), (ctx) -> new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("mana_jellyfish"), true)); + + e.registerEntityRenderer(UFEntities.PICKLEFISH.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("picklefish"), false); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/picklefish.png"))); + return render; + }); + + e.registerEntityRenderer(UFEntities.CORAL_SKRIMP.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> { + TextureVariantModel model = new TextureVariantModel<>("skrimp"); + ArrayList textures = new ArrayList<>(); + for (int i = 1; i <= 15; i++) { + textures.add(loc("textures/entity/skrimp/skrimp_" + i + ".png")); + } + model.setTextures(Skrimp::getVariant, textures); + return model; + }, false); + return render; + }); + + e.registerEntityRenderer(UFEntities.SHOCKCAT.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("shockcat"), false); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/shockcat.png"))); + return render; + }); + + e.registerEntityRenderer(UFEntities.VOLT_ANGLER.get(), (ctx) -> { + GenericGeoRenderer render = new GenericGeoRenderer<>(ctx, () -> new GenericGeoModel<>("volt_angler"), false); + render.addRenderLayer(new UFGlowRenderLayer<>(render, loc("textures/entity/glow/volt_angler.png"))); + return render; + }); + + e.registerEntityRenderer(UFEntities.ABYSSAL_BLAST.get(), AbyssalBlastRenderer::new); + e.registerEntityRenderer(UFEntities.PRISMARINE_SPEAR.get(), ThrownPrismarineSpearRenderer::new); + e.registerEntityRenderer(UFEntities.SEA_SPIKE.get(), SeaSpikeRenderer::new); + e.registerEntityRenderer(UFEntities.FALLING_TREE.get(), FallingTreeBlockRenderer::new); + e.registerEntityRenderer(UFEntities.ROOTBALL.get(), RootballRenderer::new); + } + + @SubscribeEvent + public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions e) { + e.registerLayerDefinition(UFModelLayers.PRISMARINE_SPEAR, PrismarineSpearModel::createBodyLayer); + e.registerLayerDefinition(UFModelLayers.ROOTBALL, RootballModel::createBodyLayer); + } } diff --git a/src/main/java/codyhuh/unusualfishmod/client/geo/DemonHerringGlowRenderLayer.java b/src/main/java/codyhuh/unusualfishmod/client/geo/DemonHerringGlowRenderLayer.java index 0db7dd2..eccfcf7 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/geo/DemonHerringGlowRenderLayer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/geo/DemonHerringGlowRenderLayer.java @@ -1,14 +1,11 @@ package codyhuh.unusualfishmod.client.geo; -import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.common.entity.DemonHerring; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.renderer.GeoRenderer; diff --git a/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoModel.java b/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoModel.java index d242cc3..f817c6b 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoModel.java +++ b/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoModel.java @@ -1,6 +1,5 @@ package codyhuh.unusualfishmod.client.geo; -import codyhuh.unusualfishmod.UnusualFishMod; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.animatable.GeoEntity; diff --git a/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoRenderer.java index d7e9a98..b3afb4b 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/geo/GenericGeoRenderer.java @@ -2,7 +2,6 @@ import codyhuh.unusualfishmod.common.entity.util.base.BreedableWaterAnimal; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -11,57 +10,56 @@ import net.minecraft.world.entity.AgeableMob; import net.minecraft.world.entity.LivingEntity; import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.renderer.GeoEntityRenderer; import java.util.function.Supplier; public class GenericGeoRenderer extends GeoEntityRenderer { - private float scale = 1F; - private boolean glow; + private float scale = 1F; + private final boolean glow; - public GenericGeoRenderer(EntityRendererProvider.Context renderManager, Supplier> model, boolean glow) { - super(renderManager, model.get()); - this.shadowRadius = 0.3F; - this.glow = glow; - } + public GenericGeoRenderer(EntityRendererProvider.Context renderManager, Supplier> model, boolean glow) { + super(renderManager, model.get()); + this.shadowRadius = 0.3F; + this.glow = glow; + } - public GenericGeoRenderer(EntityRendererProvider.Context renderManager, Supplier> model, float scale) { - this(renderManager, model.get(), scale); - this.scale = scale; - } - - public GenericGeoRenderer(EntityRendererProvider.Context mgr, GeoModel modelProvider, boolean glow) { - super(mgr, modelProvider); - this.glow = glow; - } + public GenericGeoRenderer(EntityRendererProvider.Context renderManager, Supplier> model, float scale) { + this(renderManager, model.get(), scale); + this.scale = scale; + } - public GenericGeoRenderer(EntityRendererProvider.Context mgr, GeoModel modelProvider, float scale) { - this(mgr, modelProvider, false); - this.scale = scale; - } - - @Override - public void render(T entity, float entityYaw, float partialTicks, PoseStack stack, MultiBufferSource bufferIn, int packedLightIn) { - if (scale != 1F) { - stack.scale(scale, scale, scale); - } + public GenericGeoRenderer(EntityRendererProvider.Context mgr, GeoModel modelProvider, boolean glow) { + super(mgr, modelProvider); + this.glow = glow; + } - if ((entity instanceof AgeableMob mob && mob.isBaby()) || entity instanceof BreedableWaterAnimal bwa && bwa.isBaby()) { - stack.scale(0.5F, 0.5F, 0.5F); - } + public GenericGeoRenderer(EntityRendererProvider.Context mgr, GeoModel modelProvider, float scale) { + this(mgr, modelProvider, false); + this.scale = scale; + } - super.render(entity, entityYaw, partialTicks, stack, bufferIn, packedLightIn); - } + @Override + public void render(T entity, float entityYaw, float partialTicks, PoseStack stack, MultiBufferSource bufferIn, int packedLightIn) { + if (scale != 1F) { + stack.scale(scale, scale, scale); + } - @Override - protected int getBlockLightLevel(T p_114496_, BlockPos p_114497_) { - return glow ? 15 : super.getBlockLightLevel(p_114496_, p_114497_); - } + if ((entity instanceof AgeableMob mob && mob.isBaby()) || entity instanceof BreedableWaterAnimal bwa && bwa.isBaby()) { + stack.scale(0.5F, 0.5F, 0.5F); + } - @Override - public RenderType getRenderType(T animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { - return RenderType.entityTranslucent(texture); - } + super.render(entity, entityYaw, partialTicks, stack, bufferIn, packedLightIn); + } + + @Override + protected int getBlockLightLevel(T p_114496_, BlockPos p_114497_) { + return glow ? 15 : super.getBlockLightLevel(p_114496_, p_114497_); + } + + @Override + public RenderType getRenderType(T animatable, ResourceLocation texture, @org.jetbrains.annotations.Nullable MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(texture); + } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/client/geo/TextureVariantModel.java b/src/main/java/codyhuh/unusualfishmod/client/geo/TextureVariantModel.java index fd75183..38c47cb 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/geo/TextureVariantModel.java +++ b/src/main/java/codyhuh/unusualfishmod/client/geo/TextureVariantModel.java @@ -15,7 +15,7 @@ public TextureVariantModel(String name) { super(name); } - public TextureVariantModel setTextures(Function whichTexture, List textures){ + public TextureVariantModel setTextures(Function whichTexture, List textures) { this.whichTexture = whichTexture; this.textures = textures; return this; diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java index 4f92b45..78ce239 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/AbyssalBlastRenderer.java @@ -33,7 +33,7 @@ public void render(AbyssalBlast entityIn, float entityYaw, float partialTicks, P int arcs = Mth.clamp(Mth.floor(entityIn.tickCount / 5F), 1, 4); matrixStackIn.translate(0.0D, 0.0F, 0.4D); - for(int i = 0; i < arcs; i++){ + for (int i = 0; i < arcs; i++) { matrixStackIn.pushPose(); matrixStackIn.translate(0, 0, -0.5F * i); renderArc(matrixStackIn, bufferIn, (i + 1) * 5, entityIn.isFasterAnimation()); @@ -49,8 +49,7 @@ private void renderArc(PoseStack matrixStackIn, MultiBufferSource bufferIn, int ResourceLocation res; if (fast) { res = getEntityTextureFaster(age); - } - else { + } else { res = getEntityTexture(age); } VertexConsumer ivertexbuilder = bufferIn.getBuffer(RenderType.entityCutoutNoCull(res)); @@ -75,14 +74,11 @@ public void drawVertex(Matrix4f matrixPos, PoseStack.Pose pose, VertexConsumer b public ResourceLocation getEntityTexture(int age) { if (age < 1) { return TEXTURE_0; - } - else if (age < 15) { + } else if (age < 15) { return TEXTURE_1; - } - else if (age < 40) { + } else if (age < 40) { return TEXTURE_2; - } - else { + } else { return TEXTURE_3; } } @@ -90,14 +86,11 @@ else if (age < 40) { public ResourceLocation getEntityTextureFaster(int age) { if (age < 6) { return TEXTURE_0; - } - else if (age < 9) { + } else if (age < 9) { return TEXTURE_1; - } - else if (age < 12) { + } else if (age < 12) { return TEXTURE_2; - } - else { + } else { return TEXTURE_3; } } diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/RootballRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/RootballRenderer.java index d00b5b7..4c1c8c4 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/RootballRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/RootballRenderer.java @@ -12,31 +12,31 @@ import static codyhuh.unusualfishmod.UnusualFishMod.loc; public class RootballRenderer extends MobRenderer> { - protected static final ResourceLocation TEXTURE = loc("textures/entity/rootball.png"); - - public RootballRenderer(EntityRendererProvider.Context renderManagerIn) { - super(renderManagerIn, new RootballModel<>(renderManagerIn.bakeLayer(UFModelLayers.ROOTBALL)), 0.2F); - } - - protected void scale(Rootball p_114046_, PoseStack p_114047_, float p_114048_) { - float f = p_114046_.getSwelling(p_114048_); - float f1 = 1.0F + Mth.sin(f * 100.0F) * f * 0.01F; - f = Mth.clamp(f, 0.0F, 1.0F); - f *= f; - f *= f; - float f2 = (1.0F + f * 0.4F) * f1; - float f3 = (1.0F + f * 0.1F) / f1; - p_114047_.scale(f2, f3, f2); - } - - protected float getWhiteOverlayProgress(Rootball p_114043_, float p_114044_) { - float f = p_114043_.getSwelling(p_114044_); - return (int)(f * 10.0F) % 2 == 0 ? 0.0F : Mth.clamp(f, 0.5F, 1.0F); - } - - @Override - public ResourceLocation getTextureLocation(Rootball entity) { - return TEXTURE; - } + protected static final ResourceLocation TEXTURE = loc("textures/entity/rootball.png"); + + public RootballRenderer(EntityRendererProvider.Context renderManagerIn) { + super(renderManagerIn, new RootballModel<>(renderManagerIn.bakeLayer(UFModelLayers.ROOTBALL)), 0.2F); + } + + protected void scale(Rootball p_114046_, PoseStack p_114047_, float p_114048_) { + float f = p_114046_.getSwelling(p_114048_); + float f1 = 1.0F + Mth.sin(f * 100.0F) * f * 0.01F; + f = Mth.clamp(f, 0.0F, 1.0F); + f *= f; + f *= f; + float f2 = (1.0F + f * 0.4F) * f1; + float f3 = (1.0F + f * 0.1F) / f1; + p_114047_.scale(f2, f3, f2); + } + + protected float getWhiteOverlayProgress(Rootball p_114043_, float p_114044_) { + float f = p_114043_.getSwelling(p_114044_); + return (int) (f * 10.0F) % 2 == 0 ? 0.0F : Mth.clamp(f, 0.5F, 1.0F); + } + + @Override + public ResourceLocation getTextureLocation(Rootball entity) { + return TEXTURE; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/SeaSpikeRenderer.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/SeaSpikeRenderer.java index 207c18b..63a72a5 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/SeaSpikeRenderer.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/SeaSpikeRenderer.java @@ -8,13 +8,13 @@ import static codyhuh.unusualfishmod.UnusualFishMod.loc; public class SeaSpikeRenderer extends ArrowRenderer { - public static final ResourceLocation LOCATION = loc("textures/entity/item/sea_spike.png"); + public static final ResourceLocation LOCATION = loc("textures/entity/item/sea_spike.png"); - public SeaSpikeRenderer(EntityRendererProvider.Context p_174399_) { - super(p_174399_); - } + public SeaSpikeRenderer(EntityRendererProvider.Context p_174399_) { + super(p_174399_); + } - public ResourceLocation getTextureLocation(SeaSpike p_116001_) { - return LOCATION; - } + public ResourceLocation getTextureLocation(SeaSpike p_116001_) { + return LOCATION; + } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/PrismarineSpearModel.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/PrismarineSpearModel.java index ba5f1e2..a19e257 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/PrismarineSpearModel.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/PrismarineSpearModel.java @@ -9,29 +9,29 @@ import net.minecraft.client.model.geom.builders.*; public class PrismarineSpearModel extends EntityModel { - private final ModelPart spear; + private final ModelPart spear; - public PrismarineSpearModel(ModelPart root) { - this.spear = root.getChild("spear"); - } + public PrismarineSpearModel(ModelPart root) { + this.spear = root.getChild("spear"); + } - public static LayerDefinition createBodyLayer() { - MeshDefinition meshdefinition = new MeshDefinition(); - PartDefinition partdefinition = meshdefinition.getRoot(); + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); - PartDefinition spear = partdefinition.addOrReplaceChild("spear", CubeListBuilder.create().texOffs(10, 0).addBox(-3.0F, -29.0F, 0.0F, 5.0F, 29.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-0.5F, -29.0F, -2.5F, 0.0F, 29.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition spear = partdefinition.addOrReplaceChild("spear", CubeListBuilder.create().texOffs(10, 0).addBox(-3.0F, -29.0F, 0.0F, 5.0F, 29.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-0.5F, -29.0F, -2.5F, 0.0F, 29.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - return LayerDefinition.create(meshdefinition, 64, 64); - } + return LayerDefinition.create(meshdefinition, 64, 64); + } - @Override - public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { - } + } - @Override - public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { - spear.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); - } + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + spear.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/RootballModel.java b/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/RootballModel.java index 214f00e..4619745 100644 --- a/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/RootballModel.java +++ b/src/main/java/codyhuh/unusualfishmod/client/misc/render/model/RootballModel.java @@ -10,45 +10,45 @@ import net.minecraft.util.Mth; public class RootballModel extends EntityModel { - private final ModelPart Body; - private final ModelPart Leg1; - private final ModelPart Leg2; + private final ModelPart Body; + private final ModelPart Leg1; + private final ModelPart Leg2; - public RootballModel(ModelPart root) { - this.Body = root.getChild("Body"); - this.Leg1 = root.getChild("Leg1"); - this.Leg2 = root.getChild("Leg2"); - } + public RootballModel(ModelPart root) { + this.Body = root.getChild("Body"); + this.Leg1 = root.getChild("Leg1"); + this.Leg2 = root.getChild("Leg2"); + } - public static LayerDefinition createBodyLayer() { - MeshDefinition meshdefinition = new MeshDefinition(); - PartDefinition partdefinition = meshdefinition.getRoot(); + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); - PartDefinition Body = partdefinition.addOrReplaceChild("Body", CubeListBuilder.create().texOffs(0, 8).addBox(-4.0F, -5.0F, 0.0F, 8.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 23.0F, -4.0F, -0.1309F, 0.0F, 0.0F)); + PartDefinition Body = partdefinition.addOrReplaceChild("Body", CubeListBuilder.create().texOffs(0, 8).addBox(-4.0F, -5.0F, 0.0F, 8.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 23.0F, -4.0F, -0.1309F, 0.0F, 0.0F)); - PartDefinition Seaweed1 = Body.addOrReplaceChild("Seaweed1", CubeListBuilder.create().texOffs(0, 0).addBox(-10.0F, -8.0F, 0.0F, 20.0F, 8.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, 4.0F, -0.1745F, 0.0F, 0.0F)); + PartDefinition Seaweed1 = Body.addOrReplaceChild("Seaweed1", CubeListBuilder.create().texOffs(0, 0).addBox(-10.0F, -8.0F, 0.0F, 20.0F, 8.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, 4.0F, -0.1745F, 0.0F, 0.0F)); - PartDefinition Seaweed2 = Body.addOrReplaceChild("Seaweed2", CubeListBuilder.create().texOffs(0, 9).addBox(0.0F, -8.0F, -1.0F, 0.0F, 8.0F, 12.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, 0.0F, -0.1309F, 0.0F, 0.0F)); + PartDefinition Seaweed2 = Body.addOrReplaceChild("Seaweed2", CubeListBuilder.create().texOffs(0, 9).addBox(0.0F, -8.0F, -1.0F, 0.0F, 8.0F, 12.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, 0.0F, -0.1309F, 0.0F, 0.0F)); - PartDefinition Feetsies = Body.addOrReplaceChild("Feetsies", CubeListBuilder.create().texOffs(18, 8).addBox(-6.0F, 0.0F, 0.0F, 12.0F, 0.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.0F, 5.0F, -0.0873F, 0.0F, 0.0F)); + PartDefinition Feetsies = Body.addOrReplaceChild("Feetsies", CubeListBuilder.create().texOffs(18, 8).addBox(-6.0F, 0.0F, 0.0F, 12.0F, 0.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.0F, 5.0F, -0.0873F, 0.0F, 0.0F)); - PartDefinition Leg1 = partdefinition.addOrReplaceChild("Leg1", CubeListBuilder.create().texOffs(24, 21).addBox(0.0F, 0.0F, -2.0F, 4.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(3.0F, 22.0F, -4.0F, 0.0F, -0.3491F, 0.0F)); + PartDefinition Leg1 = partdefinition.addOrReplaceChild("Leg1", CubeListBuilder.create().texOffs(24, 21).addBox(0.0F, 0.0F, -2.0F, 4.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(3.0F, 22.0F, -4.0F, 0.0F, -0.3491F, 0.0F)); - PartDefinition Leg2 = partdefinition.addOrReplaceChild("Leg2", CubeListBuilder.create().texOffs(24, 21).mirror().addBox(-4.0F, 0.0F, -2.0F, 4.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-3.0F, 22.0F, -4.0F, 0.0F, 0.3491F, 0.0F)); + PartDefinition Leg2 = partdefinition.addOrReplaceChild("Leg2", CubeListBuilder.create().texOffs(24, 21).mirror().addBox(-4.0F, 0.0F, -2.0F, 4.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-3.0F, 22.0F, -4.0F, 0.0F, 0.3491F, 0.0F)); - return LayerDefinition.create(meshdefinition, 64, 64); - } + return LayerDefinition.create(meshdefinition, 64, 64); + } - @Override - public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { - this.Leg1.xRot = Mth.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; - this.Leg2.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; - } + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.Leg1.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.Leg2.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + } - @Override - public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, int color) { - Body.render(poseStack, buffer, packedLight, packedOverlay, color); - Leg1.render(poseStack, buffer, packedLight, packedOverlay, color); - Leg2.render(poseStack, buffer, packedLight, packedOverlay, color); - } + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, int color) { + Body.render(poseStack, buffer, packedLight, packedOverlay, color); + Leg1.render(poseStack, buffer, packedLight, packedOverlay, color); + Leg2.render(poseStack, buffer, packedLight, packedOverlay, color); + } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java b/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java index 1f26dbf..9c672ea 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java +++ b/src/main/java/codyhuh/unusualfishmod/common/CommonEvents.java @@ -5,7 +5,6 @@ import codyhuh.unusualfishmod.core.registry.UFEntities; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.world.entity.SpawnPlacementTypes; -import net.minecraft.world.item.TridentItem; import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.levelgen.Heightmap; import net.neoforged.bus.api.SubscribeEvent; @@ -23,6 +22,7 @@ public static void commonSetup(FMLCommonSetupEvent e) { DispenserBlock.registerProjectileBehavior(UFItems.PRISMARINE_SPEAR.get()); }); } + @SubscribeEvent public static void registerSpawnPlacements(RegisterSpawnPlacementsEvent e) { e.register(UFEntities.AERO_MONO.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.WORLD_SURFACE, AeroMono::canSpawn, RegisterSpawnPlacementsEvent.Operation.REPLACE); diff --git a/src/main/java/codyhuh/unusualfishmod/common/block/SeaBoomBlock.java b/src/main/java/codyhuh/unusualfishmod/common/block/SeaBoomBlock.java index e3b523d..7ce5042 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/block/SeaBoomBlock.java +++ b/src/main/java/codyhuh/unusualfishmod/common/block/SeaBoomBlock.java @@ -12,7 +12,6 @@ import net.minecraft.tags.FluidTags; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -37,6 +36,7 @@ public SeaBoomBlock(Properties p_49795_) { super(p_49795_); this.registerDefaultState(this.stateDefinition.any().setValue(LOADED, false).setValue(HOSTILE_ONLY, false)); } + @Override public RenderShape getRenderShape(BlockState p_49232_) { return RenderShape.MODEL; @@ -61,6 +61,7 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev return super.useItemOn(stack, state, level, pos, player, hand, hitResult); } + @Override protected MapCodec codec() { return null; diff --git a/src/main/java/codyhuh/unusualfishmod/common/block/SquidEggsBlock.java b/src/main/java/codyhuh/unusualfishmod/common/block/SquidEggsBlock.java index 0f56498..32ae6d6 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/block/SquidEggsBlock.java +++ b/src/main/java/codyhuh/unusualfishmod/common/block/SquidEggsBlock.java @@ -10,7 +10,6 @@ import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.EntityType; -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; @@ -31,7 +30,6 @@ import java.util.function.Supplier; public class SquidEggsBlock extends FrogspawnBlock implements SimpleWaterloggedBlock { - private final Supplier> entityType; public static final DirectionProperty FACING = BlockStateProperties.FACING; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; protected static final VoxelShape UP_AABB = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D); @@ -40,6 +38,7 @@ public class SquidEggsBlock extends FrogspawnBlock implements SimpleWaterloggedB protected static final VoxelShape NORTH_AABB = Block.box(0, 0, 10, 16, 16, 16); protected static final VoxelShape EAST_AABB = Block.box(0, 0, 0, 6, 16, 16); protected static final VoxelShape WEST_AABB = Block.box(10, 0, 0, 16, 16, 16); + private final Supplier> entityType; public SquidEggsBlock(Supplier> tadpole, Properties p_221177_) { super(p_221177_); @@ -105,13 +104,13 @@ private void destroyBlock(Level p_221191_, BlockPos p_221192_) { public void spawnTadpoles(ServerLevel p_221221_, BlockPos p_221222_, RandomSource p_221223_) { int i = p_221223_.nextInt(2, 6); - for(int j = 1; j <= i; ++j) { + for (int j = 1; j <= i; ++j) { BreedableWaterAnimal squid = entityType.get().create(p_221221_); - double d0 = (double)p_221222_.getX() + this.getRandomTadpolePositionOffset(p_221223_); - double d1 = (double)p_221222_.getZ() + this.getRandomTadpolePositionOffset(p_221223_); + double d0 = (double) p_221222_.getX() + this.getRandomTadpolePositionOffset(p_221223_); + double d1 = (double) p_221222_.getZ() + this.getRandomTadpolePositionOffset(p_221223_); int k = p_221223_.nextInt(1, 361); double facing = p_221221_.getBlockState(p_221222_).getValue(FACING).get3DDataValue() * 0.5D; - squid.moveTo(d0 + facing, (double)p_221222_.getY() + facing, d1 + facing, (float)k, 0.0F); + squid.moveTo(d0 + facing, (double) p_221222_.getY() + facing, d1 + facing, (float) k, 0.0F); squid.setPersistenceRequired(); squid.setAge(-24000); p_221221_.addFreshEntity(squid); diff --git a/src/main/java/codyhuh/unusualfishmod/common/block_entity/SeaBoomBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/block_entity/SeaBoomBlockEntity.java index fcbfc0d..876b4fb 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/block_entity/SeaBoomBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/block_entity/SeaBoomBlockEntity.java @@ -9,7 +9,6 @@ import net.minecraft.core.Direction; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.monster.Monster; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java index 9d5750d..8927928 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/block_entity/VoltDetectorBlockEntity.java @@ -16,21 +16,13 @@ import java.util.List; public class VoltDetectorBlockEntity extends BlockEntity { - private static List anglersList = new ArrayList<>(5); + private static final List anglersList = new ArrayList<>(5); private static List currentList = new ArrayList<>(5); public VoltDetectorBlockEntity(BlockPos pos, BlockState state) { super(UFBlockEntities.VOLT_DETECTOR.get(), pos, state); } - public final List getAnglerList() { - return currentList; - } - - public void addAnglerToList(LivingEntity obj) { - currentList.add(obj); - } - public static void serverTick(Level level, BlockPos pos, BlockState state, VoltDetectorBlockEntity voltDetector) { if (!anglersList.equals(currentList)) { currentList = anglersList; @@ -50,7 +42,7 @@ public static void serverTick(Level level, BlockPos pos, BlockState state, VoltD if (level.hasChunksAt(pos, pos) && state.is(UFBlocks.VOLT_DETECTOR.get()) && !level.getBlockState(pos).isAir() && level.getBlockState(pos).getValue(VoltDetectorBlock.ANGLERS) != anglers) { level.setBlock(pos, state.setValue(VoltDetectorBlock.ANGLERS, Math.min(anglers, 5)), 3); - ((VoltDetectorBlock)state.getBlock()).updateNeighbours(level, pos); + ((VoltDetectorBlock) state.getBlock()).updateNeighbours(level, pos); } } @@ -66,9 +58,9 @@ private static void nearDetector(Level level, BlockPos pos, double radius) { if (level.getBlockEntity(pos) instanceof VoltDetectorBlockEntity voltDetector && level.hasChunksAt(blockpos, blockpos1)) { BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(); - for(int i = blockpos.getX(); i <= blockpos1.getX(); ++i) { - for(int j = blockpos.getY(); j <= blockpos1.getY(); ++j) { - for(int k = blockpos.getZ(); k <= blockpos1.getZ(); ++k) { + for (int i = blockpos.getX(); i <= blockpos1.getX(); ++i) { + for (int j = blockpos.getY(); j <= blockpos1.getY(); ++j) { + for (int k = blockpos.getZ(); k <= blockpos1.getZ(); ++k) { mutablePos.set(i, j, k); int anglers = currentList.size(); @@ -86,4 +78,12 @@ private static void nearDetector(Level level, BlockPos pos, double radius) { } } } + + public final List getAnglerList() { + return currentList; + } + + public void addAnglerToList(LivingEntity obj) { + currentList.add(obj); + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/AeroMono.java b/src/main/java/codyhuh/unusualfishmod/common/entity/AeroMono.java index 391f338..4e7dcc6 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/AeroMono.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/AeroMono.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -34,105 +34,104 @@ public class AeroMono extends BucketableSchoolingWaterAnimal implements GeoEntity { - public AeroMono(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.AERO_MONO_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - super.aiStep(); - } - - public int getMaxSpawnClusterSize() { - return 8; - } - - public int getMaxSchoolSize() { - return 10; - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public AeroMono(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.AERO_MONO_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + super.aiStep(); + } + + public int getMaxSpawnClusterSize() { + return 8; + } + + public int getMaxSchoolSize() { + return 10; + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/AmberGoby.java b/src/main/java/codyhuh/unusualfishmod/common/entity/AmberGoby.java index 120c439..ee96ac9 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/AmberGoby.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/AmberGoby.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -33,112 +33,110 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class AmberGoby extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public AmberGoby(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.AMBER_GOBY_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 2; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 3; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public AmberGoby(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.AMBER_GOBY_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 2; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 3; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BarkAngelfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BarkAngelfish.java index dcd4f62..5eeded1 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BarkAngelfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BarkAngelfish.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -33,108 +33,105 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class BarkAngelfish extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public BarkAngelfish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.BARK_ANGELFISH_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 3; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 3; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public BarkAngelfish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.BARK_ANGELFISH_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 3; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 3; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BeakedHerring.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BeakedHerring.java index 08c3cf9..f4cd94e 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BeakedHerring.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BeakedHerring.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -33,113 +33,110 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class BeakedHerring extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public BeakedHerring(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.BEAKED_HERRING_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 10; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 20; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public BeakedHerring(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.BEAKED_HERRING_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 10; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 20; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BlackCapSnail.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BlackCapSnail.java index a58667f..76b41f0 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BlackCapSnail.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BlackCapSnail.java @@ -43,6 +43,7 @@ public class BlackCapSnail extends WaterAnimal implements Bucketable, GeoEntity { private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(BlackCapSnail.class, EntityDataSerializers.BOOLEAN); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public BlackCapSnail(EntityType type, Level world) { super(type, world); @@ -54,6 +55,10 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.3D).add(Attributes.ARMOR, 4.0D); } + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + protected void registerGoals() { this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.6F)); this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.3F)); @@ -119,6 +124,7 @@ private boolean isFromBucket() { public void setFromBucket(boolean p_203706_1_) { this.entityData.set(FROM_BUCKET, p_203706_1_); } + @Override public void loadFromBucketTag(CompoundTag p_148832_) { @@ -150,10 +156,6 @@ protected SoundEvent getHurtSound(DamageSource p_28281_) { return SoundEvents.COD_HURT; } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -168,8 +170,6 @@ private PlayState predicate(AnimationState event) { return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BlindSailfin.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BlindSailfin.java index 10505b5..c4b50df 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BlindSailfin.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BlindSailfin.java @@ -2,20 +2,12 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.goal.BottomStrollGoal; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -27,14 +19,12 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -45,106 +35,105 @@ public class BlindSailfin extends BucketableWaterAnimal implements GeoEntity { - public BlindSailfin(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - @Override - public void onInsideBubbleColumn(boolean downwards) { - } - - @Override - public void onAboveBubbleCol(boolean downwards) { - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.BLIND_SAILFIN_BUCKET.get()); - } - - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getLightEmission(pos) < 8 && iServerWorld.getBlockState(pos.above()).is(Blocks.WATER) && iServerWorld.getBlockState(pos).is(Blocks.WATER) && pos.getY() <= 30; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public BlindSailfin(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getLightEmission(pos) < 8 && iServerWorld.getBlockState(pos.above()).is(Blocks.WATER) && iServerWorld.getBlockState(pos).is(Blocks.WATER) && pos.getY() <= 30; + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + @Override + public void onInsideBubbleColumn(boolean downwards) { + } + + @Override + public void onAboveBubbleCol(boolean downwards) { + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.BLIND_SAILFIN_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BlizzardfinTuna.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BlizzardfinTuna.java index 0553323..325c2f8 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BlizzardfinTuna.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BlizzardfinTuna.java @@ -32,99 +32,97 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class BlizzardfinTuna extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public BlizzardfinTuna(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.5F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.BLIZZARDFIN_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 20.0D).add(Attributes.ATTACK_DAMAGE, 3.0D); - } - - @Override - public void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 1.5D, 1)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - public int getMaxSpawnClusterSize() { - return 4; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 10; - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - public SoundEvent getHurtSound(DamageSource damageSourceIn) { - return SoundEvents.COD_HURT; - } - - public SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public BlizzardfinTuna(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.5F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 20.0D).add(Attributes.ATTACK_DAMAGE, 3.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.BLIZZARDFIN_BUCKET.get()); + } + + @Override + public void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 1.5D, 1)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + public int getMaxSpawnClusterSize() { + return 4; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 10; + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + public SoundEvent getHurtSound(DamageSource damageSourceIn) { + return SoundEvents.COD_HURT; + } + + public SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/BrickSnail.java b/src/main/java/codyhuh/unusualfishmod/common/entity/BrickSnail.java index cba2bd1..a567ae3 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/BrickSnail.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/BrickSnail.java @@ -6,15 +6,9 @@ import codyhuh.unusualfishmod.common.entity.util.movement.SnailMoveControl; import codyhuh.unusualfishmod.core.registry.UFItems; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -27,7 +21,6 @@ import net.minecraft.world.entity.ai.goal.TryFindWaterGoal; import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -43,6 +36,8 @@ public class BrickSnail extends BucketableWaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public BrickSnail(EntityType type, Level world) { super(type, world); this.moveControl = new SnailMoveControl(this); @@ -53,6 +48,10 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.3D).add(Attributes.ARMOR, 4.0D); } + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + protected void registerGoals() { this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.6F)); @@ -90,10 +89,6 @@ protected SoundEvent getHurtSound(DamageSource p_28281_) { return SoundEvents.COD_HURT; } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -108,8 +103,6 @@ private PlayState predicate(AnimationState event) { return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CelestialFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CelestialFish.java index 701798a..f1a4b46 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CelestialFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CelestialFish.java @@ -34,6 +34,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class CelestialFish extends WaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); protected int attackCooldown = 0; public CelestialFish(EntityType entityType, Level level) { @@ -46,6 +47,16 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 40.0D).add(Attributes.ATTACK_DAMAGE, 2.0D).add(Attributes.MOVEMENT_SPEED, 0.5D); } + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); + } + + private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { + float time = iServerWorld.getTimeOfDay(1.0F); + int light = iServerWorld.getMaxLocalRawBrightness(pos); + return light <= 4 && time > 0.27F && time <= 0.8F; + } + @Override public void registerGoals() { super.registerGoals(); @@ -105,16 +116,6 @@ public void playerTouch(Player entity) { } } - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); - } - - private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { - float time = iServerWorld.getTimeOfDay(1.0F); - int light = iServerWorld.getMaxLocalRawBrightness(pos); - return light <= 4 && time > 0.27F && time <= 0.8F; - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -127,15 +128,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CircusFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CircusFish.java index 33fd013..4f47dc1 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CircusFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CircusFish.java @@ -35,85 +35,84 @@ public class CircusFish extends BucketableWaterAnimal implements GeoEntity { - public CircusFish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 8.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.CIRCUS_FISH_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public CircusFish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 8.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.CIRCUS_FISH_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/ClownthornShark.java b/src/main/java/codyhuh/unusualfishmod/common/entity/ClownthornShark.java index 607ca2b..5f656a5 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/ClownthornShark.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/ClownthornShark.java @@ -2,20 +2,12 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.goal.BottomStrollGoal; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -27,13 +19,11 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -45,94 +35,93 @@ public class ClownthornShark extends BucketableWaterAnimal implements GeoEntity { - public ClownthornShark(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.CLOWNTHORN_SHARK_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public ClownthornShark(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.CLOWNTHORN_SHARK_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java index 9281941..02c1833 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CopperflameAnthias.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -45,81 +45,86 @@ import javax.annotation.Nullable; public class CopperflameAnthias extends BucketableSchoolingWaterAnimal implements GeoEntity { - private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(CopperflameAnthias.class, EntityDataSerializers.INT); - private boolean isSchool = true; - - public CopperflameAnthias(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.COPPERFLAME_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 5; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 7; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(CopperflameAnthias.class, EntityDataSerializers.INT); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public CopperflameAnthias(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.COPPERFLAME_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 5; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 7; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { @@ -127,90 +132,83 @@ protected void defineSynchedData(SynchedEntityData.Builder builder) { builder.define(VARIANT, 0); } - @Override - public void addAdditionalSaveData(CompoundTag compound) { - super.addAdditionalSaveData(compound); - compound.putInt("Variant", getVariant()); - } - - @Override - public void readAdditionalSaveData(CompoundTag compound) { - super.readAdditionalSaveData(compound); - this.setVariant(compound.getInt("Variant")); - } - - @Override - public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - if (this.hasCustomName()) { - bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); - } - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putInt("Variant", this.getVariant()); - }); - } - - @Override - public void loadFromBucketTag(CompoundTag tag) { - super.loadFromBucketTag(tag); - if (tag.contains("Variant", 3)) { - this.setVariant(tag.getInt("Variant")); - } - } - - public int getVariant() { - return this.entityData.get(VARIANT); - } - - private void setVariant(int variant) { - this.entityData.set(VARIANT, variant); - } - - @Nullable - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { - spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - if (dataTag == null) { - setVariant(random.nextInt(2)); - } else { - if (dataTag.contains("Variant", 3)){ - this.setVariant(dataTag.getInt("Variant")); - } - } - return spawnDataIn; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("Variant", getVariant()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setVariant(compound.getInt("Variant")); + } + + @Override + public void saveToBucketTag(ItemStack bucket) { + Bucketable.saveDefaultDataToBucketTag(this, bucket); + if (this.hasCustomName()) { + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); + } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + }); + } + + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + + public int getVariant() { + return this.entityData.get(VARIANT); + } + + private void setVariant(int variant) { + this.entityData.set(VARIANT, variant); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + if (dataTag == null) { + setVariant(random.nextInt(2)); + } else { + if (dataTag.contains("Variant", 3)) { + this.setVariant(dataTag.getInt("Variant")); + } + } + return spawnDataIn; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java b/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java index 3aeab77..21b6fcd 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/CrimsonshellSquid.java @@ -1,8 +1,8 @@ package codyhuh.unusualfishmod.common.entity; +import codyhuh.unusualfishmod.common.entity.util.base.BreedableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.goal.BottomStrollGoal; import codyhuh.unusualfishmod.common.entity.util.goal.BreedableWaterAnimalBreedGoal; -import codyhuh.unusualfishmod.common.entity.util.base.BreedableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.goal.SquidLayEggsGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.common.entity.util.movement.SquidMoveControl; @@ -19,8 +19,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.tags.FluidTags; -import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.util.TimeUtil; import net.minecraft.util.valueproviders.UniformInt; @@ -33,7 +31,6 @@ import net.minecraft.world.entity.NeutralMob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.control.MoveControl; import net.minecraft.world.entity.ai.control.SmoothSwimmingLookControl; import net.minecraft.world.entity.ai.control.SmoothSwimmingMoveControl; import net.minecraft.world.entity.ai.goal.*; @@ -63,6 +60,7 @@ public class CrimsonshellSquid extends BreedableWaterAnimal implements Bucketable, NeutralMob, GeoEntity { private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(CrimsonshellSquid.class, EntityDataSerializers.BOOLEAN); private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(20, 39); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private int remainingPersistentAngerTime; private UUID persistentAngerTarget; @@ -77,6 +75,10 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.ATTACK_DAMAGE, 3.0D).add(Attributes.ARMOR, 2.0D); } + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + protected void registerGoals() { this.goalSelector.addGoal(0, new SquidLayEggsGoal(this, UFBlocks.CRIMSON_EGGS.get())); this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); @@ -124,18 +126,18 @@ public boolean hurt(DamageSource p_29963_, float p_29964_) { } private Vec3 rotateVector(Vec3 p_29986_) { - Vec3 vec3 = p_29986_.xRot(getXRot() * ((float)Math.PI / 180F)); - return vec3.yRot(-this.yBodyRotO * ((float)Math.PI / 180F)); + Vec3 vec3 = p_29986_.xRot(getXRot() * ((float) Math.PI / 180F)); + return vec3.yRot(-this.yBodyRotO * ((float) Math.PI / 180F)); } private void spawnInk() { this.playSound(SoundEvents.SQUID_SQUIRT, this.getSoundVolume(), this.getVoicePitch()); Vec3 vec3 = this.rotateVector(new Vec3(0.0D, -0.25D, -0.5D)).add(this.getX(), this.getY(), this.getZ()); - for(int i = 0; i < 30; ++i) { - Vec3 vec31 = this.rotateVector(new Vec3((double)this.random.nextFloat() * 0.6D - 0.3D, -1.0D, (double)this.random.nextFloat() * 0.6D - 0.3D)); - Vec3 vec32 = vec31.scale(0.3D + (double)(this.random.nextFloat() * 2.0F)); - ((ServerLevel)this.level()).sendParticles(ParticleTypes.SQUID_INK, vec3.x, vec3.y + 0.5D, vec3.z, 0, vec32.x, vec32.y, vec32.z, 0.1F); + for (int i = 0; i < 30; ++i) { + Vec3 vec31 = this.rotateVector(new Vec3((double) this.random.nextFloat() * 0.6D - 0.3D, -1.0D, (double) this.random.nextFloat() * 0.6D - 0.3D)); + Vec3 vec32 = vec31.scale(0.3D + (double) (this.random.nextFloat() * 2.0F)); + ((ServerLevel) this.level()).sendParticles(ParticleTypes.SQUID_INK, vec3.x, vec3.y + 0.5D, vec3.z, 0, vec32.x, vec32.y, vec32.z, 0.1F); } } @@ -233,18 +235,14 @@ public ItemStack getBucketItemStack() { return new ItemStack(UFItems.CRIMSONSHELL_SQUID_BUCKET.get()); } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + public int getRemainingPersistentAngerTime() { + return this.remainingPersistentAngerTime; } public void setRemainingPersistentAngerTime(int p_34448_) { this.remainingPersistentAngerTime = p_34448_; } - public int getRemainingPersistentAngerTime() { - return this.remainingPersistentAngerTime; - } - @Override public void startPersistentAngerTimer() { this.setRemainingPersistentAngerTime(PERSISTENT_ANGER_TIME.sample(this.random)); @@ -275,15 +273,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DeepCrawler.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DeepCrawler.java index a713c05..b9ce343 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DeepCrawler.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DeepCrawler.java @@ -36,109 +36,110 @@ public class DeepCrawler extends BucketableWaterAnimal implements GeoEntity { - public DeepCrawler(EntityType type, Level world) { - super(type, world); - this.moveControl = new DeepCrawler.MoveHelperController(this); - this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 8.0D).add(Attributes.MOVEMENT_SPEED, (double) 0.5F).add(Attributes.ARMOR, 10.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.8F)); - this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.8F)); - this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(4, new AvoidEntityGoal(this, Player.class, 8, 1.3D, 1.0D)); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new GroundPathNavigation(this, level()); - } - - @Override - public void handleAirSupply(int p_209207_1_) { - } - - protected SoundEvent getAmbientSound() { - return UFSounds.CRAB_CHATTER.get(); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { - this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.DEEP_CRAWLER_BUCKET.get()); - } - - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).is(Blocks.WATER) && iServerWorld.getBlockState(pos.above()).is(Blocks.WATER) && pos.getY() <= 20 && iServerWorld.getLightEmission(pos) < 8; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.WALK); - } else { - event.setAnimation(UFAnimations.IDLE); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } - - static class MoveHelperController extends MoveControl { - - private final Mob spider; - - MoveHelperController(Mob spider) { - super(spider); - this.spider = spider; - } - public void tick() { - if (this.spider.isEyeInFluid(FluidTags.WATER)) { - this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); - } - - if (this.operation == Operation.MOVE_TO && !this.spider.getNavigation().isDone()) { - double d0 = this.wantedX - this.spider.getX(); - double d1 = this.wantedY - this.spider.getY(); - double d2 = this.wantedZ - this.spider.getZ(); - double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); - d1 = d1 / d3; - float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); - this.spider.yBodyRot = this.spider.getYRot(); - float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); - this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); - this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); - } else { - this.spider.setSpeed(0.0F); - } - } - - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public DeepCrawler(EntityType type, Level world) { + super(type, world); + this.moveControl = new DeepCrawler.MoveHelperController(this); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 8.0D).add(Attributes.MOVEMENT_SPEED, 0.5F).add(Attributes.ARMOR, 10.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).is(Blocks.WATER) && iServerWorld.getBlockState(pos.above()).is(Blocks.WATER) && pos.getY() <= 20 && iServerWorld.getLightEmission(pos) < 8; + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.8F)); + this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.8F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(4, new AvoidEntityGoal(this, Player.class, 8, 1.3D, 1.0D)); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new GroundPathNavigation(this, level()); + } + + @Override + public void handleAirSupply(int p_209207_1_) { + } + + protected SoundEvent getAmbientSound() { + return UFSounds.CRAB_CHATTER.get(); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { + this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.DEEP_CRAWLER_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.WALK); + } else { + event.setAnimation(UFAnimations.IDLE); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } + + static class MoveHelperController extends MoveControl { + + private final Mob spider; + + MoveHelperController(Mob spider) { + super(spider); + this.spider = spider; + } + + public void tick() { + if (this.spider.isEyeInFluid(FluidTags.WATER)) { + this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); + } + + if (this.operation == Operation.MOVE_TO && !this.spider.getNavigation().isDone()) { + double d0 = this.wantedX - this.spider.getX(); + double d1 = this.wantedY - this.spider.getY(); + double d2 = this.wantedZ - this.spider.getZ(); + double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); + d1 = d1 / d3; + float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; + this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); + this.spider.yBodyRot = this.spider.getYRot(); + float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); + this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); + this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); + } else { + this.spider.setSpeed(0.0F); + } + } + + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java index 6e844c7..3b4ea56 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DemonHerring.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -45,81 +45,86 @@ import javax.annotation.Nullable; public class DemonHerring extends BucketableSchoolingWaterAnimal implements GeoEntity { - private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(DemonHerring.class, EntityDataSerializers.INT); - private boolean isSchool = true; - - public DemonHerring(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.DEMON_HERRING_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 1.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 10; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 20; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(DemonHerring.class, EntityDataSerializers.INT); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public DemonHerring(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 1.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.DEMON_HERRING_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 10; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 20; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { @@ -127,85 +132,78 @@ protected void defineSynchedData(SynchedEntityData.Builder builder) { builder.define(VARIANT, 0); } - public int getVariant() { - return this.entityData.get(VARIANT); - } - - private void setVariant(int variant) { - this.entityData.set(VARIANT, variant); - } - - public void addAdditionalSaveData(CompoundTag compound) { - super.addAdditionalSaveData(compound); - compound.putInt("Variant", getVariant()); - } - - public void readAdditionalSaveData(CompoundTag compound) { - super.readAdditionalSaveData(compound); - this.setVariant(compound.getInt("Variant")); - } - - @Override - public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - if (this.hasCustomName()) { - bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); - } - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putInt("Variant", this.getVariant()); - tag.putFloat("Health", this.getHealth()); - }); - } - - @Override - public void loadFromBucketTag(CompoundTag tag) { - super.loadFromBucketTag(tag); - if (tag.contains("Variant", 3)) { - this.setVariant(tag.getInt("Variant")); - } - } - - @Nullable - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { - spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - if (dataTag == null) { - setVariant(random.nextInt(3)); - } else { - if (dataTag.contains("Variant", 3)){ - this.setVariant(dataTag.getInt("Variant")); - } - } - return spawnDataIn; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + public int getVariant() { + return this.entityData.get(VARIANT); + } + + private void setVariant(int variant) { + this.entityData.set(VARIANT, variant); + } + + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("Variant", getVariant()); + } + + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setVariant(compound.getInt("Variant")); + } + + @Override + public void saveToBucketTag(ItemStack bucket) { + Bucketable.saveDefaultDataToBucketTag(this, bucket); + if (this.hasCustomName()) { + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); + } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + tag.putFloat("Health", this.getHealth()); + }); + } + + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + if (dataTag == null) { + setVariant(random.nextInt(3)); + } else { + if (dataTag.contains("Variant", 3)) { + this.setVariant(dataTag.getInt("Variant")); + } + } + return spawnDataIn; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DroopingGourami.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DroopingGourami.java index 541c644..4253c21 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DroopingGourami.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DroopingGourami.java @@ -33,97 +33,96 @@ public class DroopingGourami extends BucketableSchoolingWaterAnimal implements GeoEntity { - public DroopingGourami(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.DROOPING_GOURAMI_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public DroopingGourami(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.DROOPING_GOURAMI_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java index 2575a7c..4bbf740 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/DualityDamselfish.java @@ -46,172 +46,170 @@ import javax.annotation.Nullable; public class DualityDamselfish extends BucketableSchoolingWaterAnimal implements GeoEntity, IVariant { - private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(DualityDamselfish.class, EntityDataSerializers.INT); - private boolean isSchool = true; - - public DualityDamselfish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.DUALITY_DAMSELFISH_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 1; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 2; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putInt("Variant", this.getVariant()); - }); - } - - @Override - public void loadFromBucketTag(CompoundTag tag) { - super.loadFromBucketTag(tag); - if (tag.contains("Variant", 3)) { - this.setVariant(tag.getInt("Variant")); - } - } - + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(DualityDamselfish.class, EntityDataSerializers.INT); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public DualityDamselfish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.DUALITY_DAMSELFISH_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 1; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 2; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void saveToBucketTag(ItemStack bucket) { + Bucketable.saveDefaultDataToBucketTag(this, bucket); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + }); + } + + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); builder.define(VARIANT, 0); } - @Override - public boolean hasVariant() { - return true; - } - - @Override - public int getVariantN() { - return getVariant(); - } - - public int getVariant() { - return this.entityData.get(VARIANT); - } - - private void setVariant(int variant) { - this.entityData.set(VARIANT, variant); - } - - @Override - public void addAdditionalSaveData(CompoundTag compound) { - super.addAdditionalSaveData(compound); - compound.putInt("Variant", getVariant()); - } - - @Override - public void readAdditionalSaveData(CompoundTag compound) { - super.readAdditionalSaveData(compound); - setVariant(compound.getInt("Variant")); - } - - @Nullable - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { - spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - if (dataTag == null) { - setVariant(random.nextInt(2)); - } else { - if (dataTag.contains("Variant", 3)){ - this.setVariant(dataTag.getInt("Variant")); - } - } - return spawnDataIn; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } - else { - event.setAnimation(UFAnimations.IDLE); - } - - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + @Override + public boolean hasVariant() { + return true; + } + + @Override + public int getVariantN() { + return getVariant(); + } + + public int getVariant() { + return this.entityData.get(VARIANT); + } + + private void setVariant(int variant) { + this.entityData.set(VARIANT, variant); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("Variant", getVariant()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + setVariant(compound.getInt("Variant")); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + if (dataTag == null) { + setVariant(random.nextInt(2)); + } else { + if (dataTag.contains("Variant", 3)) { + this.setVariant(dataTag.getInt("Variant")); + } + } + return spawnDataIn; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java index 4256aca..71896cc 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/EyelashFish.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -19,7 +19,6 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.SpawnGroupData; -import net.minecraft.world.entity.ai.Brain; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.SmoothSwimmingLookControl; @@ -27,12 +26,10 @@ import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; import net.minecraft.world.entity.ai.goal.RandomSwimmingGoal; -import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; -import net.minecraft.world.entity.animal.axolotl.Axolotl; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.CustomData; @@ -51,194 +48,191 @@ import javax.annotation.Nullable; public class EyelashFish extends BucketableSchoolingWaterAnimal implements GeoEntity { - private static final EntityDataAccessor ESCAPING = SynchedEntityData.defineId(EyelashFish.class, EntityDataSerializers.BOOLEAN); - private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EyelashFish.class, EntityDataSerializers.INT); - private boolean isSchool = true; - private static Path path; - - public EyelashFish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.05F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.EYELASH_FISH_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 1.0D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - @Override - public boolean hurt(DamageSource p_21016_, float p_21017_) { - if (!isEscaping() && isInWater()) { - setEscaping(true); - path = getNavigation().createPath(blockPosition().relative(getDirection(), 10), 1); - } - return super.hurt(p_21016_, p_21017_); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - if (isEscaping()) { - if (getNavigation().moveTo(path, 1.0D)) { - setSpeed(5.0F); - - if (path.isDone()) { - setEscaping(false); - setSpeed(1.0F); - } - } - } - - super.aiStep(); - } - - public int getMaxSpawnClusterSize() { - return 8; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 10; - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - if (this.hasCustomName()) { - bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); - } - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putInt("Variant", this.getVariant()); - tag.putFloat("Health", this.getHealth()); - }); - } - - @Override - public void loadFromBucketTag(CompoundTag tag) { - super.loadFromBucketTag(tag); - if (tag.contains("Variant", 3)) { - this.setVariant(tag.getInt("Variant")); - } - } - - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); - builder.define(VARIANT, 0); - builder.define(ESCAPING, false); - } - - public int getVariant() { - return this.entityData.get(VARIANT); - } - - private void setVariant(int variant) { - this.entityData.set(VARIANT, variant); - } - - @Override - public void addAdditionalSaveData(CompoundTag compound) { - super.addAdditionalSaveData(compound); - compound.putInt("Variant", getVariant()); - } - - @Override - public void readAdditionalSaveData(CompoundTag compound) { - super.readAdditionalSaveData(compound); - setVariant(compound.getInt("Variant")); - } - - @Nullable - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { - spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - if (dataTag == null) { - setVariant(random.nextInt(15)); - } - else { - if (dataTag.contains("Variant", 3)){ - this.setVariant(dataTag.getInt("Variant")); - } - } - return spawnDataIn; - } - - private boolean isEscaping() { - return this.entityData.get(ESCAPING); - } - - public void setEscaping(boolean escaping) { - this.entityData.set(ESCAPING, escaping); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private static final EntityDataAccessor ESCAPING = SynchedEntityData.defineId(EyelashFish.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EyelashFish.class, EntityDataSerializers.INT); + private static Path path; + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public EyelashFish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.05F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.EYELASH_FISH_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 1.0D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + @Override + public boolean hurt(DamageSource p_21016_, float p_21017_) { + if (!isEscaping() && isInWater()) { + setEscaping(true); + path = getNavigation().createPath(blockPosition().relative(getDirection(), 10), 1); + } + return super.hurt(p_21016_, p_21017_); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + if (isEscaping()) { + if (getNavigation().moveTo(path, 1.0D)) { + setSpeed(5.0F); + + if (path.isDone()) { + setEscaping(false); + setSpeed(1.0F); + } + } + } + + super.aiStep(); + } + + public int getMaxSpawnClusterSize() { + return 8; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 10; + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void saveToBucketTag(ItemStack bucket) { + Bucketable.saveDefaultDataToBucketTag(this, bucket); + if (this.hasCustomName()) { + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); + } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + tag.putFloat("Health", this.getHealth()); + }); + } + + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, 0); + builder.define(ESCAPING, false); + } + + public int getVariant() { + return this.entityData.get(VARIANT); + } + + private void setVariant(int variant) { + this.entityData.set(VARIANT, variant); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("Variant", getVariant()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + setVariant(compound.getInt("Variant")); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + if (dataTag == null) { + setVariant(random.nextInt(15)); + } else { + if (dataTag.contains("Variant", 3)) { + this.setVariant(dataTag.getInt("Variant")); + } + } + return spawnDataIn; + } + + private boolean isEscaping() { + return this.entityData.get(ESCAPING); + } + + public void setEscaping(boolean escaping) { + this.entityData.set(ESCAPING, escaping); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Forkfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Forkfish.java index 3d4ad12..0acc011 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Forkfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Forkfish.java @@ -4,18 +4,10 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; -import codyhuh.unusualfishmod.core.registry.UFSounds; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -27,13 +19,11 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -44,97 +34,96 @@ public class Forkfish extends BucketableWaterAnimal implements GeoEntity { - public Forkfish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.FORKFISH_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public Forkfish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.FORKFISH_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java b/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java index 94a0522..438d5f6 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/FreshwaterMantis.java @@ -12,7 +12,10 @@ import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.*; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.MoveControl; @@ -37,140 +40,141 @@ public class FreshwaterMantis extends BucketableWaterAnimal implements GeoEntity { - public FreshwaterMantis(EntityType type, Level world) { - super(type, world); - this.moveControl = new FreshwaterMantis.MoveHelperController(this); - this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.1F); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.25D).add(Attributes.ATTACK_DAMAGE, 1.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.5D, false)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.8D)); - this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 1.0F)); - this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, e -> e.getType().is(UFTags.SNAILS))); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AeroMono.class, true)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, SneepSnorp.class, true)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, RhinoTetra.class, true)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, SailorBarb.class, true)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Silverfish.class, true)); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new GroundPathNavigation(this, level()); - } - - protected SoundEvent getAmbientSound() { - return UFSounds.CRAB_CHATTER.get(); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { - this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); - } - - @Override - public float getWaterSlowDown() { - return 0.9f; - } - - public void baseTick() { - int i = this.getAirSupply(); - super.baseTick(); - if (!this.isNoAi()) { - this.handleAirSupply(i); - } - } - - protected void handleAirSupply(int p_149194_) { - if (this.isAlive() && !this.isInWaterRainOrBubble()) { - this.setAirSupply(p_149194_ - 1); - if (this.getAirSupply() == -20) { - this.setAirSupply(0); - this.hurt(damageSources().dryOut(), 1.0F); - } - } else { - this.setAirSupply(this.getMaxAirSupply()); - } - } - - public int getMaxAirSupply() { - return 6000; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.FRESHWATER_MANTIS_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.WALK); - } else { - event.setAnimation(UFAnimations.IDLE); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } - - static class MoveHelperController extends MoveControl { - - private final Mob mantis; - - MoveHelperController(Mob mantis) { - super(mantis); - this.mantis = mantis; - } - public void tick() { - if (this.mantis.isEyeInFluid(FluidTags.WATER)) { - this.mantis.setDeltaMovement(this.mantis.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); - } - - if (this.operation == Operation.MOVE_TO && !this.mantis.getNavigation().isDone()) { - double d0 = this.wantedX - this.mantis.getX(); - double d1 = this.wantedY - this.mantis.getY(); - double d2 = this.wantedZ - this.mantis.getZ(); - double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); - d1 = d1 / d3; - float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.mantis.setYRot(this.rotlerp(this.mantis.getYRot(), f, 90.0F)); - this.mantis.yBodyRot = this.mantis.getYRot(); - float f1 = (float) (this.speedModifier * this.mantis.getAttributeValue(Attributes.MOVEMENT_SPEED)); - this.mantis.setSpeed(Mth.lerp(0.125F, this.mantis.getSpeed(), f1)); - this.mantis.setDeltaMovement(this.mantis.getDeltaMovement().add(0.0D, (double) this.mantis.getSpeed() * d1 * 0.1D, 0.0D)); - } else { - this.mantis.setSpeed(0.0F); - } - } - - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public FreshwaterMantis(EntityType type, Level world) { + super(type, world); + this.moveControl = new FreshwaterMantis.MoveHelperController(this); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.1F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.25D).add(Attributes.ATTACK_DAMAGE, 1.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.5D, false)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.8D)); + this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 1.0F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, e -> e.getType().is(UFTags.SNAILS))); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AeroMono.class, true)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, SneepSnorp.class, true)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, RhinoTetra.class, true)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, SailorBarb.class, true)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Silverfish.class, true)); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new GroundPathNavigation(this, level()); + } + + protected SoundEvent getAmbientSound() { + return UFSounds.CRAB_CHATTER.get(); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { + this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); + } + + @Override + public float getWaterSlowDown() { + return 0.9f; + } + + public void baseTick() { + int i = this.getAirSupply(); + super.baseTick(); + if (!this.isNoAi()) { + this.handleAirSupply(i); + } + } + + protected void handleAirSupply(int p_149194_) { + if (this.isAlive() && !this.isInWaterRainOrBubble()) { + this.setAirSupply(p_149194_ - 1); + if (this.getAirSupply() == -20) { + this.setAirSupply(0); + this.hurt(damageSources().dryOut(), 1.0F); + } + } else { + this.setAirSupply(this.getMaxAirSupply()); + } + } + + public int getMaxAirSupply() { + return 6000; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.FRESHWATER_MANTIS_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.WALK); + } else { + event.setAnimation(UFAnimations.IDLE); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } + + static class MoveHelperController extends MoveControl { + + private final Mob mantis; + + MoveHelperController(Mob mantis) { + super(mantis); + this.mantis = mantis; + } + + public void tick() { + if (this.mantis.isEyeInFluid(FluidTags.WATER)) { + this.mantis.setDeltaMovement(this.mantis.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); + } + + if (this.operation == Operation.MOVE_TO && !this.mantis.getNavigation().isDone()) { + double d0 = this.wantedX - this.mantis.getX(); + double d1 = this.wantedY - this.mantis.getY(); + double d2 = this.wantedZ - this.mantis.getZ(); + double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); + d1 = d1 / d3; + float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; + this.mantis.setYRot(this.rotlerp(this.mantis.getYRot(), f, 90.0F)); + this.mantis.yBodyRot = this.mantis.getYRot(); + float f1 = (float) (this.speedModifier * this.mantis.getAttributeValue(Attributes.MOVEMENT_SPEED)); + this.mantis.setSpeed(Mth.lerp(0.125F, this.mantis.getSpeed(), f1)); + this.mantis.setDeltaMovement(this.mantis.getDeltaMovement().add(0.0D, (double) this.mantis.getSpeed() * d1 * 0.1D, 0.0D)); + } else { + this.mantis.setSpeed(0.0F); + } + } + + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/FrostyFinFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/FrostyFinFish.java index fa8f19e..846c71d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/FrostyFinFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/FrostyFinFish.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -33,107 +33,105 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class FrostyFinFish extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public FrostyFinFish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.FROSTY_FIN_FISH_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - super.aiStep(); - } - - public int getMaxSpawnClusterSize() { - return 8; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 10; - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public FrostyFinFish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.FROSTY_FIN_FISH_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + super.aiStep(); + } + + public int getMaxSpawnClusterSize() { + return 8; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 10; + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Gnasher.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Gnasher.java index c8e1b80..0a73062 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Gnasher.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Gnasher.java @@ -38,160 +38,157 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Gnasher extends WaterAnimal implements RangedAttackMob, GeoEntity { - protected int attackCooldown = 0; - private int attackAnimationTick; - - public Gnasher(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 45, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 60.0D).add(Attributes.MOVEMENT_SPEED, (double) 1.0D) - .add(Attributes.ATTACK_DAMAGE, 8.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(1, new RangedAttackGoal(this, 0.5D, 20, 10.0F)); - this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.6F)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 1.0D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 1.0D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Animal.class, true)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Villager.class, true)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Squid.class, true)); - } - - @Override - public void performRangedAttack(LivingEntity target, float distanceFactor) { - this.lookAt(target, 100, 100); - this.yBodyRot = yBodyRotO; - AbyssalBlast glass = new AbyssalBlast(this.level(), this); - double xDistance = target.getX() - this.getX(); - double yDistance = target.getY(0.3333333333333333D) - glass.getY(); - double zDistance = target.getZ() - this.getZ(); - double yMath = Mth.sqrt((float) ((xDistance * xDistance) + (zDistance * zDistance))); - glass.shoot(xDistance, yDistance + yMath * 0.10000000298023224D, zDistance, 1.6F, 11.0F); - this.level().addFreshEntity(glass); - } - - @Override - public boolean doHurtTarget(Entity entityIn) { - this.attackAnimationTick = 10; - this.level().broadcastEntityEvent(this, (byte)4); - float f = this.getAttackDamage(); - float f1 = (int)f > 0 ? f / 2.0F + (float)this.random.nextInt((int)f) : f; - boolean flag = this.level() instanceof ServerLevel && entityIn.hurt(damageSources().mobAttack(this), f1); - if (flag) { - entityIn.setDeltaMovement(entityIn.getDeltaMovement().add(0.0D, (double)0.4F, 0.0D)); - EnchantmentHelper.doPostAttackEffects((ServerLevel) this.level(), entityIn, this.damageSources().mobAttack(this)); - } - return flag; - } - - public void tick() { - super.tick(); - - if (this.attackCooldown > 0) { - this.attackCooldown--; - } - } - - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - if (this.attackAnimationTick > 0) { - --this.attackAnimationTick; - } - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - private float getAttackDamage() { - return (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE); - } - - public void handleEntityEvent(byte p_28844_) { - if (p_28844_ == 4) { - this.attackAnimationTick = 10; - } - super.handleEntityEvent(p_28844_); - } - - public int getAttackAnimationTick() { - return this.attackAnimationTick; - } - - protected SoundEvent getAmbientSound() { - return UFSounds.GNASHER_IDLE.get(); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); - } - - private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { - float time = iServerWorld.getTimeOfDay(1.0F); - int light = iServerWorld.getMaxLocalRawBrightness(pos); - return light <= 4 && time > 0.27F && time <= 0.8F; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + protected int attackCooldown = 0; + private int attackAnimationTick; + + public Gnasher(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 45, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 60.0D).add(Attributes.MOVEMENT_SPEED, 1.0D) + .add(Attributes.ATTACK_DAMAGE, 8.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); + } + + private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { + float time = iServerWorld.getTimeOfDay(1.0F); + int light = iServerWorld.getMaxLocalRawBrightness(pos); + return light <= 4 && time > 0.27F && time <= 0.8F; + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(1, new RangedAttackGoal(this, 0.5D, 20, 10.0F)); + this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.6F)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 1.0D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 1.0D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Animal.class, true)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Villager.class, true)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Squid.class, true)); + } + + @Override + public void performRangedAttack(LivingEntity target, float distanceFactor) { + this.lookAt(target, 100, 100); + this.yBodyRot = yBodyRotO; + AbyssalBlast glass = new AbyssalBlast(this.level(), this); + double xDistance = target.getX() - this.getX(); + double yDistance = target.getY(0.3333333333333333D) - glass.getY(); + double zDistance = target.getZ() - this.getZ(); + double yMath = Mth.sqrt((float) ((xDistance * xDistance) + (zDistance * zDistance))); + glass.shoot(xDistance, yDistance + yMath * 0.10000000298023224D, zDistance, 1.6F, 11.0F); + this.level().addFreshEntity(glass); + } + + @Override + public boolean doHurtTarget(Entity entityIn) { + this.attackAnimationTick = 10; + this.level().broadcastEntityEvent(this, (byte) 4); + float f = this.getAttackDamage(); + float f1 = (int) f > 0 ? f / 2.0F + (float) this.random.nextInt((int) f) : f; + boolean flag = this.level() instanceof ServerLevel && entityIn.hurt(damageSources().mobAttack(this), f1); + if (flag) { + entityIn.setDeltaMovement(entityIn.getDeltaMovement().add(0.0D, 0.4F, 0.0D)); + EnchantmentHelper.doPostAttackEffects((ServerLevel) this.level(), entityIn, this.damageSources().mobAttack(this)); + } + return flag; + } + + public void tick() { + super.tick(); + + if (this.attackCooldown > 0) { + this.attackCooldown--; + } + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + if (this.attackAnimationTick > 0) { + --this.attackAnimationTick; + } + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + private float getAttackDamage() { + return (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); + } + + public void handleEntityEvent(byte p_28844_) { + if (p_28844_ == 4) { + this.attackAnimationTick = 10; + } + super.handleEntityEvent(p_28844_); + } + + public int getAttackAnimationTick() { + return this.attackAnimationTick; + } + + protected SoundEvent getAmbientSound() { + return UFSounds.GNASHER_IDLE.get(); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/HatchetFish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/HatchetFish.java index 8096019..0a2bee3 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/HatchetFish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/HatchetFish.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -33,116 +33,114 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class HatchetFish extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public HatchetFish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.HATCHET_FISH_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 5; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 10; - } - - protected SoundEvent getAmbientSound() { - return SoundEvents.COD_AMBIENT; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getLightEmission(pos) < 8 && iServerWorld.getBlockState(pos.above()).is(Blocks.WATER) && iServerWorld.getBlockState(pos).is(Blocks.WATER) && pos.getY() <= 0; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public HatchetFish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getLightEmission(pos) < 8 && iServerWorld.getBlockState(pos.above()).is(Blocks.WATER) && iServerWorld.getBlockState(pos).is(Blocks.WATER) && pos.getY() <= 0; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.HATCHET_FISH_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 5; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 10; + } + + protected SoundEvent getAmbientSound() { + return SoundEvents.COD_AMBIENT; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Kalappa.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Kalappa.java index 494b81f..0d7616d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Kalappa.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Kalappa.java @@ -29,6 +29,8 @@ public class Kalappa extends PathfinderMob implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public Kalappa(EntityType entityType, Level level) { super(entityType, level); } @@ -37,6 +39,10 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 40.0D).add(Attributes.MOVEMENT_SPEED, 0.25D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.ARMOR, 15.0D); } + public static boolean canSpawn(EntityType type, LevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource randomIn) { + return worldIn.getBlockState(pos.below()).canOcclude(); + } + protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.65D)); @@ -45,7 +51,7 @@ protected void registerGoals() { this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 0.65D, true) { @Override protected void checkAndPerformAttack(LivingEntity target) { - if (this.mob.isWithinMeleeAttackRange(target) && this.isTimeToAttack()) { + if (this.mob.isWithinMeleeAttackRange(target) && this.isTimeToAttack()) { this.mob.doHurtTarget(target); } } @@ -73,10 +79,6 @@ protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); } - public static boolean canSpawn(EntityType type, LevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource randomIn) { - return worldIn.getBlockState(pos.below()).canOcclude(); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -91,8 +93,6 @@ private PlayState predicate(AnimationState event) { return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/LobedSkipper.java b/src/main/java/codyhuh/unusualfishmod/common/entity/LobedSkipper.java index e389550..9c70187 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/LobedSkipper.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/LobedSkipper.java @@ -2,13 +2,9 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; -import codyhuh.unusualfishmod.core.registry.UFSounds; import net.minecraft.core.BlockPos; import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; -import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -19,7 +15,10 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.*; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.JumpControl; @@ -47,6 +46,11 @@ public class LobedSkipper extends PathfinderMob implements Bucketable, GeoEntity { private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(LobedSkipper.class, EntityDataSerializers.BOOLEAN); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private int jumpTicks; + private int jumpDuration; + private boolean wasOnGround; + private int currentMoveTypeDuration; public LobedSkipper(EntityType entityType, Level level) { super(entityType, level); @@ -57,7 +61,11 @@ public LobedSkipper(EntityType entityType, Level level) } public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D).add(Attributes.MOVEMENT_SPEED, (double) 0.5D); + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D).add(Attributes.MOVEMENT_SPEED, 0.5D); + } + + public static boolean canSpawn(EntityType type, LevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource randomIn) { + return worldIn.getBlockState(pos.below()).canOcclude(); } protected void registerGoals() { @@ -105,14 +113,9 @@ else if (this.jumpDuration != 0) { @Override protected float getJumpPower() { float motion = super.getJumpPower(); - return motion; + return motion; } - private int jumpTicks; - private int jumpDuration; - private boolean wasOnGround; - private int currentMoveTypeDuration; - @Override public void customServerAiStep() { if (this.currentMoveTypeDuration > 0) --this.currentMoveTypeDuration; @@ -217,34 +220,6 @@ public void handleEntityEvent(byte id) { } } - public class SkipperJumpController extends JumpControl { - private boolean canJump; - - public SkipperJumpController() { - super(LobedSkipper.this); - } - - public boolean getIsJumping() { - return this.jump; - } - - public boolean canJump() { - return this.canJump; - } - - public void setCanJump(boolean canJumpIn) { - this.canJump = canJumpIn; - } - - @Override - public void tick() { - if (this.jump) { - startJumping(); - this.jump = false; - } - } - } - @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); @@ -272,10 +247,10 @@ public void setFromBucket(boolean p_203706_1_) { @Override public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putFloat("Health", this.getHealth()); - }); + Bucketable.saveDefaultDataToBucketTag(this, bucket); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); } public boolean requiresCustomPersistence() { @@ -304,10 +279,6 @@ public ItemStack getBucketItemStack() { return new ItemStack(UFItems.SKIPPER_BUCKET.get()); } - public static boolean canSpawn(EntityType type, LevelAccessor worldIn, MobSpawnType reason, BlockPos pos, RandomSource randomIn) { - return worldIn.getBlockState(pos.below()).canOcclude(); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -316,20 +287,45 @@ public void registerControllers(AnimatableManager.ControllerRegistrar controller private PlayState predicate(AnimationState event) { if (event.isMoving()) { event.setAnimation(UFAnimations.SWIM); - } - else { + } else { event.setAnimation(UFAnimations.IDLE); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; } + public class SkipperJumpController extends JumpControl { + private boolean canJump; + + public SkipperJumpController() { + super(LobedSkipper.this); + } + + public boolean getIsJumping() { + return this.jump; + } + + public boolean canJump() { + return this.canJump; + } + + public void setCanJump(boolean canJumpIn) { + this.canJump = canJumpIn; + } + + @Override + public void tick() { + if (this.jump) { + startJumping(); + this.jump = false; + } + } + } + public class SkipperMoveController extends MoveControl { private double nextJumpSpeed; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/ManaJellyfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/ManaJellyfish.java index e20170e..a256c0e 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/ManaJellyfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/ManaJellyfish.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -18,13 +18,15 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.SmoothSwimmingLookControl; import net.minecraft.world.entity.ai.control.SmoothSwimmingMoveControl; -import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.RandomSwimmingGoal; +import net.minecraft.world.entity.ai.goal.TryFindWaterGoal; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.material.Fluids; import software.bernie.geckolib.animatable.GeoEntity; @@ -36,8 +38,9 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class ManaJellyfish extends BucketableSchoolingWaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); protected int attackCooldown = 0; - private boolean isSchool = true; + private final boolean isSchool = true; public ManaJellyfish(EntityType entityType, Level level) { super(entityType, level); @@ -45,15 +48,25 @@ public ManaJellyfish(EntityType entity this.lookControl = new SmoothSwimmingLookControl(this, 10); } + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.ATTACK_DAMAGE, 2.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); + } + + private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { + float time = iServerWorld.getTimeOfDay(1.0F); + int light = iServerWorld.getMaxLocalRawBrightness(pos); + return light <= 4 && time > 0.27F && time <= 0.8F; + } + @Override public ItemStack getBucketStack() { return new ItemStack(UFItems.WIZARD_JELLY_BUCKET.get()); } - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.ATTACK_DAMAGE, 2.0D); - } - protected void registerGoals() { this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); @@ -97,16 +110,6 @@ public void playerTouch(Player entity) { } } - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); - } - - private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { - float time = iServerWorld.getTimeOfDay(1.0F); - int light = iServerWorld.getMaxLocalRawBrightness(pos); - return light <= 4 && time > 0.27F && time <= 0.8F; - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 20, this::predicate)); @@ -119,15 +122,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Mossthorn.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Mossthorn.java index f80dab0..4a23a57 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Mossthorn.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Mossthorn.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -33,108 +33,106 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Mossthorn extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public Mossthorn(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.MOSSTHORN_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 5; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 7; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).is(Blocks.WATER) && pos.getY() <= 40; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public Mossthorn(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).is(Blocks.WATER) && pos.getY() <= 40; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.MOSSTHORN_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 5; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 7; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/MuddytopSnail.java b/src/main/java/codyhuh/unusualfishmod/common/entity/MuddytopSnail.java index ce872e3..fe99ee6 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/MuddytopSnail.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/MuddytopSnail.java @@ -37,6 +37,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class MuddytopSnail extends BucketableWaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); protected int attackCooldown = 0; public MuddytopSnail(EntityType type, Level world) { @@ -45,15 +46,19 @@ public MuddytopSnail(EntityType type, Level world) { this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); } + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.3D).add(Attributes.ARMOR, 8.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + @Override public ItemStack getBucketStack() { return new ItemStack(UFItems.MUDDYTOP_SNAIL_BUCKET.get()); } - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.3D).add(Attributes.ARMOR, 8.0D); - } - protected void registerGoals() { this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.6F)); this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.3F)); @@ -96,10 +101,6 @@ protected SoundEvent getHurtSound(DamageSource p_28281_) { return SoundEvents.COD_HURT; } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -114,8 +115,6 @@ private PlayState predicate(AnimationState event) { return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Picklefish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Picklefish.java index dc58e2c..1660ac9 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Picklefish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Picklefish.java @@ -2,19 +2,12 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.goal.BottomStrollGoal; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -26,7 +19,6 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -42,97 +34,96 @@ public class Picklefish extends BucketableWaterAnimal implements GeoEntity { - public Picklefish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.PICKLEFISH_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public Picklefish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.PICKLEFISH_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/PinkfinIdol.java b/src/main/java/codyhuh/unusualfishmod/common/entity/PinkfinIdol.java index 257569d..5753497 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/PinkfinIdol.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/PinkfinIdol.java @@ -3,7 +3,6 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; -import codyhuh.unusualfishmod.core.registry.UFSounds; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; @@ -38,109 +37,107 @@ public class PinkfinIdol extends BucketableWaterAnimal implements GeoEntity { - public PinkfinIdol(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.PINKFIN_IDOL_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10).add(Attributes.ATTACK_DAMAGE, 2); - } - - @Override - public void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, TropicalFish.class, false)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void tick() { - super.tick(); - - if (this.level().isClientSide && this.isInWater() && this.getDeltaMovement().lengthSqr() > 0.03D) { - Vec3 vec3 = this.getViewVector(0.0F); - float f = Mth.cos(this.getYRot() * ((float)Math.PI / 180F)) * 0.3F; - float f1 = Mth.sin(this.getYRot() * ((float)Math.PI / 180F)) * 0.3F; - } - - } - - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - public SoundEvent getHurtSound(DamageSource damageSourceIn) { - return SoundEvents.COD_HURT; - } - - public SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public PinkfinIdol(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10).add(Attributes.ATTACK_DAMAGE, 2); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.PINKFIN_IDOL_BUCKET.get()); + } + + @Override + public void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, TropicalFish.class, false)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void tick() { + super.tick(); + + if (this.level().isClientSide && this.isInWater() && this.getDeltaMovement().lengthSqr() > 0.03D) { + Vec3 vec3 = this.getViewVector(0.0F); + float f = Mth.cos(this.getYRot() * ((float) Math.PI / 180F)) * 0.3F; + float f1 = Mth.sin(this.getYRot() * ((float) Math.PI / 180F)) * 0.3F; + } + + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + public SoundEvent getHurtSound(DamageSource damageSourceIn) { + return SoundEvents.COD_HURT; + } + + public SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/PorcupineLobster.java b/src/main/java/codyhuh/unusualfishmod/common/entity/PorcupineLobster.java index 6c3780b..d6acf9f 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/PorcupineLobster.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/PorcupineLobster.java @@ -6,18 +6,12 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFSounds; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.FluidTags; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -32,7 +26,6 @@ import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -48,6 +41,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class PorcupineLobster extends BucketableWaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); protected int attackCooldown = 0; public PorcupineLobster(EntityType type, Level world) { @@ -57,7 +51,11 @@ public PorcupineLobster(EntityType type, Level world } public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, (double) 0.5F).add(Attributes.ARMOR, (double) 7.0F).add(Attributes.ATTACK_DAMAGE, (double) 3.0F); + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.5F).add(Attributes.ARMOR, 7.0F).add(Attributes.ATTACK_DAMAGE, 3.0F); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); } protected void registerGoals() { @@ -119,10 +117,6 @@ public ItemStack getBucketStack() { return new ItemStack(UFItems.PORCUPINE_LOBSTA_BUCKET.get()); } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -137,8 +131,6 @@ private PlayState predicate(AnimationState event) { return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; @@ -173,5 +165,5 @@ public void tick() { this.lobsta.setSpeed(0.0F); } } -} + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Prawn.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Prawn.java index 0c9ee89..c7ae6b6 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Prawn.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Prawn.java @@ -33,6 +33,8 @@ public class Prawn extends Monster implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public Prawn(EntityType entityType, Level level) { super(entityType, level); } @@ -41,6 +43,10 @@ public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 16.0D).add(Attributes.MOVEMENT_SPEED, 0.6F).add(Attributes.ATTACK_DAMAGE, 5.0D); } + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || !iServerWorld.canSeeSky(pos) && pos.getY() <= 20 && checkMonsterSpawnRules(entityType, iServerWorld, reason, pos, random); + } + protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.6F)); @@ -85,10 +91,6 @@ protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); } - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || !iServerWorld.canSeeSky(pos) && pos.getY() <= 20 && checkMonsterSpawnRules(entityType, iServerWorld, reason, pos, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -107,8 +109,6 @@ private PlayState predicate(AnimationState event) { return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java b/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java index 253db44..a40e7d2 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -17,7 +17,6 @@ import net.minecraft.util.RandomSource; import net.minecraft.util.TimeUtil; import net.minecraft.util.valueproviders.UniformInt; -import net.minecraft.world.DifficultyInstance; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; @@ -38,7 +37,6 @@ import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; @@ -52,246 +50,244 @@ import java.util.UUID; public class RhinoTetra extends BucketableSchoolingWaterAnimal implements GeoEntity, NeutralMob { - private static final EntityDataAccessor REMAINING_ANGER_TIME = SynchedEntityData.defineId(RhinoTetra.class, EntityDataSerializers.INT); - private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(15, 29); - @Nullable - private UUID persistentAngerTarget; - public int stunnedTick; - private boolean isSchool = true; - - public RhinoTetra(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.2F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.RHINO_TETRA_BUCKET.get()); - } - - protected InteractionResult mobInteract(Player p_27477_, InteractionHand p_27478_) { - return InteractionResult.PASS; - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.ATTACK_DAMAGE, 2.0D).add(Attributes.ATTACK_KNOCKBACK, 3.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.0D, true)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 5.0D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.targetSelector.addGoal(1, new ResetUniversalAngerTargetGoal<>(this, false)); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, this::isAngryAt)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - - if (isAlive()) { - if (this.stunnedTick > 0) { - --this.stunnedTick; - this.stunEffect(); - if (this.stunnedTick == 0) { - this.playSound(SoundEvents.BUBBLE_COLUMN_BUBBLE_POP, 1.0F, 0.7F); - } - } - } - } - - @Override - public boolean hurt(DamageSource source, float amount) { - if (super.hurt(source, amount) && source.getEntity() instanceof LivingEntity living) { - setAggressive(true); - setTarget(living); - } - - return super.hurt(source, amount); - } - - protected void blockedByShield(LivingEntity p_33361_) { - if (this.random.nextFloat() > 0.25F) { - this.stunnedTick = 80; - this.playSound(SoundEvents.COD_HURT, 1.0F, 0.5F); - this.level().broadcastEntityEvent(this, (byte)39); - p_33361_.push(this); - setAggressive(false); - setTarget(null); - } - - p_33361_.hurtMarked = true; - } - - private void stunEffect() { - Vec3 pos = getYawVec(yBodyRot, 0.0D, 0.0D, 0.85D).add(0.0D, 0.85D, 0.0D); - - this.level().addParticle(ParticleTypes.CRIT, pos.x + getRandomX(0.5D), pos.y + position().y, pos.z + getRandomZ(0.5D), 0.0D, 0.0D, 0.0D); - } - - @Override - public void tick() { - super.tick(); - - if (isInWater() && getTarget() != null && isAggressive() && level() instanceof ServerLevel serverLevel && stunnedTick <= 0) { - Vec3 pos = getYawVec(yHeadRot, 0.0D, 0.0D, 0.0D).add(position()); - - setDeltaMovement(calculateViewVector(this.getXRot(), this.getYRot()).scale(0.5D)); - - for (int i = 0; i < 5; i++) { - serverLevel.sendParticles(ParticleTypes.BUBBLE, pos.x(), pos.y() + (i * 0.1F) + 0.25F, pos.z(), 0, 0.0D, 0.0D, 0.0D, 0.0D); - } - } - } - - private static Vec3 getYawVec(float yaw, double xOffset, double yOffset, double zOffset) { - return new Vec3(xOffset, yOffset, zOffset).yRot(-yaw * ((float) Math.PI / 180f)); - } - - public void handleEntityEvent(byte p_33335_) { - if (p_33335_ == 39) { - this.stunnedTick = 80; - } - - super.handleEntityEvent(p_33335_); - } - - @Override - protected boolean isImmobile() { - return super.isImmobile() || this.stunnedTick > 0; - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 5; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 7; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } + private static final EntityDataAccessor REMAINING_ANGER_TIME = SynchedEntityData.defineId(RhinoTetra.class, EntityDataSerializers.INT); + private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(15, 29); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public int stunnedTick; + @Nullable + private UUID persistentAngerTarget; + private final boolean isSchool = true; + + public RhinoTetra(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.2F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.ATTACK_DAMAGE, 2.0D).add(Attributes.ATTACK_KNOCKBACK, 3.0D); + } + + private static Vec3 getYawVec(float yaw, double xOffset, double yOffset, double zOffset) { + return new Vec3(xOffset, yOffset, zOffset).yRot(-yaw * ((float) Math.PI / 180f)); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.RHINO_TETRA_BUCKET.get()); + } + + protected InteractionResult mobInteract(Player p_27477_, InteractionHand p_27478_) { + return InteractionResult.PASS; + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.0D, true)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 5.0D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.targetSelector.addGoal(1, new ResetUniversalAngerTargetGoal<>(this, false)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, this::isAngryAt)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + + if (isAlive()) { + if (this.stunnedTick > 0) { + --this.stunnedTick; + this.stunEffect(); + if (this.stunnedTick == 0) { + this.playSound(SoundEvents.BUBBLE_COLUMN_BUBBLE_POP, 1.0F, 0.7F); + } + } + } + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if (super.hurt(source, amount) && source.getEntity() instanceof LivingEntity living) { + setAggressive(true); + setTarget(living); + } + + return super.hurt(source, amount); + } + + protected void blockedByShield(LivingEntity p_33361_) { + if (this.random.nextFloat() > 0.25F) { + this.stunnedTick = 80; + this.playSound(SoundEvents.COD_HURT, 1.0F, 0.5F); + this.level().broadcastEntityEvent(this, (byte) 39); + p_33361_.push(this); + setAggressive(false); + setTarget(null); + } + + p_33361_.hurtMarked = true; + } + + private void stunEffect() { + Vec3 pos = getYawVec(yBodyRot, 0.0D, 0.0D, 0.85D).add(0.0D, 0.85D, 0.0D); + + this.level().addParticle(ParticleTypes.CRIT, pos.x + getRandomX(0.5D), pos.y + position().y, pos.z + getRandomZ(0.5D), 0.0D, 0.0D, 0.0D); + } + + @Override + public void tick() { + super.tick(); + + if (isInWater() && getTarget() != null && isAggressive() && level() instanceof ServerLevel serverLevel && stunnedTick <= 0) { + Vec3 pos = getYawVec(yHeadRot, 0.0D, 0.0D, 0.0D).add(position()); + + setDeltaMovement(calculateViewVector(this.getXRot(), this.getYRot()).scale(0.5D)); + + for (int i = 0; i < 5; i++) { + serverLevel.sendParticles(ParticleTypes.BUBBLE, pos.x(), pos.y() + (i * 0.1F) + 0.25F, pos.z(), 0, 0.0D, 0.0D, 0.0D, 0.0D); + } + } + } + + public void handleEntityEvent(byte p_33335_) { + if (p_33335_ == 39) { + this.stunnedTick = 80; + } + + super.handleEntityEvent(p_33335_); + } + + @Override + protected boolean isImmobile() { + return super.isImmobile() || this.stunnedTick > 0; + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 5; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 7; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); builder.define(REMAINING_ANGER_TIME, 0); } - - public void readAdditionalSaveData(CompoundTag compound) { - super.readAdditionalSaveData(compound); - this.stunnedTick = compound.getInt("StunTick"); - readPersistentAngerSaveData(level(), compound); - } - - public void addAdditionalSaveData(CompoundTag compound) { - super.addAdditionalSaveData(compound); - compound.putInt("StunTick", this.stunnedTick); - addPersistentAngerSaveData(compound); - } - - @Override - public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - if (this.hasCustomName()) { - bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); - } - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putFloat("Health", this.getHealth()); - }); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public int getRemainingPersistentAngerTime() { - return this.entityData.get(REMAINING_ANGER_TIME); - } - - @Override - public void setRemainingPersistentAngerTime(int p_21673_) { - this.entityData.set(REMAINING_ANGER_TIME, p_21673_); - } - - @Nullable - @Override - public UUID getPersistentAngerTarget() { - return this.persistentAngerTarget; - } - - @Override - public void setPersistentAngerTarget(@Nullable UUID p_27791_) { - this.persistentAngerTarget = p_27791_; - } - - @Override - public void startPersistentAngerTimer() { - this.setRemainingPersistentAngerTime(PERSISTENT_ANGER_TIME.sample(this.random)); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.stunnedTick = compound.getInt("StunTick"); + readPersistentAngerSaveData(level(), compound); + } + + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("StunTick", this.stunnedTick); + addPersistentAngerSaveData(compound); + } + + @Override + public void saveToBucketTag(ItemStack bucket) { + Bucketable.saveDefaultDataToBucketTag(this, bucket); + if (this.hasCustomName()) { + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); + } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); + } + + @Override + public int getRemainingPersistentAngerTime() { + return this.entityData.get(REMAINING_ANGER_TIME); + } + + @Override + public void setRemainingPersistentAngerTime(int p_21673_) { + this.entityData.set(REMAINING_ANGER_TIME, p_21673_); + } + + @Nullable + @Override + public UUID getPersistentAngerTarget() { + return this.persistentAngerTarget; + } + + @Override + public void setPersistentAngerTarget(@Nullable UUID p_27791_) { + this.persistentAngerTarget = p_27791_; + } + + @Override + public void startPersistentAngerTimer() { + this.setRemainingPersistentAngerTime(PERSISTENT_ANGER_TIME.sample(this.random)); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Ripper.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Ripper.java index d22291b..92727e1 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Ripper.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Ripper.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFSounds; @@ -40,173 +40,170 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Ripper extends BucketableSchoolingWaterAnimal implements GeoEntity { - protected int attackCooldown = 0; - private int attackAnimationTick; - private boolean isSchool = true; - - public Ripper(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.RIPPER_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.MOVEMENT_SPEED, 1.0D).add(Attributes.ATTACK_DAMAGE, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.5D, false)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 1.0D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 1.0D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, p -> p.getHealth() <= p.getMaxHealth() / 3)); - } - - @Override - public boolean doHurtTarget(Entity entityIn) { - this.attackAnimationTick = 10; - this.level().broadcastEntityEvent(this, (byte)4); - float f = this.getAttackDamage(); - float f1 = (int)f > 0 ? f / 2.0F + (float)this.random.nextInt((int)f) : f; - boolean flag = entityIn.hurt(damageSources().mobAttack(this), f1); - if (flag) { - entityIn.setDeltaMovement(entityIn.getDeltaMovement().add(0.0D, 0.4F, 0.0D)); - if (this.level() instanceof ServerLevel serverLevel) { - EnchantmentHelper.doPostAttackEffects((ServerLevel) this.level(), entityIn, this.damageSources().generic()); - } - if (random.nextFloat() > 0.9F) { - ItemEntity item = EntityType.ITEM.create(level()); - - item.moveTo(position()); - item.setItem(new ItemStack(UFItems.RIPPER_TOOTH.get())); - - level().addFreshEntity(item); - } - } - return flag; - } - - public void tick() { - super.tick(); - - if (this.attackCooldown > 0) { - this.attackCooldown--; - } - } - - public void aiStep() { - - if (this.attackAnimationTick > 0) { - --this.attackAnimationTick; - } - - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - public int getMaxSpawnClusterSize() { - return 5; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 7; - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - private float getAttackDamage() { - return (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE); - } - - public void handleEntityEvent(byte p_28844_) { - if (p_28844_ == 4) { - this.attackAnimationTick = 10; - } - } - - public int getAttackAnimationTick() { - return this.attackAnimationTick; - } - - - protected SoundEvent getAmbientSound() { - return UFSounds.SMALL_ENEMY.get(); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); - } - - private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { - float time = iServerWorld.getTimeOfDay(1.0F); - int light = iServerWorld.getBrightness(LightLayer.BLOCK, pos); - return light <= 4/* && time > 0.27F && time <= 0.8F*/; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + protected int attackCooldown = 0; + private int attackAnimationTick; + private final boolean isSchool = true; + + public Ripper(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.MOVEMENT_SPEED, 1.0D).add(Attributes.ATTACK_DAMAGE, 2.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); + } + + private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { + float time = iServerWorld.getTimeOfDay(1.0F); + int light = iServerWorld.getBrightness(LightLayer.BLOCK, pos); + return light <= 4/* && time > 0.27F && time <= 0.8F*/; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.RIPPER_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.5D, false)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 1.0D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 1.0D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, p -> p.getHealth() <= p.getMaxHealth() / 3)); + } + + @Override + public boolean doHurtTarget(Entity entityIn) { + this.attackAnimationTick = 10; + this.level().broadcastEntityEvent(this, (byte) 4); + float f = this.getAttackDamage(); + float f1 = (int) f > 0 ? f / 2.0F + (float) this.random.nextInt((int) f) : f; + boolean flag = entityIn.hurt(damageSources().mobAttack(this), f1); + if (flag) { + entityIn.setDeltaMovement(entityIn.getDeltaMovement().add(0.0D, 0.4F, 0.0D)); + if (this.level() instanceof ServerLevel serverLevel) { + EnchantmentHelper.doPostAttackEffects(serverLevel, entityIn, this.damageSources().generic()); + } + if (random.nextFloat() > 0.9F) { + ItemEntity item = EntityType.ITEM.create(level()); + + item.moveTo(position()); + item.setItem(new ItemStack(UFItems.RIPPER_TOOTH.get())); + + level().addFreshEntity(item); + } + } + return flag; + } + + public void tick() { + super.tick(); + + if (this.attackCooldown > 0) { + this.attackCooldown--; + } + } + + public void aiStep() { + + if (this.attackAnimationTick > 0) { + --this.attackAnimationTick; + } + + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + public int getMaxSpawnClusterSize() { + return 5; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 7; + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + private float getAttackDamage() { + return (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); + } + + public void handleEntityEvent(byte p_28844_) { + if (p_28844_ == 4) { + this.attackAnimationTick = 10; + } + } + + public int getAttackAnimationTick() { + return this.attackAnimationTick; + } + + protected SoundEvent getAmbientSound() { + return UFSounds.SMALL_ENEMY.get(); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Rootball.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Rootball.java index 0f5ec71..21a932e 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Rootball.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Rootball.java @@ -1,7 +1,6 @@ package codyhuh.unusualfishmod.common.entity; import codyhuh.unusualfishmod.common.entity.util.goal.CustomSwellGoal; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFSounds; import net.minecraft.core.BlockPos; @@ -43,6 +42,7 @@ public class Rootball extends Monster implements GeoEntity { private static final EntityDataAccessor DATA_SWELL_DIR = SynchedEntityData.defineId(Rootball.class, EntityDataSerializers.INT); private static final EntityDataAccessor DATA_IS_IGNITED = SynchedEntityData.defineId(Rootball.class, EntityDataSerializers.BOOLEAN); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private int oldSwell; private int swell; private int maxSwell = 30; @@ -52,6 +52,24 @@ public Rootball(EntityType entityType, Level level) { super(entityType, level); } + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 3.0D).add(Attributes.MOVEMENT_SPEED, 0.4D) + .add(Attributes.ATTACK_DAMAGE, 2.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.canSeeSky(pos.above()) && canMonsterSpawnInLight(entityType, iServerWorld, reason, pos, random); + } + + public static boolean canMonsterSpawnInLight(EntityType p_223325_0_, ServerLevelAccessor p_223325_1_, MobSpawnType p_223325_2_, BlockPos p_223325_3_, RandomSource p_223325_4_) { + return isValidLightLevel(p_223325_1_, p_223325_3_, p_223325_4_) && checkMobSpawnRules(p_223325_0_, p_223325_1_, p_223325_2_, p_223325_3_, p_223325_4_); + } + + public static boolean isValidLightLevel(ServerLevelAccessor p_223323_0_, BlockPos p_223323_1_, RandomSource p_223323_2_) { + int light = p_223323_0_.getMaxLocalRawBrightness(p_223323_1_); + return light <= 4; + } + protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); this.goalSelector.addGoal(2, new CustomSwellGoal(this)); @@ -65,19 +83,13 @@ protected void registerGoals() { this.targetSelector.addGoal(2, new HurtByTargetGoal(this)); } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 3.0D).add(Attributes.MOVEMENT_SPEED, 0.4D) - .add(Attributes.ATTACK_DAMAGE, 2.0D); - } - public int getMaxFallDistance() { - return this.getTarget() == null ? 3 : 3 + (int)(this.getHealth() - 1.0F); + return this.getTarget() == null ? 3 : 3 + (int) (this.getHealth() - 1.0F); } public boolean causeFallDamage(float p_149687_, float p_149688_, DamageSource p_149689_) { boolean flag = super.causeFallDamage(p_149687_, p_149688_, p_149689_); - this.swell = (int)((float)this.swell + p_149687_ * 1.5F); + this.swell = (int) ((float) this.swell + p_149687_ * 1.5F); if (this.swell > this.maxSwell - 5) { this.swell = this.maxSwell - 5; } @@ -95,8 +107,8 @@ protected void defineSynchedData(SynchedEntityData.Builder builder) { public void addAdditionalSaveData(CompoundTag compound) { super.addAdditionalSaveData(compound); - compound.putShort("Fuse", (short)this.maxSwell); - compound.putByte("ExplosionRadius", (byte)this.explosionRadius); + compound.putShort("Fuse", (short) this.maxSwell); + compound.putByte("ExplosionRadius", (byte) this.explosionRadius); compound.putBoolean("ignited", this.isIgnited()); } @@ -175,7 +187,7 @@ public void setSwellDir(int p_32284_) { } public float getSwelling(float p_32321_) { - return Mth.lerp(p_32321_, (float)this.oldSwell, (float)this.swell) / (float)(this.maxSwell - 2); + return Mth.lerp(p_32321_, (float) this.oldSwell, (float) this.swell) / (float) (this.maxSwell - 2); } private void explodeCreeper() { @@ -196,9 +208,9 @@ private void spawnLingeringCloud() { areaeffectcloud.setRadiusOnUse(-0.5F); areaeffectcloud.setWaitTime(10); areaeffectcloud.setDuration(areaeffectcloud.getDuration() / 2); - areaeffectcloud.setRadiusPerTick(-areaeffectcloud.getRadius() / (float)areaeffectcloud.getDuration()); + areaeffectcloud.setRadiusPerTick(-areaeffectcloud.getRadius() / (float) areaeffectcloud.getDuration()); - for(MobEffectInstance mobeffectinstance : collection) { + for (MobEffectInstance mobeffectinstance : collection) { areaeffectcloud.addEffect(new MobEffectInstance(mobeffectinstance)); } @@ -215,19 +227,6 @@ public void ignite() { this.entityData.set(DATA_IS_IGNITED, true); } - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.canSeeSky(pos.above()) && canMonsterSpawnInLight(entityType, iServerWorld, reason, pos, random); - } - - public static boolean canMonsterSpawnInLight(EntityType p_223325_0_, ServerLevelAccessor p_223325_1_, MobSpawnType p_223325_2_, BlockPos p_223325_3_, RandomSource p_223325_4_) { - return isValidLightLevel(p_223325_1_, p_223325_3_, p_223325_4_) && checkMobSpawnRules(p_223325_0_, p_223325_1_, p_223325_2_, p_223325_3_, p_223325_4_); - } - - public static boolean isValidLightLevel(ServerLevelAccessor p_223323_0_, BlockPos p_223323_1_, RandomSource p_223323_2_) { - int light = p_223323_0_.getMaxLocalRawBrightness(p_223323_1_); - return light <= 4; - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -240,15 +239,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/RoughbackGuitarfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/RoughbackGuitarfish.java index f92172e..807e285 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/RoughbackGuitarfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/RoughbackGuitarfish.java @@ -31,114 +31,112 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class RoughbackGuitarfish extends WaterAnimal implements GeoEntity { - protected int attackCooldown = 0; - - public RoughbackGuitarfish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 16.0D).add(Attributes.ATTACK_DAMAGE, 1.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(4, new HurtByTargetGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void tick() { - super.tick(); - - if (this.attackCooldown > 0) { - this.attackCooldown--; - } - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public void playerTouch(Player entity) { - super.playerTouch(entity); - if (!entity.isCreative() && this.attackCooldown == 0 && entity.level().getDifficulty() != Difficulty.PEACEFUL) { - entity.hurt(damageSources().mobAttack(this), 2.0F); - this.attackCooldown = 80; - } - } - - @Override - public int getMaxSpawnClusterSize() { - return 1; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return random.nextBoolean() && WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + protected int attackCooldown = 0; + + public RoughbackGuitarfish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 16.0D).add(Attributes.ATTACK_DAMAGE, 1.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return random.nextBoolean() && WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(4, new HurtByTargetGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void tick() { + super.tick(); + + if (this.attackCooldown > 0) { + this.attackCooldown--; + } + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void playerTouch(Player entity) { + super.playerTouch(entity); + if (!entity.isCreative() && this.attackCooldown == 0 && entity.level().getDifficulty() != Difficulty.PEACEFUL) { + entity.hurt(damageSources().mobAttack(this), 2.0F); + this.attackCooldown = 80; + } + } + + @Override + public int getMaxSpawnClusterSize() { + return 1; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SailorBarb.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SailorBarb.java index da1df64..9ba99f5 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SailorBarb.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SailorBarb.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -33,109 +33,107 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class SailorBarb extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public SailorBarb(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.SAILOR_BARB_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 5; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 7; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public SailorBarb(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.SAILOR_BARB_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 5; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 7; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java index c3a555c..2d7c6a2 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java @@ -2,21 +2,16 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.goal.BottomStrollGoal; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFSounds; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -28,13 +23,11 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -44,100 +37,98 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class SeaMosquito extends BucketableWaterAnimal implements GeoEntity { - private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(SeaMosquito.class, EntityDataSerializers.BOOLEAN); - - public SeaMosquito(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 6.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getAmbientSound() { - return UFSounds.CRAB_CHATTER.get(); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.SEA_MOSQUITO_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(SeaMosquito.class, EntityDataSerializers.BOOLEAN); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public SeaMosquito(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 6.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getAmbientSound() { + return UFSounds.CRAB_CHATTER.get(); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.SEA_MOSQUITO_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaPancake.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaPancake.java index 893408a..cd25208 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaPancake.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaPancake.java @@ -1,6 +1,5 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.UnusualFishMod; import codyhuh.unusualfishmod.common.entity.util.goal.BottomStrollGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; @@ -52,131 +51,130 @@ import static codyhuh.unusualfishmod.UnusualFishMod.loc; public class SeaPancake extends WaterAnimal implements GeoEntity { - public static final ResourceLocation FEED_REWARD = loc("gameplay/sea_pancake_search"); - protected int attackCooldown = 0; - - public SeaPancake(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 45, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 30.0D).add(Attributes.ATTACK_DAMAGE, 5.0D); - } - - @Override - public void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, TropicalFish.class, false)); - } - - @Override - protected InteractionResult mobInteract(Player player, InteractionHand hand) { - ItemStack stack = player.getItemInHand(hand); - - if (stack.is(UFItems.RAW_LOBSTER.get()) && level() instanceof ServerLevel serverlevel) { - LootTable loottable = serverlevel.registryAccess().lookupOrThrow(Registries.LOOT_TABLE).getOrThrow(ResourceKey.create(Registries.LOOT_TABLE, FEED_REWARD)).value(); - List list = loottable.getRandomItems(new LootParams.Builder(serverlevel).withParameter(LootContextParams.ORIGIN, position()).withParameter(LootContextParams.THIS_ENTITY, this).withLuck(random.nextFloat()).create(LootContextParamSets.PIGLIN_BARTER)); - - if (!list.isEmpty() && random.nextBoolean()) { - ItemEntity item = EntityType.ITEM.create(level()); - - item.setItem(list.get(0)); - item.moveTo(position()); - - level().addFreshEntity(item); - - playSound(SoundEvents.ITEM_PICKUP, 1.0F, 1.0F); - } - - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } - - serverlevel.sendParticles(new ItemParticleOption(ParticleTypes.ITEM, stack), getRandomX(1.0D), position().y - 0.25D, getRandomZ(1.0D), 1, 0.0D, 0.0D, 0.0D, 0.0D); - playSound(SoundEvents.DOLPHIN_EAT, 1.0F, 1.0F); - } - - return super.mobInteract(player, hand); - } - - public void tick() { - super.tick(); - - if (this.attackCooldown > 0) { - this.attackCooldown--; - } - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - public SoundEvent getHurtSound(DamageSource damageSourceIn) { - return SoundEvents.COD_HURT; - } - - public SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + public static final ResourceLocation FEED_REWARD = loc("gameplay/sea_pancake_search"); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + protected int attackCooldown = 0; + + public SeaPancake(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 45, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 30.0D).add(Attributes.ATTACK_DAMAGE, 5.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, TropicalFish.class, false)); + } + + @Override + protected InteractionResult mobInteract(Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (stack.is(UFItems.RAW_LOBSTER.get()) && level() instanceof ServerLevel serverlevel) { + LootTable loottable = serverlevel.registryAccess().lookupOrThrow(Registries.LOOT_TABLE).getOrThrow(ResourceKey.create(Registries.LOOT_TABLE, FEED_REWARD)).value(); + List list = loottable.getRandomItems(new LootParams.Builder(serverlevel).withParameter(LootContextParams.ORIGIN, position()).withParameter(LootContextParams.THIS_ENTITY, this).withLuck(random.nextFloat()).create(LootContextParamSets.PIGLIN_BARTER)); + + if (!list.isEmpty() && random.nextBoolean()) { + ItemEntity item = EntityType.ITEM.create(level()); + + item.setItem(list.get(0)); + item.moveTo(position()); + + level().addFreshEntity(item); + + playSound(SoundEvents.ITEM_PICKUP, 1.0F, 1.0F); + } + + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } + + serverlevel.sendParticles(new ItemParticleOption(ParticleTypes.ITEM, stack), getRandomX(1.0D), position().y - 0.25D, getRandomZ(1.0D), 1, 0.0D, 0.0D, 0.0D, 0.0D); + playSound(SoundEvents.DOLPHIN_EAT, 1.0F, 1.0F); + } + + return super.mobInteract(player, hand); + } + + public void tick() { + super.tick(); + + if (this.attackCooldown > 0) { + this.attackCooldown--; + } + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + public SoundEvent getHurtSound(DamageSource damageSourceIn) { + return SoundEvents.COD_HURT; + } + + public SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaSpider.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaSpider.java index ca2f32f..6be486e 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaSpider.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaSpider.java @@ -5,17 +5,11 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFSounds; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.FluidTags; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -29,7 +23,6 @@ import net.minecraft.world.entity.ai.goal.TryFindWaterGoal; import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -46,112 +39,114 @@ public class SeaSpider extends BucketableWaterAnimal implements GeoEntity { - public SeaSpider(EntityType type, Level world) { - super(type, world); - this.moveControl = new SeaSpider.MoveHelperController(this); - this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.5D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.5F)); - this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.5F)); - this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new GroundPathNavigation(this, level()); - } - - @Override - public float getWaterSlowDown() { - return 0.9f; - } - - @Override - public void handleAirSupply(int p_209207_1_) { - } - - protected SoundEvent getAmbientSound() { - return UFSounds.CRAB_CHATTER.get(); - } - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { - this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.SEA_SPIDER_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.WALK); - } else { - event.setAnimation(UFAnimations.IDLE); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } - - static class MoveHelperController extends MoveControl { - - private final Mob spider; - - MoveHelperController(Mob spider) { - super(spider); - this.spider = spider; - } - public void tick() { - if (this.spider.isEyeInFluid(FluidTags.WATER)) { - this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); - } - - if (this.operation == MoveControl.Operation.MOVE_TO && !this.spider.getNavigation().isDone()) { - double d0 = this.wantedX - this.spider.getX(); - double d1 = this.wantedY - this.spider.getY(); - double d2 = this.wantedZ - this.spider.getZ(); - double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); - d1 = d1 / d3; - float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); - this.spider.yBodyRot = this.spider.getYRot(); - float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); - this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); - this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); - } else { - this.spider.setSpeed(0.0F); - } - } - - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public SeaSpider(EntityType type, Level world) { + super(type, world); + this.moveControl = new SeaSpider.MoveHelperController(this); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.5D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(1, new RandomStrollGoal(this, 0.5F)); + this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.5F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new GroundPathNavigation(this, level()); + } + + @Override + public float getWaterSlowDown() { + return 0.9f; + } + + @Override + public void handleAirSupply(int p_209207_1_) { + } + + protected SoundEvent getAmbientSound() { + return UFSounds.CRAB_CHATTER.get(); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { + this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.SEA_SPIDER_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.WALK); + } else { + event.setAnimation(UFAnimations.IDLE); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } + + static class MoveHelperController extends MoveControl { + + private final Mob spider; + + MoveHelperController(Mob spider) { + super(spider); + this.spider = spider; + } + + public void tick() { + if (this.spider.isEyeInFluid(FluidTags.WATER)) { + this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); + } + + if (this.operation == MoveControl.Operation.MOVE_TO && !this.spider.getNavigation().isDone()) { + double d0 = this.wantedX - this.spider.getX(); + double d1 = this.wantedY - this.spider.getY(); + double d2 = this.wantedZ - this.spider.getZ(); + double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); + d1 = d1 / d3; + float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; + this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); + this.spider.yBodyRot = this.spider.getYRot(); + float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); + this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); + this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); + } else { + this.spider.setSpeed(0.0F); + } + } + + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Shockcat.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Shockcat.java index dc34aa3..eacbca4 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Shockcat.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Shockcat.java @@ -40,125 +40,123 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Shockcat extends BucketableWaterAnimal implements GeoEntity { - protected int attackCooldown = 0; - - public Shockcat(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.SHOCKCAT_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.ATTACK_DAMAGE, 4.0D); - } - - @Override - public void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AbstractFish.class, false)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void tick() { - super.tick(); - - if (this.level().isClientSide && this.isInWater() && this.getDeltaMovement().lengthSqr() > 0.03D) { - Vec3 vec3 = this.getViewVector(0.0F); - float f = Mth.cos(this.getYRot() * ((float)Math.PI / 180F)) * 0.3F; - float f1 = Mth.sin(this.getYRot() * ((float)Math.PI / 180F)) * 0.3F; - - } - - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - public SoundEvent getHurtSound(DamageSource damageSourceIn) { - return SoundEvents.COD_HURT; - } - - public SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public void playerTouch(Player entity) { - super.playerTouch(entity); - if (!entity.isCreative() && this.attackCooldown == 0 && entity.level().getDifficulty() != Difficulty.PEACEFUL) { - entity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 300, 3, false, false)); - entity.addEffect(new MobEffectInstance(MobEffects.DIG_SLOWDOWN, 200, 2, false, false)); - this.attackCooldown = 80; - } - } - - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).is(Blocks.WATER) && pos.getY() <= 10 && iServerWorld.getBlockState(pos.above()).is(Blocks.WATER) && iServerWorld.getLightEmission(pos) < 8; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + protected int attackCooldown = 0; + + public Shockcat(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.ATTACK_DAMAGE, 4.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).is(Blocks.WATER) && pos.getY() <= 10 && iServerWorld.getBlockState(pos.above()).is(Blocks.WATER) && iServerWorld.getLightEmission(pos) < 8; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.SHOCKCAT_BUCKET.get()); + } + + @Override + public void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AbstractFish.class, false)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void tick() { + super.tick(); + + if (this.level().isClientSide && this.isInWater() && this.getDeltaMovement().lengthSqr() > 0.03D) { + Vec3 vec3 = this.getViewVector(0.0F); + float f = Mth.cos(this.getYRot() * ((float) Math.PI / 180F)) * 0.3F; + float f1 = Mth.sin(this.getYRot() * ((float) Math.PI / 180F)) * 0.3F; + + } + + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + public SoundEvent getHurtSound(DamageSource damageSourceIn) { + return SoundEvents.COD_HURT; + } + + public SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void playerTouch(Player entity) { + super.playerTouch(entity); + if (!entity.isCreative() && this.attackCooldown == 0 && entity.level().getDifficulty() != Difficulty.PEACEFUL) { + entity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 300, 3, false, false)); + entity.addEffect(new MobEffectInstance(MobEffects.DIG_SLOWDOWN, 200, 2, false, false)); + this.attackCooldown = 80; + } + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java index d45a6ce..f7507c2 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Skrimp.java @@ -17,8 +17,6 @@ import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.DifficultyInstance; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -53,69 +51,74 @@ import javax.annotation.Nullable; public class Skrimp extends BucketableWaterAnimal implements GeoEntity { - private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(Skrimp.class, EntityDataSerializers.INT); - - public Skrimp(EntityType type, Level world) { - super(type, world); - this.moveControl = new Skrimp.MoveHelperController(this); - this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.5D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(1, new RandomStrollGoal(this, 1.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.5F)); - this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new GroundPathNavigation(this, level()); - } - - @Override - public float getWaterSlowDown() { - return 0.9f; - } - - @Override - public void handleAirSupply(int p_209207_1_) { - } - - protected SoundEvent getAmbientSound() { - return UFSounds.CRAB_CHATTER.get(); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { - this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); - } - - @Override - public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putInt("Variant", this.getVariant()); - }); - } - - @Override - public void loadFromBucketTag(CompoundTag tag) { - super.loadFromBucketTag(tag); - if (tag.contains("Variant", 3)) { - this.setVariant(tag.getInt("Variant")); - } - } + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(Skrimp.class, EntityDataSerializers.INT); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public Skrimp(EntityType type, Level world) { + super(type, world); + this.moveControl = new Skrimp.MoveHelperController(this); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.5D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(1, new RandomStrollGoal(this, 1.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.5F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new GroundPathNavigation(this, level()); + } + + @Override + public float getWaterSlowDown() { + return 0.9f; + } + + @Override + public void handleAirSupply(int p_209207_1_) { + } + + protected SoundEvent getAmbientSound() { + return UFSounds.CRAB_CHATTER.get(); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { + this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); + } + + @Override + public void saveToBucketTag(ItemStack bucket) { + Bucketable.saveDefaultDataToBucketTag(this, bucket); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putInt("Variant", this.getVariant()); + }); + } + + @Override + public void loadFromBucketTag(CompoundTag tag) { + super.loadFromBucketTag(tag); + if (tag.contains("Variant", 3)) { + this.setVariant(tag.getInt("Variant")); + } + } @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { @@ -123,97 +126,92 @@ protected void defineSynchedData(SynchedEntityData.Builder builder) { builder.define(VARIANT, 0); } - public int getVariant() { - return this.entityData.get(VARIANT); - } - - private void setVariant(int variant) { - this.entityData.set(VARIANT, variant); - } - - @Override - public void addAdditionalSaveData(CompoundTag compound) { - super.addAdditionalSaveData(compound); - compound.putInt("Variant", getVariant()); - } - - @Override - public void readAdditionalSaveData(CompoundTag compound) { - super.readAdditionalSaveData(compound); - setVariant(compound.getInt("Variant")); - } - - @Nullable - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn) { - spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn); - if (reason == MobSpawnType.NATURAL || reason == MobSpawnType.SPAWN_EGG || reason == MobSpawnType.STRUCTURE) { - this.setVariant(this.random.nextInt(3)); - } - - return spawnDataIn; - } - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.CORAL_SKRIMP_BUCKET.get()); - } - - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.WALK); - } else { - event.setAnimation(UFAnimations.IDLE); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - static class MoveHelperController extends MoveControl { - - private final Mob spider; - - MoveHelperController(Mob spider) { - super(spider); - this.spider = spider; - } - public void tick() { - if (this.spider.isEyeInFluid(FluidTags.WATER)) { - this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); - } - - if (this.operation == Operation.MOVE_TO && !this.spider.getNavigation().isDone()) { - double d0 = this.wantedX - this.spider.getX(); - double d1 = this.wantedY - this.spider.getY(); - double d2 = this.wantedZ - this.spider.getZ(); - double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); - d1 = d1 / d3; - float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); - this.spider.yBodyRot = this.spider.getYRot(); - float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); - this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); - this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); - } else { - this.spider.setSpeed(0.0F); - } - } - } + public int getVariant() { + return this.entityData.get(VARIANT); + } + + private void setVariant(int variant) { + this.entityData.set(VARIANT, variant); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("Variant", getVariant()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + setVariant(compound.getInt("Variant")); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn) { + spawnDataIn = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn); + if (reason == MobSpawnType.NATURAL || reason == MobSpawnType.SPAWN_EGG || reason == MobSpawnType.STRUCTURE) { + this.setVariant(this.random.nextInt(3)); + } + + return spawnDataIn; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.CORAL_SKRIMP_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.WALK); + } else { + event.setAnimation(UFAnimations.IDLE); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } + + static class MoveHelperController extends MoveControl { + + private final Mob spider; + + MoveHelperController(Mob spider) { + super(spider); + this.spider = spider; + } + + public void tick() { + if (this.spider.isEyeInFluid(FluidTags.WATER)) { + this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); + } + + if (this.operation == Operation.MOVE_TO && !this.spider.getNavigation().isDone()) { + double d0 = this.wantedX - this.spider.getX(); + double d1 = this.wantedY - this.spider.getY(); + double d2 = this.wantedZ - this.spider.getZ(); + double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); + d1 = d1 / d3; + float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; + this.spider.setYRot(this.rotlerp(this.spider.getYRot(), f, 90.0F)); + this.spider.yBodyRot = this.spider.getYRot(); + float f1 = (float) (this.speedModifier * this.spider.getAttributeValue(Attributes.MOVEMENT_SPEED)); + this.spider.setSpeed(Mth.lerp(0.125F, this.spider.getSpeed(), f1)); + this.spider.setDeltaMovement(this.spider.getDeltaMovement().add(0.0D, (double) this.spider.getSpeed() * d1 * 0.1D, 0.0D)); + } else { + this.spider.setSpeed(0.0F); + } + } + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SneepSnorp.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SneepSnorp.java index 6b24e3d..f595a4d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SneepSnorp.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SneepSnorp.java @@ -1,7 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BucketableSchoolingWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; import net.minecraft.core.BlockPos; @@ -33,108 +33,106 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class SneepSnorp extends BucketableSchoolingWaterAnimal implements GeoEntity { - private boolean isSchool = true; - - public SneepSnorp(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.SNEEPSNORP_BUCKET.get()); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - public int getMaxSpawnClusterSize() { - return 5; - } - - public boolean isMaxGroupSizeReached(int p_30035_) { - return !this.isSchool; - } - - public int getMaxSchoolSize() { - return 8; - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private final boolean isSchool = true; + + public SneepSnorp(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.SNEEPSNORP_BUCKET.get()); + } + + protected void registerGoals() { + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(4, new FollowSchoolLeaderGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4D, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + public int getMaxSpawnClusterSize() { + return 5; + } + + public boolean isMaxGroupSizeReached(int p_30035_) { + return !this.isSchool; + } + + public int getMaxSchoolSize() { + return 8; + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Spindlefish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Spindlefish.java index b8e11ef..7904d6b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Spindlefish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Spindlefish.java @@ -3,19 +3,11 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; -import codyhuh.unusualfishmod.core.registry.UFSounds; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; @@ -30,13 +22,11 @@ import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -46,119 +36,116 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Spindlefish extends BucketableWaterAnimal implements GeoEntity { - protected int attackCooldown = 0; - - public Spindlefish(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(4, new HurtByTargetGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - - public void tick() { - super.tick(); - - if (this.attackCooldown > 0) { - this.attackCooldown--; - } - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.SPINDLEFISH_BUCKET.get()); - } - - @Override - public void playerTouch(Player entity) { - super.playerTouch(entity); - if (!entity.isCreative() && this.attackCooldown == 0 && entity.level().getDifficulty() != Difficulty.PEACEFUL) { - entity.hurt(damageSources().mobAttack(this), 2.0F); - entity.addEffect(new MobEffectInstance(MobEffects.POISON, 200, 0, false, false)); - this.attackCooldown = 80; - } - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (this.isRemoved()) { - return PlayState.STOP; - } - - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + protected int attackCooldown = 0; + + public Spindlefish(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(4, new HurtByTargetGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + public void tick() { + super.tick(); + + if (this.attackCooldown > 0) { + this.attackCooldown--; + } + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.SPINDLEFISH_BUCKET.get()); + } + + @Override + public void playerTouch(Player entity) { + super.playerTouch(entity); + if (!entity.isCreative() && this.attackCooldown == 0 && entity.level().getDifficulty() != Difficulty.PEACEFUL) { + entity.hurt(damageSources().mobAttack(this), 2.0F); + entity.addEffect(new MobEffectInstance(MobEffects.POISON, 200, 0, false, false)); + this.attackCooldown = 80; + } + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (this.isRemoved()) { + return PlayState.STOP; + } + + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SpoonShark.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SpoonShark.java index 240fc0a..d73d307 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SpoonShark.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SpoonShark.java @@ -3,17 +3,10 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; -import codyhuh.unusualfishmod.core.registry.UFSounds; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; @@ -27,7 +20,6 @@ import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -43,94 +35,93 @@ public class SpoonShark extends BucketableWaterAnimal implements GeoEntity { - public SpoonShark(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.ATTACK_DAMAGE, 1.0D).add(Attributes.ATTACK_SPEED, 1.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.0D, false)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, p -> p.getHealth() <= p.getMaxHealth() / 3)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.SPOON_SHARK_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public SpoonShark(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.ATTACK_DAMAGE, 1.0D).add(Attributes.ATTACK_SPEED, 1.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, true, p -> p.getHealth() <= p.getMaxHealth() / 3)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.SPOON_SHARK_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Squoddle.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Squoddle.java index 2579fbe..5d658ce 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Squoddle.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Squoddle.java @@ -5,21 +5,13 @@ import codyhuh.unusualfishmod.core.registry.UFItems; import codyhuh.unusualfishmod.core.registry.UFSounds; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.FluidTags; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobSpawnType; @@ -33,7 +25,6 @@ import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -49,129 +40,129 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class Squoddle extends BucketableWaterAnimal implements GeoEntity { - protected int attackCooldown = 0; - - public Squoddle(EntityType type, Level world) { - super(type, world); - this.moveControl = new Squoddle.MoveHelperController(this); - this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.4D).add(Attributes.ATTACK_DAMAGE, 2.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(1, new RandomStrollGoal(this, 1.0F)); - this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.4F)); - this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); - this.targetSelector.addGoal(1, (new HurtByTargetGoal(this))); - } - - @Override - public void tick() { - super.tick(); - if (this.attackCooldown > 0) { - this.attackCooldown--; - } - } - - @Override - public void playerTouch(Player entity) { - super.playerTouch(entity); - if (!entity.isCreative() && this.attackCooldown == 0 && entity.level().getDifficulty() != Difficulty.PEACEFUL) { - entity.hurt(damageSources().mobAttack(this), 2.0F); - this.playSound(SoundEvents.PUFFER_FISH_STING, 1.0F, 1.0F); - this.attackCooldown = 80; - } - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new GroundPathNavigation(this, level()); - } - - @Override - public float getWaterSlowDown() { - return 0.9f; - } - - @Override - public void handleAirSupply(int p_209207_1_) { - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { - this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.SQUODDLE_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.WALK); - } else { - event.setAnimation(UFAnimations.IDLE); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } - - static class MoveHelperController extends MoveControl { - - private final Mob squoddle; - - MoveHelperController(Mob squoddle) { - super(squoddle); - this.squoddle = squoddle; - } - public void tick() { - if (this.squoddle.isEyeInFluid(FluidTags.WATER)) { - this.squoddle.setDeltaMovement(this.squoddle.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); - } - - if (this.operation == Operation.MOVE_TO && !this.squoddle.getNavigation().isDone()) { - double d0 = this.wantedX - this.squoddle.getX(); - double d1 = this.wantedY - this.squoddle.getY(); - double d2 = this.wantedZ - this.squoddle.getZ(); - double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); - d1 = d1 / d3; - float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; - this.squoddle.setYRot(this.rotlerp(this.squoddle.getYRot(), f, 90.0F)); - this.squoddle.yBodyRot = this.squoddle.getYRot(); - float f1 = (float) (this.speedModifier * this.squoddle.getAttributeValue(Attributes.MOVEMENT_SPEED)); - this.squoddle.setSpeed(Mth.lerp(0.125F, this.squoddle.getSpeed(), f1)); - this.squoddle.setDeltaMovement(this.squoddle.getDeltaMovement().add(0.0D, (double) this.squoddle.getSpeed() * d1 * 0.1D, 0.0D)); - } else { - this.squoddle.setSpeed(0.0F); - } - } - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + protected int attackCooldown = 0; + + public Squoddle(EntityType type, Level world) { + super(type, world); + this.moveControl = new Squoddle.MoveHelperController(this); + this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.5F); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.4D).add(Attributes.ATTACK_DAMAGE, 2.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(1, new RandomStrollGoal(this, 1.0F)); + this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.4F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, (new HurtByTargetGoal(this))); + } + + @Override + public void tick() { + super.tick(); + if (this.attackCooldown > 0) { + this.attackCooldown--; + } + } + + @Override + public void playerTouch(Player entity) { + super.playerTouch(entity); + if (!entity.isCreative() && this.attackCooldown == 0 && entity.level().getDifficulty() != Difficulty.PEACEFUL) { + entity.hurt(damageSources().mobAttack(this), 2.0F); + this.playSound(SoundEvents.PUFFER_FISH_STING, 1.0F, 1.0F); + this.attackCooldown = 80; + } + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new GroundPathNavigation(this, level()); + } + + @Override + public float getWaterSlowDown() { + return 0.9f; + } + + @Override + public void handleAirSupply(int p_209207_1_) { + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected void playStepSound(BlockPos p_33804_, BlockState p_33805_) { + this.playSound(UFSounds.CRAB_SCUTTLING.get(), 0.15F, 1.0F); + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.SQUODDLE_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.WALK); + } else { + event.setAnimation(UFAnimations.IDLE); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } + + static class MoveHelperController extends MoveControl { + + private final Mob squoddle; + + MoveHelperController(Mob squoddle) { + super(squoddle); + this.squoddle = squoddle; + } + + public void tick() { + if (this.squoddle.isEyeInFluid(FluidTags.WATER)) { + this.squoddle.setDeltaMovement(this.squoddle.getDeltaMovement().add(0.0D, 0.0D, 0.0D)); + } + + if (this.operation == Operation.MOVE_TO && !this.squoddle.getNavigation().isDone()) { + double d0 = this.wantedX - this.squoddle.getX(); + double d1 = this.wantedY - this.squoddle.getY(); + double d2 = this.wantedZ - this.squoddle.getZ(); + double d3 = Mth.sqrt((float) (d0 * d0 + d1 * d1 + d2 * d2)); + d1 = d1 / d3; + float f = (float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F; + this.squoddle.setYRot(this.rotlerp(this.squoddle.getYRot(), f, 90.0F)); + this.squoddle.yBodyRot = this.squoddle.getYRot(); + float f1 = (float) (this.speedModifier * this.squoddle.getAttributeValue(Attributes.MOVEMENT_SPEED)); + this.squoddle.setSpeed(Mth.lerp(0.125F, this.squoddle.getSpeed(), f1)); + this.squoddle.setDeltaMovement(this.squoddle.getDeltaMovement().add(0.0D, (double) this.squoddle.getSpeed() * d1 * 0.1D, 0.0D)); + } else { + this.squoddle.setSpeed(0.0F); + } + } + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/StoutBichir.java b/src/main/java/codyhuh/unusualfishmod/common/entity/StoutBichir.java index 53489a4..f28020d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/StoutBichir.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/StoutBichir.java @@ -33,6 +33,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class StoutBichir extends BucketableWaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); protected int attackCooldown = 0; public StoutBichir(EntityType entityType, Level level) { @@ -45,6 +46,10 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 30.0D).add(Attributes.ATTACK_DAMAGE, 4.0D); } + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + @Override public ItemStack getBucketStack() { return new ItemStack(UFItems.STOUT_BICHIR_BUCKET.get()); @@ -74,7 +79,7 @@ public boolean canUse() { public void aiStep() { if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); this.setOnGround(false); this.hasImpulse = true; this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); @@ -99,10 +104,6 @@ public SoundEvent getFlopSound() { return SoundEvents.COD_FLOP; } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -115,15 +116,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerJungleShark.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerJungleShark.java index 667ca9b..72806da 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerJungleShark.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerJungleShark.java @@ -33,6 +33,7 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class TigerJungleShark extends WaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); protected int attackCooldown = 0; private int attackAnimationTick; @@ -46,6 +47,10 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 20.0D).add(Attributes.ATTACK_DAMAGE, 3.0D); } + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + @Override public void registerGoals() { super.registerGoals(); @@ -77,9 +82,9 @@ public boolean canUse() { @Override public boolean doHurtTarget(Entity entityIn) { this.attackAnimationTick = 10; - this.level().broadcastEntityEvent(this, (byte)4); + this.level().broadcastEntityEvent(this, (byte) 4); float f = this.getAttackDamage(); - float f1 = (int)f > 0 ? f / 2.0F + (float)this.random.nextInt((int)f) : f; + float f1 = (int) f > 0 ? f / 2.0F + (float) this.random.nextInt((int) f) : f; boolean flag = this.level() instanceof ServerLevel && entityIn.hurt(damageSources().mobAttack(this), f1); if (flag) { entityIn.setDeltaMovement(entityIn.getDeltaMovement().add(0.0D, 0.4D, 0.0D)); @@ -89,7 +94,7 @@ public boolean doHurtTarget(Entity entityIn) { } private float getAttackDamage() { - return (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE); + return (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); } public void tick() { @@ -146,10 +151,6 @@ public SoundEvent getFlopSound() { return SoundEvents.COD_FLOP; } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -162,15 +163,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java index 363ccb1..0d18324 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TigerPuffer.java @@ -37,28 +37,34 @@ public class TigerPuffer extends BucketableWaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public TigerPuffer(EntityType entityType, Level level) { super(entityType, level); this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); this.lookControl = new SmoothSwimmingLookControl(this, 10); } + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 20.0D).add(Attributes.ATTACK_DAMAGE, 4.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + @Override public ItemStack getBucketStack() { return new ItemStack(UFItems.TIGER_PUFFER_BUCKET.get()); } - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 20.0D).add(Attributes.ATTACK_DAMAGE, 4.0D); - } - @Override public void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 3.0D, true) { @Override protected void checkAndPerformAttack(LivingEntity target) { - if (this.mob.isWithinMeleeAttackRange(target) && this.isTimeToAttack()) { + if (this.mob.isWithinMeleeAttackRange(target) && this.isTimeToAttack()) { this.mob.swing(InteractionHand.MAIN_HAND); this.mob.doHurtTarget(target); this.mob.playSound(SoundEvents.TURTLE_EGG_CRACK, 1.0F, 1.0F); @@ -115,10 +121,6 @@ public SoundEvent getFlopSound() { return SoundEvents.COD_FLOP; } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -131,15 +133,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/Tribble.java b/src/main/java/codyhuh/unusualfishmod/common/entity/Tribble.java index 5f71c6c..15873b9 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/Tribble.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/Tribble.java @@ -39,21 +39,33 @@ public class Tribble extends BucketableWaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public Tribble(EntityType entityType, Level level) { super(entityType, level); this.moveControl = new Tribble.MoveHelperController(this); this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(1.0F); } + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D).add(Attributes.MOVEMENT_SPEED, 0.4D).add(Attributes.ARMOR, 10.0D); + } + + public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { + return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); + } + + private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { + float time = iServerWorld.getTimeOfDay(1.0F); + int light = iServerWorld.getMaxLocalRawBrightness(pos); + return light <= 4 && time > 0.27F && time <= 0.8F; + } + @Override public ItemStack getBucketStack() { return new ItemStack(UFItems.TRIBBLE_BUCKET.get()); } - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 5.0D).add(Attributes.MOVEMENT_SPEED, 0.4D).add(Attributes.ARMOR, 10.0D); - } - protected void registerGoals() { this.goalSelector.addGoal(1, new RandomStrollGoal(this, 1.0F)); this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 0.6F)); @@ -85,14 +97,23 @@ protected float getSoundVolume() { return 0.5F; } - public static boolean canSpawn(EntityType entityType, ServerLevelAccessor iServerWorld, MobSpawnType reason, BlockPos pos, RandomSource random) { - return reason == MobSpawnType.SPAWNER || iServerWorld.getBlockState(pos).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && iServerWorld.getBlockState(pos.above()).getFluidState().getFluidType() == Fluids.WATER.getFluidType() && isLightLevelOk(pos, iServerWorld); + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); } - private static boolean isLightLevelOk(BlockPos pos, ServerLevelAccessor iServerWorld) { - float time = iServerWorld.getTimeOfDay(1.0F); - int light = iServerWorld.getMaxLocalRawBrightness(pos); - return light <= 4 && time > 0.27F && time <= 0.8F; + private PlayState predicate(AnimationState event) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.WALK); + } else { + event.setAnimation(UFAnimations.IDLE); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; } static class MoveHelperController extends MoveControl { @@ -125,25 +146,4 @@ public void tick() { } } } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.WALK); - } else { - event.setAnimation(UFAnimations.IDLE); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TripleTwirlPleco.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TripleTwirlPleco.java index 809e6cf..fdb5df5 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TripleTwirlPleco.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TripleTwirlPleco.java @@ -5,16 +5,9 @@ import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -26,13 +19,11 @@ import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.phys.Vec3; import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.AnimatableManager; @@ -43,94 +34,93 @@ public class TripleTwirlPleco extends BucketableWaterAnimal implements GeoEntity { - public TripleTwirlPleco(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 8.0D).add(Attributes.ARMOR, 5.0D); - } - - protected void registerGoals() { - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - } - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - protected SoundEvent getDeathSound() { - return SoundEvents.COD_DEATH; - } - - protected SoundEvent getHurtSound(DamageSource p_28281_) { - return SoundEvents.COD_HURT; - } - - protected SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - @Override - public ItemStack getBucketStack() { - return new ItemStack(UFItems.TRIPLE_TWIRL_PLECO_BUCKET.get()); - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public TripleTwirlPleco(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 8.0D).add(Attributes.ARMOR, 5.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + protected void registerGoals() { + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(3, new BottomStrollGoal(this, 0.8F, 7)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + protected SoundEvent getDeathSound() { + return SoundEvents.COD_DEATH; + } + + protected SoundEvent getHurtSound(DamageSource p_28281_) { + return SoundEvents.COD_HURT; + } + + protected SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + @Override + public ItemStack getBucketStack() { + return new ItemStack(UFItems.TRIPLE_TWIRL_PLECO_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java b/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java index 91c7783..82a698c 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/TrumpetSquid.java @@ -1,8 +1,7 @@ package codyhuh.unusualfishmod.common.entity; -import codyhuh.unusualfishmod.common.entity.util.goal.BreedableWaterAnimalBreedGoal; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.base.BreedableWaterAnimal; +import codyhuh.unusualfishmod.common.entity.util.goal.BreedableWaterAnimalBreedGoal; import codyhuh.unusualfishmod.common.entity.util.goal.SquidLayEggsGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.common.entity.util.movement.SquidMoveControl; @@ -19,8 +18,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -import net.minecraft.tags.FluidTags; -import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -31,7 +28,6 @@ import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.control.MoveControl; import net.minecraft.world.entity.ai.control.SmoothSwimmingLookControl; import net.minecraft.world.entity.ai.control.SmoothSwimmingMoveControl; import net.minecraft.world.entity.ai.goal.*; @@ -59,228 +55,227 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class TrumpetSquid extends BreedableWaterAnimal implements Bucketable, GeoEntity { - private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(TrumpetSquid.class, EntityDataSerializers.BOOLEAN); - public float squidRotation; - - public TrumpetSquid(EntityType entityType, Level level) { - super(entityType, level); - this.moveControl = new SquidMoveControl(this); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); - this.lookControl = new SmoothSwimmingLookControl(this, 10); - } - - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 15.0D).add(Attributes.ATTACK_DAMAGE, 4.0D).add(Attributes.ARMOR, 10.0D); - } - - @Override - public void registerGoals() { - this.goalSelector.addGoal(0, new SquidLayEggsGoal(this, UFBlocks.RELUCENT_EGGS.get())); - this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); - this.goalSelector.addGoal(0, new BreedableWaterAnimalBreedGoal(this, 1.0D)); - this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 3.0D, true)); - this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { - @Override - public boolean canUse() { - return super.canUse() && isInWater(); - } - }); - this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { - @Override - public boolean canUse() { - return !this.mob.isInWater() && super.canUse(); - } - }); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AbstractFish.class, false));} - - public void aiStep() { - if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); - this.setOnGround(false); - this.hasImpulse = true; - this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); - } - - super.aiStep(); - } - - @Override - public boolean isFood(ItemStack stack) { - return stack.is(UFTags.RAW_UNUSUAL_FISH); - } - - protected PathNavigation createNavigation(Level p_27480_) { - return new WaterBoundPathNavigation(this, p_27480_); - } - - @Nullable - @Override - public BreedableWaterAnimal getBreedOffspring(ServerLevel p_146743_, BreedableWaterAnimal p_146744_) { - return null; - } - - public boolean hurt(DamageSource p_29963_, float p_29964_) { - if (super.hurt(p_29963_, p_29964_) && this.getLastHurtByMob() != null) { - if (!this.level().isClientSide) { - this.spawnInk(); - } - - return true; - } else { - return false; - } - } - - private Vec3 rotateVector(Vec3 p_29986_) { - Vec3 vec3 = p_29986_.xRot(getXRot() * ((float)Math.PI / 180F)); - return vec3.yRot(-this.yBodyRotO * ((float)Math.PI / 180F)); - } - - private void spawnInk() { - this.playSound(SoundEvents.SQUID_SQUIRT, this.getSoundVolume(), this.getVoicePitch()); - Vec3 vec3 = this.rotateVector(new Vec3(0.0D, -0.5D, -1.0D)).add(this.getX(), this.getY(), this.getZ()); - - for(int i = 0; i < 30; ++i) { - Vec3 vec31 = this.rotateVector(new Vec3((double)this.random.nextFloat() * 0.6D - 0.3D, -1.0D, (double)this.random.nextFloat() * 0.6D - 0.3D)); - Vec3 vec32 = vec31.scale(0.3D + (double)(this.random.nextFloat() * 2.0F)); - ((ServerLevel)this.level()).sendParticles(ParticleTypes.SQUID_INK, vec3.x, vec3.y + 0.5D, vec3.z, 0, vec32.x, vec32.y, vec32.z, (double)0.1F); - } - } - - public SoundEvent getAmbientSound() { - return SoundEvents.SQUID_AMBIENT; - } - - public SoundEvent getHurtSound(DamageSource damageSourceIn) { - return SoundEvents.SQUID_HURT; - } - - public SoundEvent getDeathSound() { - return SoundEvents.SQUID_DEATH; - } - - public SoundEvent getFlopSound() { - return SoundEvents.COD_FLOP; - } - - public void travel(Vec3 travelVector) { - if (this.isEffectiveAi() && this.isInWater()) { - this.moveRelative(0.01F, travelVector); - this.move(MoverType.SELF, this.getDeltaMovement()); - this.setDeltaMovement(this.getDeltaMovement().scale(0.9D)); - if (this.getTarget() == null) { - this.setDeltaMovement(this.getDeltaMovement().add(0.0D, -0.005D, 0.0D)); - } - } else { - super.travel(travelVector); - } - - } - - @OnlyIn(Dist.CLIENT) - public void handleEntityEvent(byte id) { - if (id == 19) { - this.squidRotation = 0.0F; - } else { - super.handleEntityEvent(id); - } - } - - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); - builder.define(FROM_BUCKET, false); - } - - @Override - public void addAdditionalSaveData(CompoundTag tag) { - super.addAdditionalSaveData(tag); - tag.putBoolean("FromBucket", this.isFromBucket()); - } - - @Override - public void readAdditionalSaveData(CompoundTag tag) { - super.readAdditionalSaveData(tag); - this.setFromBucket(tag.getBoolean("FromBucket")); - } - - @Override - public boolean fromBucket() { - return this.entityData.get(FROM_BUCKET); - } - - @Override - public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putFloat("Health", this.getHealth()); - }); - } - - public boolean requiresCustomPersistence() { - return super.requiresCustomPersistence() || this.fromBucket(); - } - - public boolean removeWhenFarAway(double p_213397_1_) { - return !this.fromBucket() && !this.hasCustomName(); - } - - private boolean isFromBucket() { - return this.entityData.get(FROM_BUCKET); - } - - public void setFromBucket(boolean p_203706_1_) { - this.entityData.set(FROM_BUCKET, p_203706_1_); - } - - @Override - public void loadFromBucketTag(CompoundTag p_148832_) { - } - - @Override - public SoundEvent getPickupSound() { - return SoundEvents.BUCKET_FILL_FISH; - } - - @Override - public InteractionResult mobInteract(Player p_27584_, InteractionHand p_27585_) { - return Bucketable.bucketMobPickup(p_27584_, p_27585_, this).orElse(super.mobInteract(p_27584_, p_27585_)); - } - - @Override - public ItemStack getBucketItemStack() { - return new ItemStack(UFItems.TRUMPET_SQUID_BUCKET.get()); - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { - controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); - } - - private PlayState predicate(AnimationState event) { - if (isInWater()) { - if (event.isMoving()) { - event.setAnimation(UFAnimations.SWIM); - } else { - event.setAnimation(UFAnimations.IDLE); - } - } - else { - event.setAnimation(UFAnimations.FLOP); - } - return PlayState.CONTINUE; - } - - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return cache; - } + private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(TrumpetSquid.class, EntityDataSerializers.BOOLEAN); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public float squidRotation; + + public TrumpetSquid(EntityType entityType, Level level) { + super(entityType, level); + this.moveControl = new SquidMoveControl(this); + this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + this.lookControl = new SmoothSwimmingLookControl(this, 10); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 15.0D).add(Attributes.ATTACK_DAMAGE, 4.0D).add(Attributes.ARMOR, 10.0D); + } + + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + + @Override + public void registerGoals() { + this.goalSelector.addGoal(0, new SquidLayEggsGoal(this, UFBlocks.RELUCENT_EGGS.get())); + this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); + this.goalSelector.addGoal(0, new BreedableWaterAnimalBreedGoal(this, 1.0D)); + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 3.0D, true)); + this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { + @Override + public boolean canUse() { + return super.canUse() && isInWater(); + } + }); + this.goalSelector.addGoal(2, new RandomStrollGoal(this, 0.8D, 15) { + @Override + public boolean canUse() { + return !this.mob.isInWater() && super.canUse(); + } + }); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, AbstractFish.class, false)); + } + + public void aiStep() { + if (!this.isInWater() && this.onGround() && this.verticalCollision) { + this.setDeltaMovement(this.getDeltaMovement().add(((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), 0.4F, ((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setOnGround(false); + this.hasImpulse = true; + this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); + } + + super.aiStep(); + } + + @Override + public boolean isFood(ItemStack stack) { + return stack.is(UFTags.RAW_UNUSUAL_FISH); + } + + protected PathNavigation createNavigation(Level p_27480_) { + return new WaterBoundPathNavigation(this, p_27480_); + } + + @Nullable + @Override + public BreedableWaterAnimal getBreedOffspring(ServerLevel p_146743_, BreedableWaterAnimal p_146744_) { + return null; + } + + public boolean hurt(DamageSource p_29963_, float p_29964_) { + if (super.hurt(p_29963_, p_29964_) && this.getLastHurtByMob() != null) { + if (!this.level().isClientSide) { + this.spawnInk(); + } + + return true; + } else { + return false; + } + } + + private Vec3 rotateVector(Vec3 p_29986_) { + Vec3 vec3 = p_29986_.xRot(getXRot() * ((float) Math.PI / 180F)); + return vec3.yRot(-this.yBodyRotO * ((float) Math.PI / 180F)); + } + + private void spawnInk() { + this.playSound(SoundEvents.SQUID_SQUIRT, this.getSoundVolume(), this.getVoicePitch()); + Vec3 vec3 = this.rotateVector(new Vec3(0.0D, -0.5D, -1.0D)).add(this.getX(), this.getY(), this.getZ()); + + for (int i = 0; i < 30; ++i) { + Vec3 vec31 = this.rotateVector(new Vec3((double) this.random.nextFloat() * 0.6D - 0.3D, -1.0D, (double) this.random.nextFloat() * 0.6D - 0.3D)); + Vec3 vec32 = vec31.scale(0.3D + (double) (this.random.nextFloat() * 2.0F)); + ((ServerLevel) this.level()).sendParticles(ParticleTypes.SQUID_INK, vec3.x, vec3.y + 0.5D, vec3.z, 0, vec32.x, vec32.y, vec32.z, 0.1F); + } + } + + public SoundEvent getAmbientSound() { + return SoundEvents.SQUID_AMBIENT; + } + + public SoundEvent getHurtSound(DamageSource damageSourceIn) { + return SoundEvents.SQUID_HURT; + } + + public SoundEvent getDeathSound() { + return SoundEvents.SQUID_DEATH; + } + + public SoundEvent getFlopSound() { + return SoundEvents.COD_FLOP; + } + + public void travel(Vec3 travelVector) { + if (this.isEffectiveAi() && this.isInWater()) { + this.moveRelative(0.01F, travelVector); + this.move(MoverType.SELF, this.getDeltaMovement()); + this.setDeltaMovement(this.getDeltaMovement().scale(0.9D)); + if (this.getTarget() == null) { + this.setDeltaMovement(this.getDeltaMovement().add(0.0D, -0.005D, 0.0D)); + } + } else { + super.travel(travelVector); + } + + } + + @OnlyIn(Dist.CLIENT) + public void handleEntityEvent(byte id) { + if (id == 19) { + this.squidRotation = 0.0F; + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(FROM_BUCKET, false); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putBoolean("FromBucket", this.isFromBucket()); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + this.setFromBucket(tag.getBoolean("FromBucket")); + } + + @Override + public boolean fromBucket() { + return this.entityData.get(FROM_BUCKET); + } + + @Override + public void saveToBucketTag(ItemStack bucket) { + Bucketable.saveDefaultDataToBucketTag(this, bucket); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); + } + + public boolean requiresCustomPersistence() { + return super.requiresCustomPersistence() || this.fromBucket(); + } + + public boolean removeWhenFarAway(double p_213397_1_) { + return !this.fromBucket() && !this.hasCustomName(); + } + + private boolean isFromBucket() { + return this.entityData.get(FROM_BUCKET); + } + + public void setFromBucket(boolean p_203706_1_) { + this.entityData.set(FROM_BUCKET, p_203706_1_); + } + + @Override + public void loadFromBucketTag(CompoundTag p_148832_) { + } + + @Override + public SoundEvent getPickupSound() { + return SoundEvents.BUCKET_FILL_FISH; + } + + @Override + public InteractionResult mobInteract(Player p_27584_, InteractionHand p_27585_) { + return Bucketable.bucketMobPickup(p_27584_, p_27585_, this).orElse(super.mobInteract(p_27584_, p_27585_)); + } + + @Override + public ItemStack getBucketItemStack() { + return new ItemStack(UFItems.TRUMPET_SQUID_BUCKET.get()); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); + } + + private PlayState predicate(AnimationState event) { + if (isInWater()) { + if (event.isMoving()) { + event.setAnimation(UFAnimations.SWIM); + } else { + event.setAnimation(UFAnimations.IDLE); + } + } else { + event.setAnimation(UFAnimations.FLOP); + } + return PlayState.CONTINUE; + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return cache; + } } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/VoltAngler.java b/src/main/java/codyhuh/unusualfishmod/common/entity/VoltAngler.java index 415d641..c85499b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/VoltAngler.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/VoltAngler.java @@ -2,21 +2,14 @@ import codyhuh.unusualfishmod.common.entity.util.base.BucketableWaterAnimal; import codyhuh.unusualfishmod.common.entity.util.goal.BottomStrollGoal; -import codyhuh.unusualfishmod.common.entity.util.goal.FollowSchoolLeaderGoal; import codyhuh.unusualfishmod.common.entity.util.misc.UFAnimations; import codyhuh.unusualfishmod.core.registry.UFItems; 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.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; import net.minecraft.util.TimeUtil; import net.minecraft.util.valueproviders.UniformInt; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; @@ -31,7 +24,6 @@ import net.minecraft.world.entity.ai.goal.target.ResetUniversalAngerTargetGoal; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation; -import net.minecraft.world.entity.animal.Bucketable; import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -50,6 +42,7 @@ public class VoltAngler extends BucketableWaterAnimal implements GeoEntity, NeutralMob { private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(20, 39); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private int remainingPersistentAngerTime; private UUID persistentAngerTarget; @@ -63,6 +56,10 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 16.0D).add(Attributes.ATTACK_DAMAGE, 4.0D); } + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + protected void registerGoals() { this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); this.goalSelector.addGoal(2, new RandomSwimmingGoal(this, 0.8D, 1) { @@ -121,18 +118,14 @@ public ItemStack getBucketStack() { return new ItemStack(UFItems.VOLT_ANGLER_BUCKET.get()); } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + public int getRemainingPersistentAngerTime() { + return this.remainingPersistentAngerTime; } public void setRemainingPersistentAngerTime(int p_34448_) { this.remainingPersistentAngerTime = p_34448_; } - public int getRemainingPersistentAngerTime() { - return this.remainingPersistentAngerTime; - } - @Override public void startPersistentAngerTimer() { this.setRemainingPersistentAngerTime(PERSISTENT_ANGER_TIME.sample(this.random)); @@ -159,15 +152,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/ZebraCornetfish.java b/src/main/java/codyhuh/unusualfishmod/common/entity/ZebraCornetfish.java index d3f83ce..25ba5c6 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/ZebraCornetfish.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/ZebraCornetfish.java @@ -33,6 +33,8 @@ public class ZebraCornetfish extends WaterAnimal implements GeoEntity { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public ZebraCornetfish(EntityType entityType, Level level) { super(entityType, level); this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); @@ -43,6 +45,10 @@ public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 20.0D).add(Attributes.ATTACK_DAMAGE, 2.0D); } + public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { + return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); + } + @Override public void registerGoals() { super.registerGoals(); @@ -67,7 +73,7 @@ public boolean canUse() { public void aiStep() { if (!this.isInWater() && this.onGround() && this.verticalCollision) { - this.setDeltaMovement(this.getDeltaMovement().add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F), (double)0.4F, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F))); + this.setDeltaMovement(this.getDeltaMovement().add((this.random.nextFloat() * 2.0F - 1.0F) * 0.05F, 0.4F, (this.random.nextFloat() * 2.0F - 1.0F) * 0.05F)); this.setOnGround(false); this.hasImpulse = true; this.playSound(this.getFlopSound(), this.getSoundVolume(), this.getVoicePitch()); @@ -92,10 +98,6 @@ public SoundEvent getFlopSound() { return SoundEvents.COD_FLOP; } - public static boolean canSpawn(EntityType p_223364_0_, LevelAccessor p_223364_1_, MobSpawnType reason, BlockPos p_223364_3_, RandomSource random) { - return WaterAnimal.checkSurfaceWaterAnimalSpawnRules(p_223364_0_, p_223364_1_, reason, p_223364_3_, random); - } - @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { controllerRegistrar.add(new AnimationController(this, "controller", 2, this::predicate)); @@ -108,15 +110,12 @@ private PlayState predicate(AnimationState event) { } else { event.setAnimation(UFAnimations.IDLE); } - } - else { + } else { event.setAnimation(UFAnimations.FLOP); } return PlayState.CONTINUE; } - private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); - @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return cache; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbstractMovingBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbstractMovingBlockEntity.java index 7a5f37f..ae4cb47 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbstractMovingBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbstractMovingBlockEntity.java @@ -5,8 +5,6 @@ import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -27,7 +25,6 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import javax.naming.directory.Attribute; import java.util.ArrayList; import java.util.List; @@ -42,6 +39,16 @@ public AbstractMovingBlockEntity(EntityType entityType, Level level) { super(entityType, level); } + public static CompoundTag createTagFromData(List blocks) { + CompoundTag tag = new CompoundTag(); + ListTag listTag = new ListTag(); + for (MovingBlockData data : blocks) { + listTag.add(data.toTag()); + } + tag.put("BlockData", listTag); + return tag; + } + public void onSyncedDataUpdated(EntityDataAccessor entityDataAccessor) { super.onSyncedDataUpdated(entityDataAccessor); if (BLOCK_DATA_TAG.equals(entityDataAccessor)) { @@ -127,7 +134,7 @@ public void moveEntitiesOnTop() { } float f2 = 1.0F; entity.move(MoverType.SHULKER, new Vec3((f2 * (float) this.getDeltaMovement().x), (f2 * (float) this.getDeltaMovement().y), (f2 * (float) this.getDeltaMovement().z))); - if(this.getDeltaMovement().y >= 0){ + if (this.getDeltaMovement().y >= 0) { entity.setDeltaMovement(entity.getDeltaMovement().add(0, gravity, 0)); } } @@ -135,11 +142,11 @@ public void moveEntitiesOnTop() { } protected void createBlockDropAt(BlockPos crushPos, BlockState state, CompoundTag blockData) { - if(this.level() instanceof ServerLevel serverLevel){ + if (this.level() instanceof ServerLevel serverLevel) { LootParams.Builder lootparams$builder = (new LootParams.Builder(serverLevel)).withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(crushPos)).withParameter(LootContextParams.TOOL, ItemStack.EMPTY); try { List drops = state.getDrops(lootparams$builder); - for(ItemStack drop : drops){ + for (ItemStack drop : drops) { Block.popResource(serverLevel, crushPos, drop); } state.spawnAfterBreak(serverLevel, crushPos, ItemStack.EMPTY, true); @@ -148,7 +155,6 @@ protected void createBlockDropAt(BlockPos crushPos, BlockState state, CompoundTa } } - protected Entity.MovementEmission getMovementEmission() { return Entity.MovementEmission.NONE; } @@ -188,7 +194,6 @@ private List buildDataFromTrackerTag() { return list; } - public void setPlacementCooldown(int cooldown) { placementCooldown = cooldown; } @@ -236,16 +241,6 @@ public Vec3 getLightProbePosition(float f) { return this.getPosition(f); } - public static CompoundTag createTagFromData(List blocks) { - CompoundTag tag = new CompoundTag(); - ListTag listTag = new ListTag(); - for (MovingBlockData data : blocks) { - listTag.add(data.toTag()); - } - tag.put("BlockData", listTag); - return tag; - } - @Override public boolean canBeCollidedWith() { return false; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java index 40d5f71..09ae6ba 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/AbyssalBlast.java @@ -3,15 +3,11 @@ import codyhuh.unusualfishmod.common.entity.Gnasher; import codyhuh.unusualfishmod.core.registry.UFEntities; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; -import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; -import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; @@ -25,7 +21,7 @@ import javax.annotation.Nullable; import java.util.UUID; -public class AbyssalBlast extends Entity { +public class AbyssalBlast extends Entity { private static final EntityDataAccessor FASTER_ANIM = SynchedEntityData.defineId(AbyssalBlast.class, EntityDataSerializers.BOOLEAN); private UUID ownerUUID; private int ownerNetworkId; @@ -38,25 +34,17 @@ public AbyssalBlast(EntityType p_i50162_1_, Level p_i50162_2_) { public AbyssalBlast(Level worldIn, Gnasher p_i47273_2_) { this(UFEntities.ABYSSAL_BLAST.get(), worldIn); this.setShooter(p_i47273_2_); - this.setPos(p_i47273_2_.getX() - (double)(p_i47273_2_.getBbWidth() + 1.0F) * 0.35D * (double) Mth.sin(p_i47273_2_.yBodyRot * ((float)Math.PI / 180F)), p_i47273_2_.getEyeY() + (double)0.2F, p_i47273_2_.getZ() + (double)(p_i47273_2_.getBbWidth() + 1.0F) * 0.35D * (double)Mth.cos(p_i47273_2_.yBodyRot * ((float)Math.PI / 180F))); + this.setPos(p_i47273_2_.getX() - (double) (p_i47273_2_.getBbWidth() + 1.0F) * 0.35D * (double) Mth.sin(p_i47273_2_.yBodyRot * ((float) Math.PI / 180F)), p_i47273_2_.getEyeY() + (double) 0.2F, p_i47273_2_.getZ() + (double) (p_i47273_2_.getBbWidth() + 1.0F) * 0.35D * (double) Mth.cos(p_i47273_2_.yBodyRot * ((float) Math.PI / 180F))); } public AbyssalBlast(Level worldIn, LivingEntity p_i47273_2_, boolean right) { this(UFEntities.ABYSSAL_BLAST.get(), worldIn); this.setShooter(p_i47273_2_); - float rot = p_i47273_2_.yBodyRot + (right ? 90 : -80); + float rot = p_i47273_2_.yBodyRot + (right ? 90 : -80); this.setFasterAnimation(true); this.setPos(p_i47273_2_.getX() - (double) (p_i47273_2_.getBbWidth()) * 0.5D * (double) Mth.sin(rot * ((float) Math.PI / 290F)), p_i47273_2_.getEyeY() - (double) 0.2F, p_i47273_2_.getZ() + (double) (p_i47273_2_.getBbWidth()) * 0.5D * (double) Mth.cos(rot * ((float) Math.PI / 290F))); } - public boolean isFasterAnimation() { - return this.entityData.get(FASTER_ANIM); - } - - public void setFasterAnimation(boolean anim) { - this.entityData.set(FASTER_ANIM, anim); - } - protected static float lerpRotation(float p_234614_0_, float p_234614_1_) { while (p_234614_1_ - p_234614_0_ < -180.0F) { p_234614_0_ -= 360.0F; @@ -69,9 +57,16 @@ protected static float lerpRotation(float p_234614_0_, float p_234614_1_) { return Mth.lerp(0.2F, p_234614_0_, p_234614_1_); } + public boolean isFasterAnimation() { + return this.entityData.get(FASTER_ANIM); + } + + public void setFasterAnimation(boolean anim) { + this.entityData.set(FASTER_ANIM, anim); + } public void tick() { - double yMot = Mth.sqrt((float)(this.getDeltaMovement().x * this.getDeltaMovement().x + this.getDeltaMovement().z * this.getDeltaMovement().z)); + double yMot = Mth.sqrt((float) (this.getDeltaMovement().x * this.getDeltaMovement().x + this.getDeltaMovement().z * this.getDeltaMovement().z)); this.setXRot((float) (Mth.atan2(this.getDeltaMovement().y, yMot) * (double) (180F / (float) Math.PI))); if (!this.leftOwner) { this.leftOwner = this.checkLeftOwner(); @@ -100,7 +95,7 @@ public void tick() { protected void onEntityHit(EntityHitResult p_213868_1_) { Entity entity = p_213868_1_.getEntity(); Entity entity1 = this.getOwner(); - LivingEntity livingentity = entity1 instanceof LivingEntity ? (LivingEntity)entity1 : null; + LivingEntity livingentity = entity1 instanceof LivingEntity ? (LivingEntity) entity1 : null; entity.hurt(damageSources().mobProjectile(this, livingentity), 5.0F); } @@ -110,7 +105,7 @@ protected void onHitBlock(BlockHitResult p_230299_1_) { this.remove(RemovalReason.DISCARDED); } } - + @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { builder.define(FASTER_ANIM, false); @@ -192,7 +187,7 @@ protected void onImpact(HitResult result) { public void lerpMotion(double x, double y, double z) { this.setDeltaMovement(x, y, z); if (this.xRotO == 0.0F && this.yRotO == 0.0F) { - float f = Mth.sqrt((float)(x * x + z * z)); + float f = Mth.sqrt((float) (x * x + z * z)); this.setXRot((float) (Mth.atan2(y, f) * (double) (180F / (float) Math.PI))); this.setYRot((float) (Mth.atan2(x, z) * (double) (180F / (float) Math.PI))); this.xRotO = this.getXRot(); @@ -213,7 +208,7 @@ protected boolean canHitEntity(Entity p_230298_1_) { protected void updateRotation() { Vec3 vector3d = this.getDeltaMovement(); - float f = Mth.sqrt((float)horizontalMag(vector3d)); + float f = Mth.sqrt((float) horizontalMag(vector3d)); this.setXRot(lerpRotation(this.xRotO, (float) (Mth.atan2(vector3d.y, f) * (double) (180F / (float) Math.PI)))); this.setYRot(lerpRotation(this.yRotO, (float) (Mth.atan2(vector3d.x, vector3d.z) * (double) (180F / (float) Math.PI)))); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java index be8c738..d199095 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/FallingTreeBlockEntity.java @@ -1,7 +1,6 @@ package codyhuh.unusualfishmod.common.entity.item; import codyhuh.unusualfishmod.common.entity.util.misc.MovingBlockData; -import codyhuh.unusualfishmod.core.registry.UFEntities; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -24,7 +23,7 @@ public class FallingTreeBlockEntity extends AbstractMovingBlockEntity { public FallingTreeBlockEntity(EntityType entityType, Level level) { super(entityType, level); } - + @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); @@ -94,14 +93,14 @@ protected float getFallProgress() { return this.entityData.get(FALL_PROGRESS); } - public float getFallProgress(float partialTick) { - return prevFallProgress + (getFallProgress() - prevFallProgress) * partialTick; - } - public void setFallProgress(float f) { this.entityData.set(FALL_PROGRESS, f); } + public float getFallProgress(float partialTick) { + return prevFallProgress + (getFallProgress() - prevFallProgress) * partialTick; + } + public boolean canBePlaced() { return false; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java index 7dbe23f..cb9138d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/ThrownPrismarineSpear.java @@ -56,7 +56,7 @@ public void tick() { } protected ItemStack getPickupItem() { - if (this.spearItem == null) { + if (this.spearItem == null) { return new ItemStack(UFItems.PRISMARINE_SPEAR.get()); } return this.spearItem.copy(); diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BreedableWaterAnimal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BreedableWaterAnimal.java index 0cb726a..c3b2550 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BreedableWaterAnimal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BreedableWaterAnimal.java @@ -40,6 +40,10 @@ protected BreedableWaterAnimal(EntityType p_146738_, Leve super(p_146738_, p_146739_); } + public static int getSpeedUpSecondsWhenFeeding(int p_216968_) { + return (int) ((float) (p_216968_ / 20) * 0.1F); + } + public boolean isGravid() { return this.entityData.get(DATA_GRAVID); } @@ -66,6 +70,16 @@ public int getAge() { } } + public void setAge(int p_146763_) { + int i = this.getAge(); + this.age = p_146763_; + if (i < 0 && p_146763_ >= 0 || i >= 0 && p_146763_ < 0) { + this.entityData.set(DATA_BABY_ID, p_146763_ < 0); + this.ageBoundaryReached(); + } + + } + public void ageUp(int p_146741_, boolean p_146742_) { int i = this.getAge(); i += p_146741_ * 20; @@ -73,7 +87,7 @@ public void ageUp(int p_146741_, boolean p_146742_) { i = 0; } - int j = i - i; + int j = 0; this.setAge(i); if (p_146742_) { this.forcedAge += j; @@ -92,16 +106,6 @@ public void ageUp(int p_146759_) { this.ageUp(p_146759_, false); } - public void setAge(int p_146763_) { - int i = this.getAge(); - this.age = p_146763_; - if (i < 0 && p_146763_ >= 0 || i >= 0 && p_146763_ < 0) { - this.entityData.set(DATA_BABY_ID, p_146763_ < 0); - this.ageBoundaryReached(); - } - - } - protected void customServerAiStep() { if (this.getAge() != 0) { this.inLove = 0; @@ -195,13 +199,9 @@ public void setBaby(boolean p_146756_) { this.setAge(p_146756_ ? -24000 : 0); } - public static int getSpeedUpSecondsWhenFeeding(int p_216968_) { - return (int)((float)(p_216968_ / 20) * 0.1F); - } - public void handleEntityEvent(byte p_27562_) { if (p_27562_ == 18) { - for(int i = 0; i < 7; ++i) { + for (int i = 0; i < 7; ++i) { double d0 = this.random.nextGaussian() * 0.02D; double d1 = this.random.nextGaussian() * 0.02D; double d2 = this.random.nextGaussian() * 0.02D; @@ -224,22 +224,13 @@ public boolean canFallInLove() { return this.inLove <= 0; } - public void setInLove(@Nullable Player p_27596_) { - this.inLove = 600; - if (p_27596_ != null) { - this.loveCause = p_27596_.getUUID(); - } - - this.level().broadcastEntityEvent(this, (byte)18); - } - @Nullable public ServerPlayer getLoveCause() { if (this.loveCause == null) { return null; } else { Player player = this.level().getPlayerByUUID(this.loveCause); - return player instanceof ServerPlayer ? (ServerPlayer)player : null; + return player instanceof ServerPlayer ? (ServerPlayer) player : null; } } @@ -287,6 +278,15 @@ public boolean isInLove() { return this.inLove > 0; } + public void setInLove(@Nullable Player p_27596_) { + this.inLove = 600; + if (p_27596_ != null) { + this.loveCause = p_27596_.getUUID(); + } + + this.level().broadcastEntityEvent(this, (byte) 18); + } + public void resetLove() { this.inLove = 0; } @@ -332,7 +332,7 @@ public void spawnChildFromBreeding(ServerLevel p_27564_, BreedableWaterAnimal an ageable.setBaby(true); ageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); p_27564_.addFreshEntityWithPassengers(ageable); - p_27564_.broadcastEntityEvent(this, (byte)18); + p_27564_.broadcastEntityEvent(this, (byte) 18); if (p_27564_.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { p_27564_.addFreshEntity(new ExperienceOrb(p_27564_, this.getX(), this.getY(), this.getZ(), this.getRandom().nextInt(7) + 1)); } @@ -341,9 +341,9 @@ public void spawnChildFromBreeding(ServerLevel p_27564_, BreedableWaterAnimal an } public static class AgeableWaterAnimalGroupData implements SpawnGroupData { - private int groupSize; private final boolean shouldSpawnBaby; private final float babySpawnChance; + private int groupSize; private AgeableWaterAnimalGroupData(boolean p_146775_, float p_146776_) { this.shouldSpawnBaby = p_146775_; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableSchoolingWaterAnimal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableSchoolingWaterAnimal.java index 9d1c972..6ff9c0c 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableSchoolingWaterAnimal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableSchoolingWaterAnimal.java @@ -111,8 +111,7 @@ public void addFollowers(Stream p_2753 if (this.getVariantN() == p_27536_.getVariantN()) { p_27536_.startFollowing(this); } - } - else { + } else { p_27536_.startFollowing(this); } }); @@ -124,7 +123,7 @@ public SpawnGroupData finalizeSpawn(ServerLevelAccessor p_27528_, DifficultyInst if (p_27531_ == null) { p_27531_ = new BucketableSchoolingWaterAnimal.SchoolSpawnGroupData(this); } else { - this.startFollowing(((BucketableSchoolingWaterAnimal.SchoolSpawnGroupData)p_27531_).leader); + this.startFollowing(((BucketableSchoolingWaterAnimal.SchoolSpawnGroupData) p_27531_).leader); } return p_27531_; diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableWaterAnimal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableWaterAnimal.java index d225dd2..632869b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableWaterAnimal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/base/BucketableWaterAnimal.java @@ -47,13 +47,13 @@ public boolean fromBucket() { @Override public void saveToBucketTag(ItemStack bucket) { - Bucketable.saveDefaultDataToBucketTag(this, bucket); - if (this.hasCustomName()) { - bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); - } - CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { - tag.putFloat("Health", this.getHealth()); - }); + Bucketable.saveDefaultDataToBucketTag(this, bucket); + if (this.hasCustomName()) { + bucket.set(DataComponents.CUSTOM_NAME, this.getCustomName()); + } + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, bucket, (tag) -> { + tag.putFloat("Health", this.getHealth()); + }); } public boolean requiresCustomPersistence() { diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BottomStrollGoal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BottomStrollGoal.java index c7e1e76..52c3ef1 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BottomStrollGoal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BottomStrollGoal.java @@ -25,8 +25,8 @@ protected Vec3 getPosition() { } int yDrop = 1 + this.mob.getRandom().nextInt(3); - if(vec != null){ - BlockPos pos = new BlockPos(new Vec3i((int)vec.x, (int)vec.y, (int)vec.z)); + if (vec != null) { + BlockPos pos = new BlockPos(new Vec3i((int) vec.x, (int) vec.y, (int) vec.z)); while (this.mob.level().getFluidState(pos).is(FluidTags.WATER) && this.mob.level().getBlockState(pos).isPathfindable(PathComputationType.WATER) && pos.getY() > this.mob.level().getMinBuildHeight()) { pos = pos.below(); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BreedableWaterAnimalBreedGoal.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BreedableWaterAnimalBreedGoal.java index 2269676..9fcf547 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BreedableWaterAnimalBreedGoal.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/goal/BreedableWaterAnimalBreedGoal.java @@ -13,12 +13,12 @@ public class BreedableWaterAnimalBreedGoal extends Goal { private static final TargetingConditions PARTNER_TARGETING = TargetingConditions.forNonCombat().range(8.0D).ignoreLineOfSight(); protected final BreedableWaterAnimal animal; - private final Class partnerClass; protected final Level level; + private final Class partnerClass; + private final double speedModifier; @Nullable protected BreedableWaterAnimal partner; private int loveTime; - private final double speedModifier; public BreedableWaterAnimalBreedGoal(BreedableWaterAnimal p_25122_, double p_25123_) { this(p_25122_, p_25123_, p_25122_.getClass()); @@ -51,7 +51,7 @@ public void stop() { } public void tick() { - this.animal.getLookControl().setLookAt(this.partner, 10.0F, (float)this.animal.getMaxHeadXRot()); + this.animal.getLookControl().setLookAt(this.partner, 10.0F, (float) this.animal.getMaxHeadXRot()); this.animal.getNavigation().moveTo(this.partner, this.speedModifier); ++this.loveTime; if (this.loveTime >= this.adjustedTickDelay(60) && this.animal.distanceToSqr(this.partner) < 9.0D) { @@ -66,7 +66,7 @@ private BreedableWaterAnimal getFreePartner() { double d0 = Double.MAX_VALUE; BreedableWaterAnimal animal = null; - for(BreedableWaterAnimal animal1 : list) { + for (BreedableWaterAnimal animal1 : list) { if (this.animal.canMate(animal1) && this.animal.distanceToSqr(animal1) < d0) { animal = animal1; d0 = this.animal.distanceToSqr(animal1); @@ -77,6 +77,6 @@ private BreedableWaterAnimal getFreePartner() { } protected void breed() { - this.animal.spawnChildFromBreeding((ServerLevel)this.level, this.partner); + this.animal.spawnChildFromBreeding((ServerLevel) this.level, this.partner); } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/MovingBlockData.java b/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/MovingBlockData.java index bfb5c77..094e382 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/MovingBlockData.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/util/misc/MovingBlockData.java @@ -17,11 +17,11 @@ // Adapted from Alex's Caves (licensed under GNU GPLv3) public class MovingBlockData { + @Nullable + public CompoundTag blockData; private BlockState state; private VoxelShape shape; private BlockPos offset; - @Nullable - public CompoundTag blockData; public MovingBlockData(BlockState state, VoxelShape shape, BlockPos offset, @Nullable CompoundTag blockData) { this.state = state; @@ -31,7 +31,20 @@ public MovingBlockData(BlockState state, VoxelShape shape, BlockPos offset, @Nul } public MovingBlockData(Level level, CompoundTag tag) { - this(NbtUtils.readBlockState(level.registryAccess().lookupOrThrow(Registries.BLOCK),tag.getCompound("BlockState")), getShapeFromTag(tag.getCompound("VoxelShape")), new BlockPos(tag.getInt("OffsetX"), tag.getInt("OffsetY"), tag.getInt("OffsetZ")), tag.contains("BlockData") ? tag.getCompound("BlockData") : null); + this(NbtUtils.readBlockState(level.registryAccess().lookupOrThrow(Registries.BLOCK), tag.getCompound("BlockState")), getShapeFromTag(tag.getCompound("VoxelShape")), new BlockPos(tag.getInt("OffsetX"), tag.getInt("OffsetY"), tag.getInt("OffsetZ")), tag.contains("BlockData") ? tag.getCompound("BlockData") : null); + } + + private static VoxelShape getShapeFromTag(CompoundTag data) { + VoxelShape shape = Shapes.empty(); + if (data.contains("AABBs")) { + ListTag listtag = data.getList("AABBs", 10); + for (int i = 0; i < listtag.size(); ++i) { + CompoundTag innerTag = listtag.getCompound(i); + AABB aabb = new AABB(innerTag.getDouble("BoxMinX"), innerTag.getDouble("BoxMinY"), innerTag.getDouble("BoxMinZ"), innerTag.getDouble("BoxMaxX"), innerTag.getDouble("BoxMaxY"), innerTag.getDouble("BoxMaxZ")); + shape = Shapes.join(shape, Shapes.create(aabb), BooleanOp.OR); + } + } + return shape; } public BlockState getState() { @@ -97,17 +110,4 @@ private CompoundTag getShapeTag() { return data; } - private static VoxelShape getShapeFromTag(CompoundTag data) { - VoxelShape shape = Shapes.empty(); - if (data.contains("AABBs")) { - ListTag listtag = data.getList("AABBs", 10); - for (int i = 0; i < listtag.size(); ++i) { - CompoundTag innerTag = listtag.getCompound(i); - AABB aabb = new AABB(innerTag.getDouble("BoxMinX"), innerTag.getDouble("BoxMinY"), innerTag.getDouble("BoxMinZ"), innerTag.getDouble("BoxMaxX"), innerTag.getDouble("BoxMaxY"), innerTag.getDouble("BoxMaxZ")); - shape = Shapes.join(shape, Shapes.create(aabb), BooleanOp.OR); - } - } - return shape; - } - } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/DepthScytheItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/DepthScytheItem.java index 354714a..3b43810 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/DepthScytheItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/DepthScytheItem.java @@ -1,7 +1,6 @@ package codyhuh.unusualfishmod.common.item; import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; @@ -9,24 +8,21 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.Tier; -import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import java.util.Optional; - public class DepthScytheItem extends SwordItem { public DepthScytheItem(Tier tier, Properties properties) { super(tier, properties); } + public float getDestroySpeed(ItemStack stack, BlockState state) { if (state.is(Blocks.COBWEB)) { return 15.0F; - } - else { + } else { return super.getDestroySpeed(stack, state); } } @@ -55,7 +51,7 @@ public void fillItemCategory(CreativeModeTab tab, NonNullList list) { @Override public void onCraftedBy(ItemStack stack, Level level, Player player) { - level.holderLookup(Registries.ENCHANTMENT).get(Enchantments.SWEEPING_EDGE) .ifPresent(enchant -> stack.enchant(enchant, 5)); + level.holderLookup(Registries.ENCHANTMENT).get(Enchantments.SWEEPING_EDGE).ifPresent(enchant -> stack.enchant(enchant, 5)); super.onCraftedBy(stack, level, player); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java index b52fea6..67359b0 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/PrismarineSpearItem.java @@ -1,13 +1,10 @@ package codyhuh.unusualfishmod.common.item; import codyhuh.unusualfishmod.common.entity.item.ThrownPrismarineSpear; -import codyhuh.unusualfishmod.core.registry.UFEntities; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.Position; -import net.minecraft.core.component.DataComponents; -import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -24,7 +21,10 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.item.*; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ProjectileItem; +import net.minecraft.world.item.UseAnim; import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.item.component.Tool; import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; @@ -37,8 +37,6 @@ import java.util.List; -import static codyhuh.unusualfishmod.UnusualFishMod.loc; - public class PrismarineSpearItem extends Item implements ProjectileItem { public static final int THROW_THRESHOLD_TIME = 10; public static final float BASE_DAMAGE = 8.0F; @@ -49,13 +47,17 @@ public PrismarineSpearItem(Item.Properties properties) { } public static ItemAttributeModifiers createAttributes() { - return ItemAttributeModifiers.builder().add(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_ID, (double)8.0F, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).add(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_ID, (double)-2.9F, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).build(); + return ItemAttributeModifiers.builder().add(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_ID, 8.0F, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).add(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_ID, -2.9F, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND).build(); } public static Tool createToolProperties() { return new Tool(List.of(), 1.0F, 2); } + private static boolean isTooDamagedToUse(ItemStack stack) { + return stack.getDamageValue() >= stack.getMaxDamage() - 1; + } + public boolean canAttackBlock(BlockState state, Level level, BlockPos pos, Player player) { return !player.isCreative(); } @@ -74,7 +76,7 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity entityLiving if (i >= 10) { float f = EnchantmentHelper.getTridentSpinAttackStrength(stack, player); if ((!(f > 0.0F) || player.isInWaterOrRain()) && !isTooDamagedToUse(stack)) { - Holder holder = (Holder)EnchantmentHelper.pickHighestLevel(stack, EnchantmentEffectComponents.TRIDENT_SOUND).orElse(SoundEvents.TRIDENT_THROW); + Holder holder = EnchantmentHelper.pickHighestLevel(stack, EnchantmentEffectComponents.TRIDENT_SOUND).orElse(SoundEvents.TRIDENT_THROW); if (!level.isClientSide) { stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(entityLiving.getUsedItemHand())); if (f == 0.0F) { @@ -85,7 +87,7 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity entityLiving } level.addFreshEntity(thrownSpear); - level.playSound((Player)null, thrownSpear, (SoundEvent)holder.value(), SoundSource.PLAYERS, 1.0F, 1.0F); + level.playSound(null, thrownSpear, holder.value(), SoundSource.PLAYERS, 1.0F, 1.0F); if (!player.hasInfiniteMaterials()) { player.getInventory().removeItem(stack); } @@ -96,21 +98,21 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity entityLiving if (f > 0.0F) { float f7 = player.getYRot(); float f1 = player.getXRot(); - float f2 = -Mth.sin(f7 * ((float)Math.PI / 180F)) * Mth.cos(f1 * ((float)Math.PI / 180F)); - float f3 = -Mth.sin(f1 * ((float)Math.PI / 180F)); - float f4 = Mth.cos(f7 * ((float)Math.PI / 180F)) * Mth.cos(f1 * ((float)Math.PI / 180F)); + float f2 = -Mth.sin(f7 * ((float) Math.PI / 180F)) * Mth.cos(f1 * ((float) Math.PI / 180F)); + float f3 = -Mth.sin(f1 * ((float) Math.PI / 180F)); + float f4 = Mth.cos(f7 * ((float) Math.PI / 180F)) * Mth.cos(f1 * ((float) Math.PI / 180F)); float f5 = Mth.sqrt(f2 * f2 + f3 * f3 + f4 * f4); f2 *= f / f5; f3 *= f / f5; f4 *= f / f5; - player.push((double)f2, (double)f3, (double)f4); + player.push(f2, f3, f4); player.startAutoSpinAttack(20, 8.0F, stack); if (player.onGround()) { float f6 = 1.1999999F; - player.move(MoverType.SELF, new Vec3((double)0.0F, (double)1.1999999F, (double)0.0F)); + player.move(MoverType.SELF, new Vec3(0.0F, 1.1999999F, 0.0F)); } - level.playSound((Player)null, player, (SoundEvent)holder.value(), SoundSource.PLAYERS, 1.0F, 1.0F); + level.playSound(null, player, holder.value(), SoundSource.PLAYERS, 1.0F, 1.0F); } } } @@ -130,10 +132,6 @@ public InteractionResultHolder use(Level level, Player player, Intera } } - private static boolean isTooDamagedToUse(ItemStack stack) { - return stack.getDamageValue() >= stack.getMaxDamage() - 1; - } - public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { return true; } diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java index 73b5bbb..b1ced4b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/RipsawItem.java @@ -19,11 +19,11 @@ import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.item.*; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; @@ -32,7 +32,6 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -44,6 +43,14 @@ public RipsawItem(Properties properties) { super(UFTiers.RIPPER_SAW, properties); } + public static EntityHitResult getLookAtEntity(Player player, Level level, double range) { + Vec3 eyePos = player.getEyePosition(1.0F); + Vec3 viewVec = player.getViewVector(1.0F); + Vec3 endVec = eyePos.add(viewVec.x * range, viewVec.y * range, viewVec.z * range); + + return ProjectileUtil.getEntityHitResult(level, player, eyePos, endVec, player.getBoundingBox().inflate(range), e -> e instanceof LivingEntity); + } + @Override public UseAnim getUseAnimation(ItemStack p_41452_) { return UseAnim.BRUSH; @@ -187,12 +194,4 @@ public int getUseDuration(ItemStack stack, LivingEntity entity) { return 72000; } - public static EntityHitResult getLookAtEntity(Player player, Level level, double range) { - Vec3 eyePos = player.getEyePosition(1.0F); - Vec3 viewVec = player.getViewVector(1.0F); - Vec3 endVec = eyePos.add(viewVec.x * range, viewVec.y * range, viewVec.z * range); - - return ProjectileUtil.getEntityHitResult(level, player, eyePos, endVec, player.getBoundingBox().inflate(range), e -> e instanceof LivingEntity); - } - } diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/StargazerItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/StargazerItem.java index ccb6e90..01b479b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/StargazerItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/StargazerItem.java @@ -26,9 +26,9 @@ public InteractionResultHolder use(Level level, Player player, Intera */ var time = level.getDayTime() % 24000; // Correct - var i = Mth.frac((double)time / 24000.0D - 0.25D); // + var i = Mth.frac((double) time / 24000.0D - 0.25D); // var i1 = 0.5D - Math.cos(i * Math.PI) / 2.0D; - var i2 = (float)(i * 2.0D + i1) / 3.0F; + var i2 = (float) (i * 2.0D + i1) / 3.0F; System.out.println("time of day: " + level.getTimeOfDay(1.0F)); diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/UFFishBucketItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/UFFishBucketItem.java index 9142ded..4c4012b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/UFFishBucketItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/UFFishBucketItem.java @@ -10,7 +10,7 @@ public class UFFishBucketItem extends MobBucketItem { - public UFFishBucketItem(Supplier> entityType, Supplier fluid, Item item, boolean hasTooltip, Properties builder) { - super(entityType.get(), fluid.get(), SoundEvents.BUCKET_EMPTY_FISH, builder); - } + public UFFishBucketItem(Supplier> entityType, Supplier fluid, Item item, boolean hasTooltip, Properties builder) { + super(entityType.get(), fluid.get(), SoundEvents.BUCKET_EMPTY_FISH, builder); + } } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/item/WeatherShellItem.java b/src/main/java/codyhuh/unusualfishmod/common/item/WeatherShellItem.java index 5e99660..45bd93f 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/item/WeatherShellItem.java +++ b/src/main/java/codyhuh/unusualfishmod/common/item/WeatherShellItem.java @@ -30,12 +30,10 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity holder, int if (weather.equals("thunder") && !level.getLevelData().isThundering()) { sl.setWeatherParameters(0, 1200, true, true); stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND); - } - else if (weather.equals("rain") && !level.getLevelData().isRaining()) { + } else if (weather.equals("rain") && !level.getLevelData().isRaining()) { sl.setWeatherParameters(0, 1200, true, false); stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND); - } - else if (weather.equals("clear") && (level.getLevelData().isRaining() || level.getLevelData().isThundering())) { + } else if (weather.equals("clear") && (level.getLevelData().isRaining() || level.getLevelData().isThundering())) { sl.setWeatherParameters(36000, 0, false, false); stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND); } diff --git a/src/main/java/codyhuh/unusualfishmod/common/loot/BuriedTreasureLootModifier.java b/src/main/java/codyhuh/unusualfishmod/common/loot/BuriedTreasureLootModifier.java index f32d8d7..7affe4d 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/loot/BuriedTreasureLootModifier.java +++ b/src/main/java/codyhuh/unusualfishmod/common/loot/BuriedTreasureLootModifier.java @@ -1,23 +1,21 @@ package codyhuh.unusualfishmod.common.loot; import codyhuh.unusualfishmod.core.registry.UFItems; -import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.neoforged.neoforge.common.loot.IGlobalLootModifier; import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; -import java.util.function.Supplier; - // some code that could be consolidated between these two loot mods...oh well, im lazy! public class BuriedTreasureLootModifier extends LootModifier { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, BuriedTreasureLootModifier::new)); + public BuriedTreasureLootModifier(LootItemCondition[] condition) { super(condition); } @@ -25,13 +23,11 @@ public BuriedTreasureLootModifier(LootItemCondition[] condition) { @Override protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { if (context.getRandom().nextFloat() > 0.7F) { - generatedLoot.add(new ItemStack(UFItems.MUSIC_DISC_SEAFOAM.get())); + generatedLoot.add(new ItemStack(UFItems.MUSIC_DISC_SEAFOAM.get())); } return generatedLoot; } - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, BuriedTreasureLootModifier::new)); - @Override public MapCodec codec() { return CODEC; diff --git a/src/main/java/codyhuh/unusualfishmod/common/loot/UnderwaterRuinsLootModifier.java b/src/main/java/codyhuh/unusualfishmod/common/loot/UnderwaterRuinsLootModifier.java index f0ebe7b..fd434e0 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/loot/UnderwaterRuinsLootModifier.java +++ b/src/main/java/codyhuh/unusualfishmod/common/loot/UnderwaterRuinsLootModifier.java @@ -1,7 +1,6 @@ package codyhuh.unusualfishmod.common.loot; import codyhuh.unusualfishmod.core.registry.UFItems; -import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -12,10 +11,10 @@ import net.neoforged.neoforge.common.loot.LootModifier; import org.jetbrains.annotations.NotNull; -import java.util.function.Supplier; - public class UnderwaterRuinsLootModifier extends LootModifier { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, UnderwaterRuinsLootModifier::new)); + public UnderwaterRuinsLootModifier(LootItemCondition[] condition) { super(condition); } @@ -28,8 +27,6 @@ public UnderwaterRuinsLootModifier(LootItemCondition[] condition) { return generatedLoot; } - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> codecStart(inst).apply(inst, UnderwaterRuinsLootModifier::new)); - @Override public MapCodec codec() { return CODEC; diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlocks.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlocks.java index 9288855..9593b41 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlocks.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFBlocks.java @@ -18,31 +18,31 @@ public final class UFBlocks { public static final DeferredBlock VOLT_DETECTOR = registerBlock("volt_detector", () -> new VoltDetectorBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_BLOCK).sound(SoundType.METAL).randomTicks().lightLevel(state -> 10))); - public static final DeferredBlock NAUTICAL_LAMP = registerBlock("nautical_lamp", () -> new NauticalLampBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LANTERN))); - public static final DeferredBlock SEA_BOOM = registerBlock("sea_boom", () -> new SeaBoomBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.PRISMARINE).sound(SoundType.METAL).randomTicks())); - public static final DeferredBlock CRIMSON_EGGS = registerBlock("crimson_eggs", () -> new SquidEggsBlock(UFEntities.CRIMSONSHELL_SQUID::get, BlockBehaviour.Properties.ofFullCopy(Blocks.FROGSPAWN))); - public static final DeferredBlock RELUCENT_EGGS = registerBlock("relucent_eggs", () -> new SquidEggsBlock(UFEntities.TRUMPET_SQUID::get, BlockBehaviour.Properties.ofFullCopy(Blocks.FROGSPAWN))); - public static final DeferredBlock COPPER_ANTENNA = registerBlock("copper_antenna", () -> new CopperAntennaBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHTNING_ROD))); - - public static final DeferredBlock CHISELED_CRIMSON_BRICKS = registerBlock("chiseled_crimson_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock CRIMSON_BRICKS = registerBlock("crimson_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock CRIMSON_BRICK_STAIRS = registerBlock("crimson_brick_stairs", () -> new StairBlock(UFBlocks.CRIMSON_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock CRIMSON_BRICK_SLAB = registerBlock("crimson_brick_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock CRIMSON_BRICK_WALL = registerBlock("crimson_brick_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock CRIMSON_TILES = registerBlock("crimson_tiles", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock CRIMSON_TILE_STAIRS = registerBlock("crimson_tile_stairs", () -> new StairBlock(UFBlocks.CRIMSON_TILES.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock CRIMSON_TILE_SLAB = registerBlock("crimson_tile_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock CRIMSON_TILE_WALL = registerBlock("crimson_tile_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - - public static final DeferredBlock CHISELED_RELUCENT_BRICKS = registerBlock("chiseled_relucent_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock RELUCENT_BRICKS = registerBlock("relucent_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock RELUCENT_BRICK_STAIRS = registerBlock("relucent_brick_stairs", () -> new StairBlock(UFBlocks.RELUCENT_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock RELUCENT_BRICK_SLAB = registerBlock("relucent_brick_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock RELUCENT_BRICK_WALL = registerBlock("relucent_brick_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock RELUCENT_TILES = registerBlock("relucent_tiles", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock RELUCENT_TILE_STAIRS = registerBlock("relucent_tile_stairs", () -> new StairBlock(UFBlocks.RELUCENT_TILES.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock RELUCENT_TILE_SLAB = registerBlock("relucent_tile_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); - public static final DeferredBlock RELUCENT_TILE_WALL = registerBlock("relucent_tile_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock NAUTICAL_LAMP = registerBlock("nautical_lamp", () -> new NauticalLampBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LANTERN))); + public static final DeferredBlock SEA_BOOM = registerBlock("sea_boom", () -> new SeaBoomBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.PRISMARINE).sound(SoundType.METAL).randomTicks())); + public static final DeferredBlock CRIMSON_EGGS = registerBlock("crimson_eggs", () -> new SquidEggsBlock(UFEntities.CRIMSONSHELL_SQUID::get, BlockBehaviour.Properties.ofFullCopy(Blocks.FROGSPAWN))); + public static final DeferredBlock RELUCENT_EGGS = registerBlock("relucent_eggs", () -> new SquidEggsBlock(UFEntities.TRUMPET_SQUID::get, BlockBehaviour.Properties.ofFullCopy(Blocks.FROGSPAWN))); + public static final DeferredBlock COPPER_ANTENNA = registerBlock("copper_antenna", () -> new CopperAntennaBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHTNING_ROD))); + + public static final DeferredBlock CHISELED_CRIMSON_BRICKS = registerBlock("chiseled_crimson_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_BRICKS = registerBlock("crimson_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_BRICK_STAIRS = registerBlock("crimson_brick_stairs", () -> new StairBlock(UFBlocks.CRIMSON_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_BRICK_SLAB = registerBlock("crimson_brick_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_BRICK_WALL = registerBlock("crimson_brick_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_TILES = registerBlock("crimson_tiles", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_TILE_STAIRS = registerBlock("crimson_tile_stairs", () -> new StairBlock(UFBlocks.CRIMSON_TILES.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_TILE_SLAB = registerBlock("crimson_tile_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock CRIMSON_TILE_WALL = registerBlock("crimson_tile_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + + public static final DeferredBlock CHISELED_RELUCENT_BRICKS = registerBlock("chiseled_relucent_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_BRICKS = registerBlock("relucent_bricks", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_BRICK_STAIRS = registerBlock("relucent_brick_stairs", () -> new StairBlock(UFBlocks.RELUCENT_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_BRICK_SLAB = registerBlock("relucent_brick_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_BRICK_WALL = registerBlock("relucent_brick_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_TILES = registerBlock("relucent_tiles", () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_TILE_STAIRS = registerBlock("relucent_tile_stairs", () -> new StairBlock(UFBlocks.RELUCENT_TILES.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_TILE_SLAB = registerBlock("relucent_tile_slab", () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); + public static final DeferredBlock RELUCENT_TILE_WALL = registerBlock("relucent_tile_wall", () -> new WallBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_BRICKS))); private static DeferredBlock registerBlock(String name, Supplier block) { DeferredBlock toReturn = BLOCKS.register(name, block); diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java index 931a2cb..8fb2bc2 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFEntities.java @@ -13,69 +13,69 @@ import net.neoforged.neoforge.registries.DeferredRegister; public class UFEntities { - public static final DeferredRegister> ENTITIES = DeferredRegister.create(BuiltInRegistries.ENTITY_TYPE, UnusualFishMod.MOD_ID); + public static final DeferredRegister> ENTITIES = DeferredRegister.create(BuiltInRegistries.ENTITY_TYPE, UnusualFishMod.MOD_ID); - // Living - public static final DeferredHolder, EntityType> DUALITY_DAMSELFISH = ENTITIES.register("duality_damselfish", () -> EntityType.Builder.of(DualityDamselfish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.5f).build("duality_damselfish")); - public static final DeferredHolder, EntityType> MOSSTHORN = ENTITIES.register("mossthorn", () -> EntityType.Builder.of(Mossthorn::new, MobCategory.UNDERGROUND_WATER_CREATURE).sized(0.8f, 1.0f).build("mossthorn")); - public static final DeferredHolder, EntityType> RIPPER = ENTITIES.register("ripper", () -> EntityType.Builder.of(Ripper::new, MobCategory.WATER_CREATURE).sized(0.9f, 0.6f).build("ripper")); - public static final DeferredHolder, EntityType> SPINDLEFISH = ENTITIES.register("spindlefish", () -> EntityType.Builder.of(Spindlefish::new, MobCategory.WATER_AMBIENT).sized(0.6f, 0.7f).build("spindlefish")); - public static final DeferredHolder, EntityType> RHINO_TETRA = ENTITIES.register("rhino_tetra", () -> EntityType.Builder.of(RhinoTetra::new, MobCategory.WATER_AMBIENT).sized(1.0f, 0.8f).build("rhino_tetra")); - public static final DeferredHolder, EntityType> DROOPING_GOURAMI = ENTITIES.register("drooping_gourami", () -> EntityType.Builder.of(DroopingGourami::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("drooping_gourami")); - public static final DeferredHolder, EntityType> SAILOR_BARB = ENTITIES.register("sailor_barb", () -> EntityType.Builder.of(SailorBarb::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("sailor_barb")); - public static final DeferredHolder, EntityType> SEA_SPIDER = ENTITIES.register("sea_spider", () -> EntityType.Builder.of(SeaSpider::new, MobCategory.WATER_AMBIENT).sized(0.9f, 0.9f).build("sea_spider")); - public static final DeferredHolder, EntityType> TRIPLE_TWIRL_PLECO = ENTITIES.register("triple_twirl_pleco", () -> EntityType.Builder.of(TripleTwirlPleco::new, MobCategory.WATER_AMBIENT).sized(0.75f, 0.45f).build("triple_twirl_pleco")); - public static final DeferredHolder, EntityType> AERO_MONO = ENTITIES.register("aero_mono", () -> EntityType.Builder.of(AeroMono::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.5f).build("aero_mono")); - public static final DeferredHolder, EntityType> CLOWNTHORN_SHARK = ENTITIES.register("clownthorn_shark", () -> EntityType.Builder.of(ClownthornShark::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("clownthorn_shark")); - public static final DeferredHolder, EntityType> ROUGHBACK = ENTITIES.register("roughback_guitarfish", () -> EntityType.Builder.of(RoughbackGuitarfish::new, MobCategory.WATER_CREATURE).sized(1.0f, 0.3f).build("roughback_guitarfish")); - public static final DeferredHolder, EntityType> SEA_PANCAKE = ENTITIES.register("sea_pancake", () -> EntityType.Builder.of(SeaPancake::new, MobCategory.WATER_CREATURE).sized(3.0f, 0.4f).build("sea_pancake")); - public static final DeferredHolder, EntityType> PINKFIN = ENTITIES.register("pinkfin", () -> EntityType.Builder.of(PinkfinIdol::new, MobCategory.WATER_CREATURE).sized(1.0f, 1.8f).build("pinkfin")); - public static final DeferredHolder, EntityType> BRICK_SNAIL = ENTITIES.register("brick_snail", () -> EntityType.Builder.of(BrickSnail::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("brick_snail")); - public static final DeferredHolder, EntityType> ZEBRA_CORNETFISH = ENTITIES.register("zebra_cornetfish", () -> EntityType.Builder.of(ZebraCornetfish::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.3f).build("zebra_cornetfish")); - public static final DeferredHolder, EntityType> TIGER_PUFFER = ENTITIES.register("tiger_puffer", () -> EntityType.Builder.of(TigerPuffer::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build("tiger_puffer")); - public static final DeferredHolder, EntityType> BLACKCAP_SNAIL = ENTITIES.register("blackcap_snail", () -> EntityType.Builder.of(BlackCapSnail::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.4f).build("blackcap_snail")); - public static final DeferredHolder, EntityType> SNEEPSNORP = ENTITIES.register("sneep_snorp", () -> EntityType.Builder.of(SneepSnorp::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("sneep_snorp")); - public static final DeferredHolder, EntityType> DEEP_CRAWLER = ENTITIES.register("deep_crawler", () -> EntityType.Builder.of(DeepCrawler::new, MobCategory.WATER_CREATURE).sized(0.9f, 0.5f).build("deep_crawler")); - public static final DeferredHolder, EntityType> WIZARD_JELLY = ENTITIES.register("wizard_jelly", () -> EntityType.Builder.of(ManaJellyfish::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.5f).build("wizard_jelly")); - public static final DeferredHolder, EntityType> PORCUPINE_LOBSTA = ENTITIES.register("porcupine_lobsta", () -> EntityType.Builder.of(PorcupineLobster::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.6f).build("porcupine_lobsta")); - public static final DeferredHolder, EntityType> TRUMPET_SQUID = ENTITIES.register("trumpet_squid", () -> EntityType.Builder.of(TrumpetSquid::new, MobCategory.WATER_CREATURE).sized(1.5f, 0.6f).build("trumpet_squid")); - public static final DeferredHolder, EntityType> FRESHWATER_MANTIS = ENTITIES.register("freshwater_mantis", () -> EntityType.Builder.of(FreshwaterMantis::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.6f).build("freshwater_mantis")); - public static final DeferredHolder, EntityType> BARK_ANGELFISH = ENTITIES.register("bark_angelfish", () -> EntityType.Builder.of(BarkAngelfish::new, MobCategory.WATER_AMBIENT).sized(0.2f, 0.2f).build("bark_angelfish")); - public static final DeferredHolder, EntityType> SHOCKCAT = ENTITIES.register("shockcat", () -> EntityType.Builder.of(Shockcat::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.7f).build("shockcat")); - public static final DeferredHolder, EntityType> MUDDYTOP_SNAIL = ENTITIES.register("muddytop", () -> EntityType.Builder.of(MuddytopSnail::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("muddytop")); - public static final DeferredHolder, EntityType> KALAPPA = ENTITIES.register("kalappa", () -> EntityType.Builder.of(Kalappa::new, MobCategory.CREATURE).sized(1.8f, 1.8f).build("kalappa")); - public static final DeferredHolder, EntityType> LOBED_SKIPPER = ENTITIES.register("skipper", () -> EntityType.Builder.of(LobedSkipper::new, MobCategory.CREATURE).sized(0.5f, 0.6f).eyeHeight(0.2F * 0.6f).build("skipper")); - public static final DeferredHolder, EntityType> STOUT_BICHIR = ENTITIES.register("stout_bichir", () -> EntityType.Builder.of(StoutBichir::new, MobCategory.WATER_CREATURE).sized(1.0f, 0.7f).build("stout_bichir")); - public static final DeferredHolder, EntityType> BEAKED_HERRING = ENTITIES.register("beaked_herring", () -> EntityType.Builder.of(BeakedHerring::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.3f).build("beaked_herring")); - public static final DeferredHolder, EntityType> PICKLEFISH = ENTITIES.register("picklefish", () -> EntityType.Builder.of(Picklefish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("picklefish")); - public static final DeferredHolder, EntityType> BLIND_SAILFIN = ENTITIES.register("blindsailfin", () -> EntityType.Builder.of(BlindSailfin::new, MobCategory.WATER_AMBIENT).sized(0.6f, 0.5f).build("blindsailfin")); - public static final DeferredHolder, EntityType> DEMON_HERRING = ENTITIES.register("demon_herring", () -> EntityType.Builder.of(DemonHerring::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("demon_herring")); - public static final DeferredHolder, EntityType> AMBER_GOBY = ENTITIES.register("amber_goby", () -> EntityType.Builder.of(AmberGoby::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("amber_goby")); - public static final DeferredHolder, EntityType> HATCHET_FISH = ENTITIES.register("hatchet_fish", () -> EntityType.Builder.of(HatchetFish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("hatchet_fish")); - public static final DeferredHolder, EntityType> COPPERFLAME = ENTITIES.register("copperflame", () -> EntityType.Builder.of(CopperflameAnthias::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("copperflame")); - public static final DeferredHolder, EntityType> ROOTBALL = ENTITIES.register("rootball", () -> EntityType.Builder.of(Rootball::new, MobCategory.MONSTER).sized(0.5f, 0.4f).build("rootball")); - public static final DeferredHolder, EntityType> CELESTIAL_FISH = ENTITIES.register("celestial", () -> EntityType.Builder.of(CelestialFish::new, MobCategory.WATER_CREATURE).sized(1.0f, 1.8f).build("celestial")); - public static final DeferredHolder, EntityType> GNASHER = ENTITIES.register("gnasher", () -> EntityType.Builder.of(Gnasher::new, MobCategory.WATER_CREATURE).sized(1.5f, 0.8f).build("gnasher")); - public static final DeferredHolder, EntityType> PRAWN = ENTITIES.register("prawn", () -> EntityType.Builder.of(Prawn::new, MobCategory.MONSTER).sized(1.5f, 1.2f).build("prawn")); - public static final DeferredHolder, EntityType> SQUODDLE = ENTITIES.register("squoddle", () -> EntityType.Builder.of(Squoddle::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("squoddle")); - public static final DeferredHolder, EntityType> SEA_MOSQUITO = ENTITIES.register("sea_mosquito", () -> EntityType.Builder.of(SeaMosquito::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("sea_mosquito")); - public static final DeferredHolder, EntityType> FORKFISH = ENTITIES.register("forkfish", () -> EntityType.Builder.of(Forkfish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("forkfish")); - public static final DeferredHolder, EntityType> SPOON_SHARK = ENTITIES.register("spoon_shark", () -> EntityType.Builder.of(SpoonShark::new, MobCategory.WATER_CREATURE).sized(1.1f, 0.4f).build("spoon_shark")); - public static final DeferredHolder, EntityType> CORAL_SKRIMP = ENTITIES.register("coral_skrimp", () -> EntityType.Builder.of(Skrimp::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("coral_skrimp")); - public static final DeferredHolder, EntityType> CIRCUS_FISH = ENTITIES.register("circus", () -> EntityType.Builder.of(CircusFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.8f).build("circus")); - public static final DeferredHolder, EntityType> BLIZZARDFIN_TUNA = ENTITIES.register("blizzardfin", () -> EntityType.Builder.of(BlizzardfinTuna::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build("blizzardfin")); - public static final DeferredHolder, EntityType> FROSTY_FIN = ENTITIES.register("frostyfin", () -> EntityType.Builder.of(FrostyFinFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("frostyfin")); - public static final DeferredHolder, EntityType> EYELASH = ENTITIES.register("eyelash", () -> EntityType.Builder.of(EyelashFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("eyelash")); - public static final DeferredHolder, EntityType> TIGER_JUNGLE_SHARK = ENTITIES.register("jungleshark", () -> EntityType.Builder.of(TigerJungleShark::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.4f).build("jungleshark")); - public static final DeferredHolder, EntityType> CRIMSONSHELL_SQUID = ENTITIES.register("crimsonshell", () -> EntityType.Builder.of(CrimsonshellSquid::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("crimsonshell")); - public static final DeferredHolder, EntityType> VOLT_ANGLER = ENTITIES.register("volt_angler", () -> EntityType.Builder.of(VoltAngler::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("volt_angler")); - public static final DeferredHolder, EntityType> TRIBBLE = ENTITIES.register("tribble", () -> EntityType.Builder.of(Tribble::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.2f).build("tribble")); + // Living + public static final DeferredHolder, EntityType> DUALITY_DAMSELFISH = ENTITIES.register("duality_damselfish", () -> EntityType.Builder.of(DualityDamselfish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.5f).build("duality_damselfish")); + public static final DeferredHolder, EntityType> MOSSTHORN = ENTITIES.register("mossthorn", () -> EntityType.Builder.of(Mossthorn::new, MobCategory.UNDERGROUND_WATER_CREATURE).sized(0.8f, 1.0f).build("mossthorn")); + public static final DeferredHolder, EntityType> RIPPER = ENTITIES.register("ripper", () -> EntityType.Builder.of(Ripper::new, MobCategory.WATER_CREATURE).sized(0.9f, 0.6f).build("ripper")); + public static final DeferredHolder, EntityType> SPINDLEFISH = ENTITIES.register("spindlefish", () -> EntityType.Builder.of(Spindlefish::new, MobCategory.WATER_AMBIENT).sized(0.6f, 0.7f).build("spindlefish")); + public static final DeferredHolder, EntityType> RHINO_TETRA = ENTITIES.register("rhino_tetra", () -> EntityType.Builder.of(RhinoTetra::new, MobCategory.WATER_AMBIENT).sized(1.0f, 0.8f).build("rhino_tetra")); + public static final DeferredHolder, EntityType> DROOPING_GOURAMI = ENTITIES.register("drooping_gourami", () -> EntityType.Builder.of(DroopingGourami::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("drooping_gourami")); + public static final DeferredHolder, EntityType> SAILOR_BARB = ENTITIES.register("sailor_barb", () -> EntityType.Builder.of(SailorBarb::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("sailor_barb")); + public static final DeferredHolder, EntityType> SEA_SPIDER = ENTITIES.register("sea_spider", () -> EntityType.Builder.of(SeaSpider::new, MobCategory.WATER_AMBIENT).sized(0.9f, 0.9f).build("sea_spider")); + public static final DeferredHolder, EntityType> TRIPLE_TWIRL_PLECO = ENTITIES.register("triple_twirl_pleco", () -> EntityType.Builder.of(TripleTwirlPleco::new, MobCategory.WATER_AMBIENT).sized(0.75f, 0.45f).build("triple_twirl_pleco")); + public static final DeferredHolder, EntityType> AERO_MONO = ENTITIES.register("aero_mono", () -> EntityType.Builder.of(AeroMono::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.5f).build("aero_mono")); + public static final DeferredHolder, EntityType> CLOWNTHORN_SHARK = ENTITIES.register("clownthorn_shark", () -> EntityType.Builder.of(ClownthornShark::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("clownthorn_shark")); + public static final DeferredHolder, EntityType> ROUGHBACK = ENTITIES.register("roughback_guitarfish", () -> EntityType.Builder.of(RoughbackGuitarfish::new, MobCategory.WATER_CREATURE).sized(1.0f, 0.3f).build("roughback_guitarfish")); + public static final DeferredHolder, EntityType> SEA_PANCAKE = ENTITIES.register("sea_pancake", () -> EntityType.Builder.of(SeaPancake::new, MobCategory.WATER_CREATURE).sized(3.0f, 0.4f).build("sea_pancake")); + public static final DeferredHolder, EntityType> PINKFIN = ENTITIES.register("pinkfin", () -> EntityType.Builder.of(PinkfinIdol::new, MobCategory.WATER_CREATURE).sized(1.0f, 1.8f).build("pinkfin")); + public static final DeferredHolder, EntityType> BRICK_SNAIL = ENTITIES.register("brick_snail", () -> EntityType.Builder.of(BrickSnail::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.3f).build("brick_snail")); + public static final DeferredHolder, EntityType> ZEBRA_CORNETFISH = ENTITIES.register("zebra_cornetfish", () -> EntityType.Builder.of(ZebraCornetfish::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.3f).build("zebra_cornetfish")); + public static final DeferredHolder, EntityType> TIGER_PUFFER = ENTITIES.register("tiger_puffer", () -> EntityType.Builder.of(TigerPuffer::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build("tiger_puffer")); + public static final DeferredHolder, EntityType> BLACKCAP_SNAIL = ENTITIES.register("blackcap_snail", () -> EntityType.Builder.of(BlackCapSnail::new, MobCategory.WATER_AMBIENT).sized(0.3f, 0.4f).build("blackcap_snail")); + public static final DeferredHolder, EntityType> SNEEPSNORP = ENTITIES.register("sneep_snorp", () -> EntityType.Builder.of(SneepSnorp::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("sneep_snorp")); + public static final DeferredHolder, EntityType> DEEP_CRAWLER = ENTITIES.register("deep_crawler", () -> EntityType.Builder.of(DeepCrawler::new, MobCategory.WATER_CREATURE).sized(0.9f, 0.5f).build("deep_crawler")); + public static final DeferredHolder, EntityType> WIZARD_JELLY = ENTITIES.register("wizard_jelly", () -> EntityType.Builder.of(ManaJellyfish::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.5f).build("wizard_jelly")); + public static final DeferredHolder, EntityType> PORCUPINE_LOBSTA = ENTITIES.register("porcupine_lobsta", () -> EntityType.Builder.of(PorcupineLobster::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.6f).build("porcupine_lobsta")); + public static final DeferredHolder, EntityType> TRUMPET_SQUID = ENTITIES.register("trumpet_squid", () -> EntityType.Builder.of(TrumpetSquid::new, MobCategory.WATER_CREATURE).sized(1.5f, 0.6f).build("trumpet_squid")); + public static final DeferredHolder, EntityType> FRESHWATER_MANTIS = ENTITIES.register("freshwater_mantis", () -> EntityType.Builder.of(FreshwaterMantis::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.6f).build("freshwater_mantis")); + public static final DeferredHolder, EntityType> BARK_ANGELFISH = ENTITIES.register("bark_angelfish", () -> EntityType.Builder.of(BarkAngelfish::new, MobCategory.WATER_AMBIENT).sized(0.2f, 0.2f).build("bark_angelfish")); + public static final DeferredHolder, EntityType> SHOCKCAT = ENTITIES.register("shockcat", () -> EntityType.Builder.of(Shockcat::new, MobCategory.WATER_CREATURE).sized(0.5f, 0.7f).build("shockcat")); + public static final DeferredHolder, EntityType> MUDDYTOP_SNAIL = ENTITIES.register("muddytop", () -> EntityType.Builder.of(MuddytopSnail::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("muddytop")); + public static final DeferredHolder, EntityType> KALAPPA = ENTITIES.register("kalappa", () -> EntityType.Builder.of(Kalappa::new, MobCategory.CREATURE).sized(1.8f, 1.8f).build("kalappa")); + public static final DeferredHolder, EntityType> LOBED_SKIPPER = ENTITIES.register("skipper", () -> EntityType.Builder.of(LobedSkipper::new, MobCategory.CREATURE).sized(0.5f, 0.6f).eyeHeight(0.2F * 0.6f).build("skipper")); + public static final DeferredHolder, EntityType> STOUT_BICHIR = ENTITIES.register("stout_bichir", () -> EntityType.Builder.of(StoutBichir::new, MobCategory.WATER_CREATURE).sized(1.0f, 0.7f).build("stout_bichir")); + public static final DeferredHolder, EntityType> BEAKED_HERRING = ENTITIES.register("beaked_herring", () -> EntityType.Builder.of(BeakedHerring::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.3f).build("beaked_herring")); + public static final DeferredHolder, EntityType> PICKLEFISH = ENTITIES.register("picklefish", () -> EntityType.Builder.of(Picklefish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("picklefish")); + public static final DeferredHolder, EntityType> BLIND_SAILFIN = ENTITIES.register("blindsailfin", () -> EntityType.Builder.of(BlindSailfin::new, MobCategory.WATER_AMBIENT).sized(0.6f, 0.5f).build("blindsailfin")); + public static final DeferredHolder, EntityType> DEMON_HERRING = ENTITIES.register("demon_herring", () -> EntityType.Builder.of(DemonHerring::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("demon_herring")); + public static final DeferredHolder, EntityType> AMBER_GOBY = ENTITIES.register("amber_goby", () -> EntityType.Builder.of(AmberGoby::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("amber_goby")); + public static final DeferredHolder, EntityType> HATCHET_FISH = ENTITIES.register("hatchet_fish", () -> EntityType.Builder.of(HatchetFish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("hatchet_fish")); + public static final DeferredHolder, EntityType> COPPERFLAME = ENTITIES.register("copperflame", () -> EntityType.Builder.of(CopperflameAnthias::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("copperflame")); + public static final DeferredHolder, EntityType> ROOTBALL = ENTITIES.register("rootball", () -> EntityType.Builder.of(Rootball::new, MobCategory.MONSTER).sized(0.5f, 0.4f).build("rootball")); + public static final DeferredHolder, EntityType> CELESTIAL_FISH = ENTITIES.register("celestial", () -> EntityType.Builder.of(CelestialFish::new, MobCategory.WATER_CREATURE).sized(1.0f, 1.8f).build("celestial")); + public static final DeferredHolder, EntityType> GNASHER = ENTITIES.register("gnasher", () -> EntityType.Builder.of(Gnasher::new, MobCategory.WATER_CREATURE).sized(1.5f, 0.8f).build("gnasher")); + public static final DeferredHolder, EntityType> PRAWN = ENTITIES.register("prawn", () -> EntityType.Builder.of(Prawn::new, MobCategory.MONSTER).sized(1.5f, 1.2f).build("prawn")); + public static final DeferredHolder, EntityType> SQUODDLE = ENTITIES.register("squoddle", () -> EntityType.Builder.of(Squoddle::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("squoddle")); + public static final DeferredHolder, EntityType> SEA_MOSQUITO = ENTITIES.register("sea_mosquito", () -> EntityType.Builder.of(SeaMosquito::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("sea_mosquito")); + public static final DeferredHolder, EntityType> FORKFISH = ENTITIES.register("forkfish", () -> EntityType.Builder.of(Forkfish::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("forkfish")); + public static final DeferredHolder, EntityType> SPOON_SHARK = ENTITIES.register("spoon_shark", () -> EntityType.Builder.of(SpoonShark::new, MobCategory.WATER_CREATURE).sized(1.1f, 0.4f).build("spoon_shark")); + public static final DeferredHolder, EntityType> CORAL_SKRIMP = ENTITIES.register("coral_skrimp", () -> EntityType.Builder.of(Skrimp::new, MobCategory.WATER_AMBIENT).sized(0.5f, 0.4f).build("coral_skrimp")); + public static final DeferredHolder, EntityType> CIRCUS_FISH = ENTITIES.register("circus", () -> EntityType.Builder.of(CircusFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.8f).build("circus")); + public static final DeferredHolder, EntityType> BLIZZARDFIN_TUNA = ENTITIES.register("blizzardfin", () -> EntityType.Builder.of(BlizzardfinTuna::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.8f).build("blizzardfin")); + public static final DeferredHolder, EntityType> FROSTY_FIN = ENTITIES.register("frostyfin", () -> EntityType.Builder.of(FrostyFinFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("frostyfin")); + public static final DeferredHolder, EntityType> EYELASH = ENTITIES.register("eyelash", () -> EntityType.Builder.of(EyelashFish::new, MobCategory.WATER_AMBIENT).sized(0.4f, 0.4f).build("eyelash")); + public static final DeferredHolder, EntityType> TIGER_JUNGLE_SHARK = ENTITIES.register("jungleshark", () -> EntityType.Builder.of(TigerJungleShark::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.4f).build("jungleshark")); + public static final DeferredHolder, EntityType> CRIMSONSHELL_SQUID = ENTITIES.register("crimsonshell", () -> EntityType.Builder.of(CrimsonshellSquid::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("crimsonshell")); + public static final DeferredHolder, EntityType> VOLT_ANGLER = ENTITIES.register("volt_angler", () -> EntityType.Builder.of(VoltAngler::new, MobCategory.WATER_CREATURE).sized(0.6f, 0.6f).build("volt_angler")); + public static final DeferredHolder, EntityType> TRIBBLE = ENTITIES.register("tribble", () -> EntityType.Builder.of(Tribble::new, MobCategory.WATER_CREATURE).sized(0.8f, 0.2f).build("tribble")); - // Other - public static final DeferredHolder, EntityType> ABYSSAL_BLAST = ENTITIES.register("abyssal_blast", () -> EntityType.Builder.of(AbyssalBlast::new, MobCategory.MISC).sized(2.0F, 0.2F).fireImmune().build("abyssal_blast")); - public static final DeferredHolder, EntityType> PRISMARINE_SPEAR = ENTITIES.register("prismarine_spear", () -> EntityType.Builder.of(ThrownPrismarineSpear::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20).build("prismarine_spear")); - public static final DeferredHolder, EntityType> SEA_SPIKE = ENTITIES.register("sea_spike", () -> EntityType.Builder.of(SeaSpike::new, MobCategory.MISC).sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(20).build("sea_spike")); - public static final DeferredHolder, EntityType> FALLING_TREE = ENTITIES.register("falling_tree", () -> EntityType.Builder.of(FallingTreeBlockEntity::new, MobCategory.MISC).sized(0.99F, 0.99F).setUpdateInterval(1).setShouldReceiveVelocityUpdates(true).updateInterval(10).clientTrackingRange(20).build("falling_tree")); + // Other + public static final DeferredHolder, EntityType> ABYSSAL_BLAST = ENTITIES.register("abyssal_blast", () -> EntityType.Builder.of(AbyssalBlast::new, MobCategory.MISC).sized(2.0F, 0.2F).fireImmune().build("abyssal_blast")); + public static final DeferredHolder, EntityType> PRISMARINE_SPEAR = ENTITIES.register("prismarine_spear", () -> EntityType.Builder.of(ThrownPrismarineSpear::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20).build("prismarine_spear")); + public static final DeferredHolder, EntityType> SEA_SPIKE = ENTITIES.register("sea_spike", () -> EntityType.Builder.of(SeaSpike::new, MobCategory.MISC).sized(0.25F, 0.25F).clientTrackingRange(4).updateInterval(20).build("sea_spike")); + public static final DeferredHolder, EntityType> FALLING_TREE = ENTITIES.register("falling_tree", () -> EntityType.Builder.of(FallingTreeBlockEntity::new, MobCategory.MISC).sized(0.99F, 0.99F).setUpdateInterval(1).setShouldReceiveVelocityUpdates(true).updateInterval(10).clientTrackingRange(20).build("falling_tree")); } diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java index 32474dd..7c7533f 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFItems.java @@ -1,197 +1,189 @@ - package codyhuh.unusualfishmod.core.registry; +package codyhuh.unusualfishmod.core.registry; - import codyhuh.unusualfishmod.UnusualFishMod; - import codyhuh.unusualfishmod.common.item.*; - import net.minecraft.ChatFormatting; - import net.minecraft.Util; - import net.minecraft.core.component.DataComponents; - import net.minecraft.network.chat.Component; - import net.minecraft.resources.ResourceLocation; - import net.minecraft.world.item.*; - import net.minecraft.world.level.material.Fluids; - import net.neoforged.neoforge.registries.DeferredItem; - import net.neoforged.neoforge.registries.DeferredRegister; +import codyhuh.unusualfishmod.UnusualFishMod; +import codyhuh.unusualfishmod.common.item.*; +import net.minecraft.ChatFormatting; +import net.minecraft.Util; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.*; +import net.minecraft.world.level.material.Fluids; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; - import java.util.List; +import java.util.List; - import static codyhuh.unusualfishmod.UnusualFishMod.loc; +import static codyhuh.unusualfishmod.UnusualFishMod.loc; - public final class UFItems { - public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(UnusualFishMod.MOD_ID); - - private static final ChatFormatting TITLE_FORMAT = ChatFormatting.GRAY; - private static final ChatFormatting DESCRIPTION_FORMAT = ChatFormatting.BLUE; - private static final Component ANCIENT_WEAPON_UPGRADE = Component.translatable(Util.makeDescriptionId("upgrade", loc("ancient_weapon_upgrade"))).withStyle(TITLE_FORMAT); - private static final Component ANCIENT_WEAPON_APPLIES_TO = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.applies_to"))).withStyle(DESCRIPTION_FORMAT); - private static final Component ANCIENT_WEAPON_INGREDIENTS = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.ingredients"))).withStyle(DESCRIPTION_FORMAT); - private static final Component ANCIENT_WEAPON_BASE_SLOT_DESCRIPTION = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.base_slot_description"))); - private static final Component ANCIENT_WEAPON_ADDITIONS_SLOT_DESCRIPTION = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.additions_slot_description"))); - private static final ResourceLocation EMPTY_SLOT_WEAPON_PARTS = loc("item/empty_slot_weapon_parts"); - private static final ResourceLocation EMPTY_SLOT_DEPTH_CLAW = loc("item/empty_slot_depth_claw"); - private static final ResourceLocation EMPTY_SLOT_RIPPER_TOOTH = loc("item/empty_slot_ripper_tooth"); - - // Foods - public static final DeferredItem RAW_EYELASH = ITEMS.register("raw_eyelash", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_EYELASH))); - public static final DeferredItem RAW_SPINDLEFISH = ITEMS.register("raw_spindlefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SPINDLEFISH))); - public static final DeferredItem RAW_FROSTY_FIN = ITEMS.register("raw_frosty_fin", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_FROSTY_FIN))); - public static final DeferredItem RAW_AERO_MONO = ITEMS.register("raw_aero_mono", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO))); - public static final DeferredItem RAW_PICKLEFSIH = ITEMS.register("raw_picklefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_PICKLEFISH))); - public static final DeferredItem RAW_AMBER_GOBY = ITEMS.register("raw_amber_goby", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AMBER_GOBY))); - public static final DeferredItem RAW_BEAKED_HERRING = ITEMS.register("raw_beaked_herring", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BEAKED_HERRING))); - public static final DeferredItem RAW_BLIND_SAILFIN = ITEMS.register("raw_blind_sailfin", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BLIND_SAILFIN))); - public static final DeferredItem RAW_CIRCUS_FISH = ITEMS.register("raw_circus_fish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_CIRCUS_FISH))); - public static final DeferredItem RAW_COPPERFLAME_ANTHIAS = ITEMS.register("raw_copperflame_anthias", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_COPPERFLAME_ANTHIAS))); - public static final DeferredItem RAW_DEMON_HERRING = ITEMS.register("raw_demon_herring", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DEMON_HERRING))); - public static final DeferredItem RAW_DROOPING_GOURAMI = ITEMS.register("raw_drooping_gourami", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DROOPING_GOURAMI))); - public static final DeferredItem RAW_DUALITY_DAMSELFISH = ITEMS.register("raw_duality_damselfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DUALITY_DAMSELFISH))); - public static final DeferredItem RAW_FORKFISH = ITEMS.register("raw_forkfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_FORKFISH))); - public static final DeferredItem RAW_HATCHETFISH = ITEMS.register("raw_hatchetfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_HATCHETFISH))); - public static final DeferredItem RAW_SNEEP_SNORP = ITEMS.register("raw_sneep_snorp", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SNEEP_SNORP))); - public static final DeferredItem RAW_TRIPLE_TWIRL_PLECO = ITEMS.register("raw_triple_twirl_pleco", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_TRIPLE_TWIRL_PLECO))); - //public static final DeferredItem UNUSUAL_FILLET = ITEMS.register("unusual_fillet", () -> new Item(new Item.Properties().food(UFFoodProperties.UNUSUAL_FILLET))); - - public static final DeferredItem RAW_AERO_MONO_STICK = ITEMS.register("raw_aero_mono_stick", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO_STICK))); - public static final DeferredItem COOKED_AERO_MONO_STICK = ITEMS.register("cooked_aero_mono_stick", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_AERO_MONO_STICK))); - //public static final DeferredItem RAW_BUMPFACE = ITEMS.register("raw_bumpface", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BUMPFACE))); - public static final DeferredItem RAW_SAILOR_BARB = ITEMS.register("raw_sailor_barb", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SAILOR_BARB))); - public static final DeferredItem RAW_BARK_ANGELFISH = ITEMS.register("raw_bark_angelfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BARK_ANGELFISH))); - public static final DeferredItem RAW_BLIZZARD_TUNA = ITEMS.register("raw_blizzard_tuna", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BLIZZARD_TUNA))); - public static final DeferredItem COOKED_BLIZZARD_TUNA = ITEMS.register("cooked_blizzard_tuna", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_BLIZZARD_TUNA))); - public static final DeferredItem RAW_SHOCKCAT = ITEMS.register("raw_shockcat", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SHOCKCAT))); - public static final DeferredItem COOKED_SHOCKCAT = ITEMS.register("cooked_shockcat", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_SHOCKCAT))); - public static final DeferredItem RAW_LOBSTER = ITEMS.register("raw_lobster", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_LOBSTER))); - public static final DeferredItem COOKED_LOBSTER = ITEMS.register("cooked_lobster", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_LOBSTER))); - public static final DeferredItem RAW_MOSSTHORN = ITEMS.register("raw_mossthorn", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_MOSSTHORN))); - public static final DeferredItem COOKED_MOSSTHORN = ITEMS.register("cooked_mossthorn", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_MOSSTHORN))); - public static final DeferredItem COOKED_UNUSUAL_FILLET = ITEMS.register("cooked_unusual_fillet", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_UNUSUAL_FILLET))); - public static final DeferredItem LOBSTER_ROLL = ITEMS.register("lobster_roll", () -> new Item(new Item.Properties().food(UFFoodProperties.LOBSTER_ROLL))); - public static final DeferredItem ODD_FISHSTICKS = ITEMS.register("odd_fishsticks", () -> new Item(new Item.Properties().food(UFFoodProperties.ODD_FISHSTICKS))); - public static final DeferredItem PICKLEDISH = ITEMS.register("pickledish", () -> new Item(new Item.Properties().food(UFFoodProperties.PICKLEDISH).stacksTo(1))); - public static final DeferredItem STRANGE_BROTH = ITEMS.register("strange_broth", () -> new Item(new Item.Properties().food(UFFoodProperties.STRANGE_BROTH).stacksTo(1))); - public static final DeferredItem UNUSUAL_SANDWICH = ITEMS.register("unusual_sandwich", () -> new Item(new Item.Properties().food(UFFoodProperties.UNUSUAL_SANDWICH))); - public static final DeferredItem WEIRD_GOLDFISH = ITEMS.register("weird_goldfish", () -> new Item(new Item.Properties().food(UFFoodProperties.WEIRD_GOLDFISH))); - - // Drops - public static final DeferredItem TENDRIL = ITEMS.register("tendril", () -> new Item(new Item.Properties())); - public static final DeferredItem RIPPER_TOOTH = ITEMS.register("ripper_tooth", () -> new Item(new Item.Properties())); - public static final DeferredItem LOBSTER_SPIKE = ITEMS.register("lobster_spike", () -> new Item(new Item.Properties())); - public static final DeferredItem RELUCENT_SHARD = ITEMS.register("relucent_shard", () -> new Item(new Item.Properties())); - public static final DeferredItem CRIMSON_SHARD = ITEMS.register("crimson_shard", () -> new Item(new Item.Properties())); - public static final DeferredItem DEPTH_CLAW = ITEMS.register("depth_claw", () -> new Item(new Item.Properties())); - - // Gear - public static final DeferredItem DEPTH_SCYTHE = ITEMS.register("depth_scythe", () -> new DepthScytheItem(Tiers.DIAMOND, new Item.Properties().durability(600).attributes(SwordItem.createAttributes(Tiers.DIAMOND, 3, -2.4F)))); - public static final DeferredItem RIPSAW = ITEMS.register("ripsaw", () -> new RipsawItem(new Item.Properties().stacksTo(1).attributes(AxeItem.createAttributes(UFTiers.RIPPER_SAW, 7.0F, -1.0F)))); - public static final DeferredItem FLUVIAL_SHELL = ITEMS.register("fluvial_shell", () -> new WeatherShellItem("rain", new Item.Properties().stacksTo(1).durability(1))); - public static final DeferredItem CLEMENT_SHELL = ITEMS.register("clement_shell", () -> new WeatherShellItem("clear", new Item.Properties().stacksTo(1).durability(1))); - public static final DeferredItem THUNDEROUS_SHELL = ITEMS.register("thunderous_shell", () -> new WeatherShellItem("thunder", new Item.Properties().stacksTo(1).durability(1))); - public static final DeferredItem PRISMARINE_SPEAR = ITEMS.register("prismarine_spear", () -> new PrismarineSpearItem(new Item.Properties().stacksTo(1).durability(100))); - public static final DeferredItem WEAPON_PARTS = ITEMS.register("weapon_parts", () -> new Item(new Item.Properties())); - public static final DeferredItem ANCIENT_WEAPON_SMITHING_TEMPLATE = ITEMS.register("ancient_weapon_smithing_template", () -> new SmithingTemplateItem(ANCIENT_WEAPON_APPLIES_TO, ANCIENT_WEAPON_INGREDIENTS, ANCIENT_WEAPON_UPGRADE, ANCIENT_WEAPON_ADDITIONS_SLOT_DESCRIPTION, ANCIENT_WEAPON_BASE_SLOT_DESCRIPTION, List.of(EMPTY_SLOT_WEAPON_PARTS), List.of(EMPTY_SLOT_DEPTH_CLAW, EMPTY_SLOT_RIPPER_TOOTH))); - public static final DeferredItem MUSIC_DISC_SEAFOAM = ITEMS.register("music_disc_seafoam", () -> new Item(new Item.Properties().component(DataComponents.JUKEBOX_PLAYABLE, new JukeboxPlayable(new EitherHolder<>(UFSounds.SEAFOAM_SONG), true)).stacksTo(1).rarity(Rarity.RARE))); - //public static final DeferredItem STARGAZER = ITEMS.register("stargazer", () -> new StargazerItem(new Item.Properties().tab(UnusualFishMod.UNUSUAL_TAB).stacksTo(1))); - - - // Buckets - public static final DeferredItem AERO_MONO_BUCKET = ITEMS.register("aero_mono_bucket", () -> new UFFishBucketItem(UFEntities.AERO_MONO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem RHINO_TETRA_BUCKET = ITEMS.register("rhino_tetra_bucket", () -> new UFFishBucketItem(UFEntities.RHINO_TETRA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem DUALITY_DAMSELFISH_BUCKET = ITEMS.register("duality_damselfish_bucket", () -> new UFFishBucketItem(UFEntities.DUALITY_DAMSELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem DROOPING_GOURAMI_BUCKET = ITEMS.register("drooping_gourami_bucket", () -> new UFFishBucketItem(UFEntities.DROOPING_GOURAMI, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem MOSSTHORN_BUCKET = ITEMS.register("mossthorn_bucket", () -> new UFFishBucketItem(UFEntities.MOSSTHORN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SAILOR_BARB_BUCKET = ITEMS.register("sailor_barb_bucket", () -> new UFFishBucketItem(UFEntities.SAILOR_BARB, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem TRIPLE_TWIRL_PLECO_BUCKET = ITEMS.register("triple_twirl_pleco_bucket", () -> new UFFishBucketItem(UFEntities.TRIPLE_TWIRL_PLECO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SPINDLEFISH_BUCKET = ITEMS.register("spindlefish_bucket", () -> new UFFishBucketItem(UFEntities.SPINDLEFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem RIPPER_BUCKET = ITEMS.register("ripper_bucket", () -> new UFFishBucketItem(UFEntities.RIPPER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SEA_SPIDER_BUCKET = ITEMS.register("sea_spider_bucket", () -> new UFFishBucketItem(UFEntities.SEA_SPIDER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem CLOWNTHORN_SHARK_BUCKET = ITEMS.register("clownthorn_shark_bucket", () -> new UFFishBucketItem(UFEntities.CLOWNTHORN_SHARK, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SNEEPSNORP_BUCKET = ITEMS.register("sneepsnorp_bucket", () -> new UFFishBucketItem(UFEntities.SNEEPSNORP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem BLACKCAP_SNAIL_BUCKET = ITEMS.register("blackcap_snail_bucket", () -> new UFFishBucketItem(UFEntities.BLACKCAP_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem BRICK_SNAIL_BUCKET = ITEMS.register("brick_snail_bucket", () -> new UFFishBucketItem(UFEntities.BRICK_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem DEEP_CRAWLER_BUCKET = ITEMS.register("deep_crawler_bucket", () -> new UFFishBucketItem(UFEntities.DEEP_CRAWLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem WIZARD_JELLY_BUCKET = ITEMS.register("wizard_jelly_bucket", () -> new UFFishBucketItem(UFEntities.WIZARD_JELLY, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem PORCUPINE_LOBSTA_BUCKET = ITEMS.register("porcupine_lobsta_bucket", () -> new UFFishBucketItem(UFEntities.PORCUPINE_LOBSTA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem FRESHWATER_MANTIS_BUCKET = ITEMS.register("freshwater_mantis_bucket", () -> new UFFishBucketItem(UFEntities.FRESHWATER_MANTIS, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem BARK_ANGELFISH_BUCKET = ITEMS.register("bark_angelfish_bucket", () -> new UFFishBucketItem(UFEntities.BARK_ANGELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SKIPPER_BUCKET = ITEMS.register("lobed_skipper_bucket", () -> new UFFishBucketItem(UFEntities.LOBED_SKIPPER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem BEAKED_HERRING_BUCKET = ITEMS.register("beaked_herring_bucket", () -> new UFFishBucketItem(UFEntities.BEAKED_HERRING, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem PICKLEFISH_BUCKET = ITEMS.register("picklefish_bucket", () -> new UFFishBucketItem(UFEntities.PICKLEFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem BLIND_SAILFIN_BUCKET = ITEMS.register("blind_sailfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIND_SAILFIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem DEMON_HERRING_BUCKET = ITEMS.register("demon_herring_bucket", () -> new UFFishBucketItem(UFEntities.DEMON_HERRING, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem AMBER_GOBY_BUCKET = ITEMS.register("amber_goby_bucket", () -> new UFFishBucketItem(UFEntities.AMBER_GOBY, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem HATCHET_FISH_BUCKET = ITEMS.register("hatchet_fish_bucket", () -> new UFFishBucketItem(UFEntities.HATCHET_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem COPPERFLAME_BUCKET = ITEMS.register("copperflame_bucket", () -> new UFFishBucketItem(UFEntities.COPPERFLAME, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SQUODDLE_BUCKET = ITEMS.register("squoddle_bucket", () -> new UFFishBucketItem(UFEntities.SQUODDLE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SEA_MOSQUITO_BUCKET = ITEMS.register("sea_mosquito_bucket", () -> new UFFishBucketItem(UFEntities.SEA_MOSQUITO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem FORKFISH_BUCKET = ITEMS.register("forkfish_bucket", () -> new UFFishBucketItem(UFEntities.FORKFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SPOON_SHARK_BUCKET = ITEMS.register("spoon_shark_bucket", () -> new UFFishBucketItem(UFEntities.SPOON_SHARK, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem CORAL_SKRIMP_BUCKET = ITEMS.register("coral_skrimp_bucket", () -> new UFFishBucketItem(UFEntities.CORAL_SKRIMP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem CIRCUS_FISH_BUCKET = ITEMS.register("circus_fish_bucket", () -> new UFFishBucketItem(UFEntities.CIRCUS_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem EYELASH_FISH_BUCKET = ITEMS.register("eyelash_fish_bucket", () -> new UFFishBucketItem(UFEntities.EYELASH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem FROSTY_FIN_FISH_BUCKET = ITEMS.register("frosty_fin_fish_bucket", () -> new UFFishBucketItem(UFEntities.FROSTY_FIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem CRIMSONSHELL_SQUID_BUCKET = ITEMS.register("crimsonshell_squid_bucket", () -> new UFFishBucketItem(UFEntities.CRIMSONSHELL_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem VOLT_ANGLER_BUCKET = ITEMS.register("volt_angler_bucket", () -> new UFFishBucketItem(UFEntities.VOLT_ANGLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem BLIZZARDFIN_BUCKET = ITEMS.register("blizzardfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIZZARDFIN_TUNA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem MUDDYTOP_SNAIL_BUCKET = ITEMS.register("muddytop_snail_bucket", () -> new UFFishBucketItem(UFEntities.MUDDYTOP_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem SHOCKCAT_BUCKET = ITEMS.register("shockcat_bucket", () -> new UFFishBucketItem(UFEntities.SHOCKCAT, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem PINKFIN_IDOL_BUCKET = ITEMS.register("pinkfin_idol_bucket", () -> new UFFishBucketItem(UFEntities.PINKFIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem TIGER_PUFFER_BUCKET = ITEMS.register("tiger_puffer_bucket", () -> new UFFishBucketItem(UFEntities.TIGER_PUFFER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem STOUT_BICHIR_BUCKET = ITEMS.register("stout_bichir_bucket", () -> new UFFishBucketItem(UFEntities.STOUT_BICHIR, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem TRIBBLE_BUCKET = ITEMS.register("tribble_bucket", () -> new UFFishBucketItem(UFEntities.TRIBBLE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - public static final DeferredItem TRUMPET_SQUID_BUCKET = ITEMS.register("trumpet_squid_bucket", () -> new UFFishBucketItem(UFEntities.TRUMPET_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); - - // Spawn Eggs - public static final DeferredItem AERO_MONO_SPAWN_EGG = ITEMS.register("aero_mono_spawn_egg", () -> new SpawnEggItem(UFEntities.AERO_MONO.get(), 0x8ca8b5, 0x506884, new Item.Properties())); - public static final DeferredItem PINKFIN_SPAWN_EGG = ITEMS.register("pinkfin_spawn_egg", () -> new SpawnEggItem(UFEntities.PINKFIN.get(), 0x0e011e, 0x421054, new Item.Properties())); - public static final DeferredItem BARBED_SPAWN_EGG = ITEMS.register("roughback_guitarfish_spawn_egg", () -> new SpawnEggItem(UFEntities.ROUGHBACK.get(), 0x5e5d4f, 0x92998e, new Item.Properties())); - public static final DeferredItem CLOWNTHORN_SPAWN_EGG = ITEMS.register("clownthorn_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.CLOWNTHORN_SHARK.get(), 0xbe5515, 0xa21e00, new Item.Properties())); - public static final DeferredItem DUALITY_SPAWN_EGG = ITEMS.register("duality_damselfish_spawn_egg", () -> new SpawnEggItem(UFEntities.DUALITY_DAMSELFISH.get(), 0x8a94a1, 0x2c3338, new Item.Properties())); - public static final DeferredItem DROOPING_GOURAMI_SPAWN_EGG = ITEMS.register("drooping_gourami_spawn_egg", () -> new SpawnEggItem(UFEntities.DROOPING_GOURAMI.get(), 0x54434d, 0x363243, new Item.Properties())); - public static final DeferredItem MOSSTHORN_SPAWN_EGG = ITEMS.register("mossthorn_spawn_egg", () -> new SpawnEggItem(UFEntities.MOSSTHORN.get(), 0x26a529, 0x034223, new Item.Properties())); - public static final DeferredItem RHINO_TETRA_SPAWN_EGG = ITEMS.register("rhino_tetra_spawn_egg", () -> new SpawnEggItem(UFEntities.RHINO_TETRA.get(), 0x919187, 0x7b2726, new Item.Properties())); - public static final DeferredItem RIPPER_SPAWN_EGG = ITEMS.register("ripper_spawn_egg", () -> new SpawnEggItem(UFEntities.RIPPER.get(), 0x565950, 0x8f9386, new Item.Properties())); - public static final DeferredItem SAILOR_BARB_PAWN_EGG = ITEMS.register("sailor_barb_spawn_egg", () -> new SpawnEggItem(UFEntities.SAILOR_BARB.get(), 0x5e6a25, 0xa1a68c, new Item.Properties())); - public static final DeferredItem SEA_PANCAKE_SPAWN_EGG = ITEMS.register("sea_pancake_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_PANCAKE.get(), 0xbda877, 0xdfcbb7, new Item.Properties())); - public static final DeferredItem SEA_SPIDER_SPAWN_EGG = ITEMS.register("sea_spider_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_SPIDER.get(), 0x774128, 0xaf7834, new Item.Properties())); - public static final DeferredItem SPINDLEFISH_SPAWN_EGG = ITEMS.register("spindlefish_spawn_egg", () -> new SpawnEggItem(UFEntities.SPINDLEFISH.get(), 0x8e2573, 0xc14aeb, new Item.Properties())); - public static final DeferredItem TRIPLE_TWIRL_PLECO_SPAWN_EGG = ITEMS.register("triple_twirl_pleco_spawn_egg", () -> new SpawnEggItem(UFEntities.TRIPLE_TWIRL_PLECO.get(), 0xc1923a, 0x903113, new Item.Properties())); - public static final DeferredItem BRICK_SNAIL_SPAWN_EGG = ITEMS.register("brick_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.BRICK_SNAIL.get(), 0xb5553b, 0x674f17, new Item.Properties())); - public static final DeferredItem ZEBRA_CORNETFISH_SPAWN_EGG = ITEMS.register("zebra_cornetfish_spawn_egg", () -> new SpawnEggItem(UFEntities.ZEBRA_CORNETFISH.get(), 0x153957, 0xc7ad0d, new Item.Properties())); - public static final DeferredItem TIGER_PUFFER_SPAWN_EGG = ITEMS.register("tiger_puffer_spawn_egg", () -> new SpawnEggItem(UFEntities.TIGER_PUFFER.get(), 0x622814, 0x84736f, new Item.Properties())); - public static final DeferredItem BLACKCAP_SNAIL_SPAWN_EGG = ITEMS.register("blackcap_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.BLACKCAP_SNAIL.get(), 0x262917, 0x4c3d27, new Item.Properties())); - public static final DeferredItem SNEEPSNORP_EGG = ITEMS.register("sneepsnorp_spawn_egg", () -> new SpawnEggItem(UFEntities.SNEEPSNORP.get(), 0x3347a7, 0xce8a24, new Item.Properties())); - public static final DeferredItem DEEP_CRAWLER_SPAWN_EGG = ITEMS.register("deep_crawler_spawn_egg", () -> new SpawnEggItem(UFEntities.DEEP_CRAWLER.get(), 0x536761, 0x34363f, new Item.Properties())); - public static final DeferredItem WIZARD_JELLY_SPAWN_EGG = ITEMS.register("wizard_jelly_spawn_egg", () -> new SpawnEggItem(UFEntities.WIZARD_JELLY.get(), 0x5550b4, 0x3aa8d7, new Item.Properties())); - public static final DeferredItem PORCUPINE_LOBSTA_SPAWN_EGG = ITEMS.register("porcupine_lobsta_spawn_egg", () -> new SpawnEggItem(UFEntities.PORCUPINE_LOBSTA.get(), 0x624736, 0x9e521b, new Item.Properties())); - public static final DeferredItem TRUMPET_SQUID_SPAWN_EGG = ITEMS.register("trumpet_squid_spawn_egg", () -> new SpawnEggItem(UFEntities.TRUMPET_SQUID.get(), 0xe8d26a, 0xc6a042, new Item.Properties())); - public static final DeferredItem FRESHWATER_MANTIS_EGG = ITEMS.register("freshwater_mantis_spawn_egg", () -> new SpawnEggItem(UFEntities.FRESHWATER_MANTIS.get(), 0x454629, 0x94ab67, new Item.Properties())); - public static final DeferredItem BARK_ANGELFISH_SPAWN_EGG = ITEMS.register("bark_angelfish_spawn_egg", () -> new SpawnEggItem(UFEntities.BARK_ANGELFISH.get(), 0x553f1a, 0x35270a, new Item.Properties())); - public static final DeferredItem SHOCKCAT_SPAWN_EGG = ITEMS.register("shockcat_spawn_egg", () -> new SpawnEggItem(UFEntities.SHOCKCAT.get(), 0x34294f, 0x255f9b, new Item.Properties())); - public static final DeferredItem MUDDYTOP_SNAIL_SPAWN_EGG = ITEMS.register("muddytop_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.MUDDYTOP_SNAIL.get(), 0x23100e, 0x5f4d3b, new Item.Properties())); - public static final DeferredItem KALAPPA_SPAWN_EGG = ITEMS.register("kalappa_spawn_egg", () -> new SpawnEggItem(UFEntities.KALAPPA.get(), 0x624051, 0x886d86, new Item.Properties())); - public static final DeferredItem LOBED_SKIPPER_SPAWN_EGG = ITEMS.register("lobed_skipper_spawn_egg", () -> new SpawnEggItem(UFEntities.LOBED_SKIPPER.get(), 0x4b2618, 0x9e632f, new Item.Properties())); - public static final DeferredItem STOUT_BICHIR_SPAWN_EGG = ITEMS.register("stout_bichir_spawn_egg", () -> new SpawnEggItem(UFEntities.STOUT_BICHIR.get(), 0x5a5e3d, 0xb08f33, new Item.Properties())); - public static final DeferredItem BEAKED_HERRING_SPAWN_EGG = ITEMS.register("beaked_herring_spawn_egg", () -> new SpawnEggItem(UFEntities.BEAKED_HERRING.get(), 0x8bacc4, 0xc5d0cf, new Item.Properties())); - public static final DeferredItem PICKLEFISH_SPAWN_EGG = ITEMS.register("picklefish_spawn_egg", () -> new SpawnEggItem(UFEntities.PICKLEFISH.get(), 0x235806, 0xd0cd07, new Item.Properties())); - public static final DeferredItem BLIND_SAILFIN_SPAWN_EGG = ITEMS.register("blind_sailfin_spawn_egg", () -> new SpawnEggItem(UFEntities.BLIND_SAILFIN.get(), 0xdcccc3, 0xc19c8e, new Item.Properties())); - public static final DeferredItem DEMON_HERRING_SPAWN_EGG = ITEMS.register("demon_herring_spawn_egg", () -> new SpawnEggItem(UFEntities.DEMON_HERRING.get(), 0x363243, 0xef7930, new Item.Properties())); - public static final DeferredItem AMBER_GOBY_SPAWN_EGG = ITEMS.register("amber_goby_spawn_egg", () -> new SpawnEggItem(UFEntities.AMBER_GOBY.get(), 0xfb912e, 0xae5e2c, new Item.Properties())); - public static final DeferredItem HATCHET_FISH_SPAWN_EGG = ITEMS.register("hatchet_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.HATCHET_FISH.get(), 0x0b0b26, 0x7d3283, new Item.Properties())); - public static final DeferredItem COPPERFLAME_SPAWN_EGG = ITEMS.register("copperflame_spawn_egg", () -> new SpawnEggItem(UFEntities.COPPERFLAME.get(), 0x4fab90, 0x7fcf90, new Item.Properties())); - public static final DeferredItem ROOTBALL_SPAWN_EGG = ITEMS.register("root_spawn_egg", () -> new SpawnEggItem(UFEntities.ROOTBALL.get(), 0x647233, 0xad7d65, new Item.Properties())); - public static final DeferredItem CELESTIAL_FISH_SPAWN_EGG = ITEMS.register("celestial_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.CELESTIAL_FISH.get(), 0x6876a2, 0xe2e4c5, new Item.Properties())); - public static final DeferredItem GNASHER_SPAWN_EGG = ITEMS.register("gnasher_spawn_egg", () -> new SpawnEggItem(UFEntities.GNASHER.get(), 0x323232, 0x465bb2, new Item.Properties())); - public static final DeferredItem PRAWN_SPAWN_EGG = ITEMS.register("prawn_spawn_egg", () -> new SpawnEggItem(UFEntities.PRAWN.get(), 0x5a579e, 0x4694d1, new Item.Properties())); - public static final DeferredItem SQUODDLE_SPAWN_EGG = ITEMS.register("squoddle_spawn_egg", () -> new SpawnEggItem(UFEntities.SQUODDLE.get(), 0xb37817, 0xe58a2e, new Item.Properties())); - public static final DeferredItem SEA_MOSQUITO_SPAWN_EGG = ITEMS.register("sea_mosquito_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_MOSQUITO.get(), 0x326934, 0x6c122f, new Item.Properties())); - public static final DeferredItem FORKFISH_SPAWN_EGG = ITEMS.register("forkfish_spawn_egg", () -> new SpawnEggItem(UFEntities.FORKFISH.get(), 0x8e882c, 0x3dbba0, new Item.Properties())); - public static final DeferredItem SPOON_SHARK_SPAWN_EGG = ITEMS.register("spoon_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.SPOON_SHARK.get(), 0xddbd78, 0xb3925b, new Item.Properties())); - public static final DeferredItem CORAL_SKRIMP_EGG = ITEMS.register("coral_skrimp_spawn_egg", () -> new SpawnEggItem(UFEntities.CORAL_SKRIMP.get(), 0x5a0e7a, 0xb34aa2, new Item.Properties())); - public static final DeferredItem CIRCUS_FISH_SPAWN_EGG = ITEMS.register("circus_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.CIRCUS_FISH.get(), 0xab4b36, 0xc88f62, new Item.Properties())); - public static final DeferredItem BLIZZARDFIN_SPAWN_EGG = ITEMS.register("blizzardfin_spawn_egg", () -> new SpawnEggItem(UFEntities.BLIZZARDFIN_TUNA.get(), 0x9ed7dc, 0x6182a6, new Item.Properties())); - public static final DeferredItem EYELASH_FISH_SPAWN_EGG = ITEMS.register("eyelash_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.EYELASH.get(), 0xb7b7ba, 0xfcfcfa, new Item.Properties())); - public static final DeferredItem FROSTY_FIN_FISH_SPAWN_EGG = ITEMS.register("frosty_fin_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.FROSTY_FIN.get(), 0x649ccc, 0xcbe8e6, new Item.Properties())); - public static final DeferredItem TIGER_JUNGLE_SHARK_SPAWN_EGG = ITEMS.register("tiger_jungle_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.TIGER_JUNGLE_SHARK.get(), 0x272530, 0xa5a8c6, new Item.Properties())); - public static final DeferredItem CRIMSONSHELL_SQUID_SPAWN_EGG = ITEMS.register("crimsonshell_squid_spawn_egg", () -> new SpawnEggItem(UFEntities.CRIMSONSHELL_SQUID.get(), 0xab101c, 0x432c39, new Item.Properties())); - public static final DeferredItem VOLT_ANGLER_SPAWN_EGG = ITEMS.register("volt_angler_spawn_egg", () -> new SpawnEggItem(UFEntities.VOLT_ANGLER.get(), 0x2d4035, 0x509033, new Item.Properties())); - public static final DeferredItem TRIBBLE_SPAWN_EGG = ITEMS.register("tribble_spawn_egg", () -> new SpawnEggItem(UFEntities.TRIBBLE.get(), 0x656f26, 0x46491a, new Item.Properties())); - } +public final class UFItems { + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(UnusualFishMod.MOD_ID); + // Foods + public static final DeferredItem RAW_EYELASH = ITEMS.register("raw_eyelash", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_EYELASH))); + public static final DeferredItem RAW_SPINDLEFISH = ITEMS.register("raw_spindlefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SPINDLEFISH))); + public static final DeferredItem RAW_FROSTY_FIN = ITEMS.register("raw_frosty_fin", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_FROSTY_FIN))); + public static final DeferredItem RAW_AERO_MONO = ITEMS.register("raw_aero_mono", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO))); + public static final DeferredItem RAW_PICKLEFSIH = ITEMS.register("raw_picklefish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_PICKLEFISH))); + public static final DeferredItem RAW_AMBER_GOBY = ITEMS.register("raw_amber_goby", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AMBER_GOBY))); + public static final DeferredItem RAW_BEAKED_HERRING = ITEMS.register("raw_beaked_herring", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BEAKED_HERRING))); + public static final DeferredItem RAW_BLIND_SAILFIN = ITEMS.register("raw_blind_sailfin", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BLIND_SAILFIN))); + public static final DeferredItem RAW_CIRCUS_FISH = ITEMS.register("raw_circus_fish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_CIRCUS_FISH))); + public static final DeferredItem RAW_COPPERFLAME_ANTHIAS = ITEMS.register("raw_copperflame_anthias", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_COPPERFLAME_ANTHIAS))); + public static final DeferredItem RAW_DEMON_HERRING = ITEMS.register("raw_demon_herring", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DEMON_HERRING))); + public static final DeferredItem RAW_DROOPING_GOURAMI = ITEMS.register("raw_drooping_gourami", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DROOPING_GOURAMI))); + public static final DeferredItem RAW_DUALITY_DAMSELFISH = ITEMS.register("raw_duality_damselfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_DUALITY_DAMSELFISH))); + public static final DeferredItem RAW_FORKFISH = ITEMS.register("raw_forkfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_FORKFISH))); + public static final DeferredItem RAW_HATCHETFISH = ITEMS.register("raw_hatchetfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_HATCHETFISH))); + public static final DeferredItem RAW_SNEEP_SNORP = ITEMS.register("raw_sneep_snorp", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SNEEP_SNORP))); + public static final DeferredItem RAW_TRIPLE_TWIRL_PLECO = ITEMS.register("raw_triple_twirl_pleco", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_TRIPLE_TWIRL_PLECO))); + public static final DeferredItem RAW_AERO_MONO_STICK = ITEMS.register("raw_aero_mono_stick", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_AERO_MONO_STICK))); + public static final DeferredItem COOKED_AERO_MONO_STICK = ITEMS.register("cooked_aero_mono_stick", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_AERO_MONO_STICK))); + //public static final DeferredItem RAW_BUMPFACE = ITEMS.register("raw_bumpface", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BUMPFACE))); + public static final DeferredItem RAW_SAILOR_BARB = ITEMS.register("raw_sailor_barb", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SAILOR_BARB))); + public static final DeferredItem RAW_BARK_ANGELFISH = ITEMS.register("raw_bark_angelfish", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BARK_ANGELFISH))); + public static final DeferredItem RAW_BLIZZARD_TUNA = ITEMS.register("raw_blizzard_tuna", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_BLIZZARD_TUNA))); + public static final DeferredItem COOKED_BLIZZARD_TUNA = ITEMS.register("cooked_blizzard_tuna", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_BLIZZARD_TUNA))); + public static final DeferredItem RAW_SHOCKCAT = ITEMS.register("raw_shockcat", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_SHOCKCAT))); + public static final DeferredItem COOKED_SHOCKCAT = ITEMS.register("cooked_shockcat", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_SHOCKCAT))); + public static final DeferredItem RAW_LOBSTER = ITEMS.register("raw_lobster", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_LOBSTER))); + public static final DeferredItem COOKED_LOBSTER = ITEMS.register("cooked_lobster", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_LOBSTER))); + //public static final DeferredItem UNUSUAL_FILLET = ITEMS.register("unusual_fillet", () -> new Item(new Item.Properties().food(UFFoodProperties.UNUSUAL_FILLET))); + public static final DeferredItem RAW_MOSSTHORN = ITEMS.register("raw_mossthorn", () -> new Item(new Item.Properties().food(UFFoodProperties.RAW_MOSSTHORN))); + public static final DeferredItem COOKED_MOSSTHORN = ITEMS.register("cooked_mossthorn", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_MOSSTHORN))); + public static final DeferredItem COOKED_UNUSUAL_FILLET = ITEMS.register("cooked_unusual_fillet", () -> new Item(new Item.Properties().food(UFFoodProperties.COOKED_UNUSUAL_FILLET))); + public static final DeferredItem LOBSTER_ROLL = ITEMS.register("lobster_roll", () -> new Item(new Item.Properties().food(UFFoodProperties.LOBSTER_ROLL))); + public static final DeferredItem ODD_FISHSTICKS = ITEMS.register("odd_fishsticks", () -> new Item(new Item.Properties().food(UFFoodProperties.ODD_FISHSTICKS))); + public static final DeferredItem PICKLEDISH = ITEMS.register("pickledish", () -> new Item(new Item.Properties().food(UFFoodProperties.PICKLEDISH).stacksTo(1))); + public static final DeferredItem STRANGE_BROTH = ITEMS.register("strange_broth", () -> new Item(new Item.Properties().food(UFFoodProperties.STRANGE_BROTH).stacksTo(1))); + public static final DeferredItem UNUSUAL_SANDWICH = ITEMS.register("unusual_sandwich", () -> new Item(new Item.Properties().food(UFFoodProperties.UNUSUAL_SANDWICH))); + public static final DeferredItem WEIRD_GOLDFISH = ITEMS.register("weird_goldfish", () -> new Item(new Item.Properties().food(UFFoodProperties.WEIRD_GOLDFISH))); + // Drops + public static final DeferredItem TENDRIL = ITEMS.register("tendril", () -> new Item(new Item.Properties())); + public static final DeferredItem RIPPER_TOOTH = ITEMS.register("ripper_tooth", () -> new Item(new Item.Properties())); + public static final DeferredItem LOBSTER_SPIKE = ITEMS.register("lobster_spike", () -> new Item(new Item.Properties())); + public static final DeferredItem RELUCENT_SHARD = ITEMS.register("relucent_shard", () -> new Item(new Item.Properties())); + public static final DeferredItem CRIMSON_SHARD = ITEMS.register("crimson_shard", () -> new Item(new Item.Properties())); + public static final DeferredItem DEPTH_CLAW = ITEMS.register("depth_claw", () -> new Item(new Item.Properties())); + // Gear + public static final DeferredItem DEPTH_SCYTHE = ITEMS.register("depth_scythe", () -> new DepthScytheItem(Tiers.DIAMOND, new Item.Properties().durability(600).attributes(SwordItem.createAttributes(Tiers.DIAMOND, 3, -2.4F)))); + public static final DeferredItem RIPSAW = ITEMS.register("ripsaw", () -> new RipsawItem(new Item.Properties().stacksTo(1).attributes(AxeItem.createAttributes(UFTiers.RIPPER_SAW, 7.0F, -1.0F)))); + public static final DeferredItem FLUVIAL_SHELL = ITEMS.register("fluvial_shell", () -> new WeatherShellItem("rain", new Item.Properties().stacksTo(1).durability(1))); + public static final DeferredItem CLEMENT_SHELL = ITEMS.register("clement_shell", () -> new WeatherShellItem("clear", new Item.Properties().stacksTo(1).durability(1))); + public static final DeferredItem THUNDEROUS_SHELL = ITEMS.register("thunderous_shell", () -> new WeatherShellItem("thunder", new Item.Properties().stacksTo(1).durability(1))); + public static final DeferredItem PRISMARINE_SPEAR = ITEMS.register("prismarine_spear", () -> new PrismarineSpearItem(new Item.Properties().stacksTo(1).durability(100))); + public static final DeferredItem WEAPON_PARTS = ITEMS.register("weapon_parts", () -> new Item(new Item.Properties())); + public static final DeferredItem MUSIC_DISC_SEAFOAM = ITEMS.register("music_disc_seafoam", () -> new Item(new Item.Properties().component(DataComponents.JUKEBOX_PLAYABLE, new JukeboxPlayable(new EitherHolder<>(UFSounds.SEAFOAM_SONG), true)).stacksTo(1).rarity(Rarity.RARE))); + // Buckets + public static final DeferredItem AERO_MONO_BUCKET = ITEMS.register("aero_mono_bucket", () -> new UFFishBucketItem(UFEntities.AERO_MONO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem RHINO_TETRA_BUCKET = ITEMS.register("rhino_tetra_bucket", () -> new UFFishBucketItem(UFEntities.RHINO_TETRA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem DUALITY_DAMSELFISH_BUCKET = ITEMS.register("duality_damselfish_bucket", () -> new UFFishBucketItem(UFEntities.DUALITY_DAMSELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem DROOPING_GOURAMI_BUCKET = ITEMS.register("drooping_gourami_bucket", () -> new UFFishBucketItem(UFEntities.DROOPING_GOURAMI, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem MOSSTHORN_BUCKET = ITEMS.register("mossthorn_bucket", () -> new UFFishBucketItem(UFEntities.MOSSTHORN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SAILOR_BARB_BUCKET = ITEMS.register("sailor_barb_bucket", () -> new UFFishBucketItem(UFEntities.SAILOR_BARB, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem TRIPLE_TWIRL_PLECO_BUCKET = ITEMS.register("triple_twirl_pleco_bucket", () -> new UFFishBucketItem(UFEntities.TRIPLE_TWIRL_PLECO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SPINDLEFISH_BUCKET = ITEMS.register("spindlefish_bucket", () -> new UFFishBucketItem(UFEntities.SPINDLEFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem RIPPER_BUCKET = ITEMS.register("ripper_bucket", () -> new UFFishBucketItem(UFEntities.RIPPER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SEA_SPIDER_BUCKET = ITEMS.register("sea_spider_bucket", () -> new UFFishBucketItem(UFEntities.SEA_SPIDER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem CLOWNTHORN_SHARK_BUCKET = ITEMS.register("clownthorn_shark_bucket", () -> new UFFishBucketItem(UFEntities.CLOWNTHORN_SHARK, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + //public static final DeferredItem STARGAZER = ITEMS.register("stargazer", () -> new StargazerItem(new Item.Properties().tab(UnusualFishMod.UNUSUAL_TAB).stacksTo(1))); + public static final DeferredItem SNEEPSNORP_BUCKET = ITEMS.register("sneepsnorp_bucket", () -> new UFFishBucketItem(UFEntities.SNEEPSNORP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BLACKCAP_SNAIL_BUCKET = ITEMS.register("blackcap_snail_bucket", () -> new UFFishBucketItem(UFEntities.BLACKCAP_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BRICK_SNAIL_BUCKET = ITEMS.register("brick_snail_bucket", () -> new UFFishBucketItem(UFEntities.BRICK_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem DEEP_CRAWLER_BUCKET = ITEMS.register("deep_crawler_bucket", () -> new UFFishBucketItem(UFEntities.DEEP_CRAWLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem WIZARD_JELLY_BUCKET = ITEMS.register("wizard_jelly_bucket", () -> new UFFishBucketItem(UFEntities.WIZARD_JELLY, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem PORCUPINE_LOBSTA_BUCKET = ITEMS.register("porcupine_lobsta_bucket", () -> new UFFishBucketItem(UFEntities.PORCUPINE_LOBSTA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem FRESHWATER_MANTIS_BUCKET = ITEMS.register("freshwater_mantis_bucket", () -> new UFFishBucketItem(UFEntities.FRESHWATER_MANTIS, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BARK_ANGELFISH_BUCKET = ITEMS.register("bark_angelfish_bucket", () -> new UFFishBucketItem(UFEntities.BARK_ANGELFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SKIPPER_BUCKET = ITEMS.register("lobed_skipper_bucket", () -> new UFFishBucketItem(UFEntities.LOBED_SKIPPER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BEAKED_HERRING_BUCKET = ITEMS.register("beaked_herring_bucket", () -> new UFFishBucketItem(UFEntities.BEAKED_HERRING, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem PICKLEFISH_BUCKET = ITEMS.register("picklefish_bucket", () -> new UFFishBucketItem(UFEntities.PICKLEFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BLIND_SAILFIN_BUCKET = ITEMS.register("blind_sailfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIND_SAILFIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem DEMON_HERRING_BUCKET = ITEMS.register("demon_herring_bucket", () -> new UFFishBucketItem(UFEntities.DEMON_HERRING, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem AMBER_GOBY_BUCKET = ITEMS.register("amber_goby_bucket", () -> new UFFishBucketItem(UFEntities.AMBER_GOBY, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem HATCHET_FISH_BUCKET = ITEMS.register("hatchet_fish_bucket", () -> new UFFishBucketItem(UFEntities.HATCHET_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem COPPERFLAME_BUCKET = ITEMS.register("copperflame_bucket", () -> new UFFishBucketItem(UFEntities.COPPERFLAME, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SQUODDLE_BUCKET = ITEMS.register("squoddle_bucket", () -> new UFFishBucketItem(UFEntities.SQUODDLE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SEA_MOSQUITO_BUCKET = ITEMS.register("sea_mosquito_bucket", () -> new UFFishBucketItem(UFEntities.SEA_MOSQUITO, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem FORKFISH_BUCKET = ITEMS.register("forkfish_bucket", () -> new UFFishBucketItem(UFEntities.FORKFISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SPOON_SHARK_BUCKET = ITEMS.register("spoon_shark_bucket", () -> new UFFishBucketItem(UFEntities.SPOON_SHARK, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem CORAL_SKRIMP_BUCKET = ITEMS.register("coral_skrimp_bucket", () -> new UFFishBucketItem(UFEntities.CORAL_SKRIMP, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem CIRCUS_FISH_BUCKET = ITEMS.register("circus_fish_bucket", () -> new UFFishBucketItem(UFEntities.CIRCUS_FISH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem EYELASH_FISH_BUCKET = ITEMS.register("eyelash_fish_bucket", () -> new UFFishBucketItem(UFEntities.EYELASH, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem FROSTY_FIN_FISH_BUCKET = ITEMS.register("frosty_fin_fish_bucket", () -> new UFFishBucketItem(UFEntities.FROSTY_FIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem CRIMSONSHELL_SQUID_BUCKET = ITEMS.register("crimsonshell_squid_bucket", () -> new UFFishBucketItem(UFEntities.CRIMSONSHELL_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem VOLT_ANGLER_BUCKET = ITEMS.register("volt_angler_bucket", () -> new UFFishBucketItem(UFEntities.VOLT_ANGLER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem BLIZZARDFIN_BUCKET = ITEMS.register("blizzardfin_bucket", () -> new UFFishBucketItem(UFEntities.BLIZZARDFIN_TUNA, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem MUDDYTOP_SNAIL_BUCKET = ITEMS.register("muddytop_snail_bucket", () -> new UFFishBucketItem(UFEntities.MUDDYTOP_SNAIL, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem SHOCKCAT_BUCKET = ITEMS.register("shockcat_bucket", () -> new UFFishBucketItem(UFEntities.SHOCKCAT, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem PINKFIN_IDOL_BUCKET = ITEMS.register("pinkfin_idol_bucket", () -> new UFFishBucketItem(UFEntities.PINKFIN, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem TIGER_PUFFER_BUCKET = ITEMS.register("tiger_puffer_bucket", () -> new UFFishBucketItem(UFEntities.TIGER_PUFFER, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem STOUT_BICHIR_BUCKET = ITEMS.register("stout_bichir_bucket", () -> new UFFishBucketItem(UFEntities.STOUT_BICHIR, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem TRIBBLE_BUCKET = ITEMS.register("tribble_bucket", () -> new UFFishBucketItem(UFEntities.TRIBBLE, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + public static final DeferredItem TRUMPET_SQUID_BUCKET = ITEMS.register("trumpet_squid_bucket", () -> new UFFishBucketItem(UFEntities.TRUMPET_SQUID, () -> Fluids.WATER, Items.BUCKET, false, new Item.Properties().stacksTo(1))); + // Spawn Eggs + public static final DeferredItem AERO_MONO_SPAWN_EGG = ITEMS.register("aero_mono_spawn_egg", () -> new SpawnEggItem(UFEntities.AERO_MONO.get(), 0x8ca8b5, 0x506884, new Item.Properties())); + public static final DeferredItem PINKFIN_SPAWN_EGG = ITEMS.register("pinkfin_spawn_egg", () -> new SpawnEggItem(UFEntities.PINKFIN.get(), 0x0e011e, 0x421054, new Item.Properties())); + public static final DeferredItem BARBED_SPAWN_EGG = ITEMS.register("roughback_guitarfish_spawn_egg", () -> new SpawnEggItem(UFEntities.ROUGHBACK.get(), 0x5e5d4f, 0x92998e, new Item.Properties())); + public static final DeferredItem CLOWNTHORN_SPAWN_EGG = ITEMS.register("clownthorn_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.CLOWNTHORN_SHARK.get(), 0xbe5515, 0xa21e00, new Item.Properties())); + public static final DeferredItem DUALITY_SPAWN_EGG = ITEMS.register("duality_damselfish_spawn_egg", () -> new SpawnEggItem(UFEntities.DUALITY_DAMSELFISH.get(), 0x8a94a1, 0x2c3338, new Item.Properties())); + public static final DeferredItem DROOPING_GOURAMI_SPAWN_EGG = ITEMS.register("drooping_gourami_spawn_egg", () -> new SpawnEggItem(UFEntities.DROOPING_GOURAMI.get(), 0x54434d, 0x363243, new Item.Properties())); + public static final DeferredItem MOSSTHORN_SPAWN_EGG = ITEMS.register("mossthorn_spawn_egg", () -> new SpawnEggItem(UFEntities.MOSSTHORN.get(), 0x26a529, 0x034223, new Item.Properties())); + public static final DeferredItem RHINO_TETRA_SPAWN_EGG = ITEMS.register("rhino_tetra_spawn_egg", () -> new SpawnEggItem(UFEntities.RHINO_TETRA.get(), 0x919187, 0x7b2726, new Item.Properties())); + public static final DeferredItem RIPPER_SPAWN_EGG = ITEMS.register("ripper_spawn_egg", () -> new SpawnEggItem(UFEntities.RIPPER.get(), 0x565950, 0x8f9386, new Item.Properties())); + public static final DeferredItem SAILOR_BARB_PAWN_EGG = ITEMS.register("sailor_barb_spawn_egg", () -> new SpawnEggItem(UFEntities.SAILOR_BARB.get(), 0x5e6a25, 0xa1a68c, new Item.Properties())); + public static final DeferredItem SEA_PANCAKE_SPAWN_EGG = ITEMS.register("sea_pancake_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_PANCAKE.get(), 0xbda877, 0xdfcbb7, new Item.Properties())); + public static final DeferredItem SEA_SPIDER_SPAWN_EGG = ITEMS.register("sea_spider_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_SPIDER.get(), 0x774128, 0xaf7834, new Item.Properties())); + public static final DeferredItem SPINDLEFISH_SPAWN_EGG = ITEMS.register("spindlefish_spawn_egg", () -> new SpawnEggItem(UFEntities.SPINDLEFISH.get(), 0x8e2573, 0xc14aeb, new Item.Properties())); + public static final DeferredItem TRIPLE_TWIRL_PLECO_SPAWN_EGG = ITEMS.register("triple_twirl_pleco_spawn_egg", () -> new SpawnEggItem(UFEntities.TRIPLE_TWIRL_PLECO.get(), 0xc1923a, 0x903113, new Item.Properties())); + public static final DeferredItem BRICK_SNAIL_SPAWN_EGG = ITEMS.register("brick_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.BRICK_SNAIL.get(), 0xb5553b, 0x674f17, new Item.Properties())); + public static final DeferredItem ZEBRA_CORNETFISH_SPAWN_EGG = ITEMS.register("zebra_cornetfish_spawn_egg", () -> new SpawnEggItem(UFEntities.ZEBRA_CORNETFISH.get(), 0x153957, 0xc7ad0d, new Item.Properties())); + public static final DeferredItem TIGER_PUFFER_SPAWN_EGG = ITEMS.register("tiger_puffer_spawn_egg", () -> new SpawnEggItem(UFEntities.TIGER_PUFFER.get(), 0x622814, 0x84736f, new Item.Properties())); + public static final DeferredItem BLACKCAP_SNAIL_SPAWN_EGG = ITEMS.register("blackcap_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.BLACKCAP_SNAIL.get(), 0x262917, 0x4c3d27, new Item.Properties())); + public static final DeferredItem SNEEPSNORP_EGG = ITEMS.register("sneepsnorp_spawn_egg", () -> new SpawnEggItem(UFEntities.SNEEPSNORP.get(), 0x3347a7, 0xce8a24, new Item.Properties())); + public static final DeferredItem DEEP_CRAWLER_SPAWN_EGG = ITEMS.register("deep_crawler_spawn_egg", () -> new SpawnEggItem(UFEntities.DEEP_CRAWLER.get(), 0x536761, 0x34363f, new Item.Properties())); + public static final DeferredItem WIZARD_JELLY_SPAWN_EGG = ITEMS.register("wizard_jelly_spawn_egg", () -> new SpawnEggItem(UFEntities.WIZARD_JELLY.get(), 0x5550b4, 0x3aa8d7, new Item.Properties())); + public static final DeferredItem PORCUPINE_LOBSTA_SPAWN_EGG = ITEMS.register("porcupine_lobsta_spawn_egg", () -> new SpawnEggItem(UFEntities.PORCUPINE_LOBSTA.get(), 0x624736, 0x9e521b, new Item.Properties())); + public static final DeferredItem TRUMPET_SQUID_SPAWN_EGG = ITEMS.register("trumpet_squid_spawn_egg", () -> new SpawnEggItem(UFEntities.TRUMPET_SQUID.get(), 0xe8d26a, 0xc6a042, new Item.Properties())); + public static final DeferredItem FRESHWATER_MANTIS_EGG = ITEMS.register("freshwater_mantis_spawn_egg", () -> new SpawnEggItem(UFEntities.FRESHWATER_MANTIS.get(), 0x454629, 0x94ab67, new Item.Properties())); + public static final DeferredItem BARK_ANGELFISH_SPAWN_EGG = ITEMS.register("bark_angelfish_spawn_egg", () -> new SpawnEggItem(UFEntities.BARK_ANGELFISH.get(), 0x553f1a, 0x35270a, new Item.Properties())); + public static final DeferredItem SHOCKCAT_SPAWN_EGG = ITEMS.register("shockcat_spawn_egg", () -> new SpawnEggItem(UFEntities.SHOCKCAT.get(), 0x34294f, 0x255f9b, new Item.Properties())); + public static final DeferredItem MUDDYTOP_SNAIL_SPAWN_EGG = ITEMS.register("muddytop_snail_spawn_egg", () -> new SpawnEggItem(UFEntities.MUDDYTOP_SNAIL.get(), 0x23100e, 0x5f4d3b, new Item.Properties())); + public static final DeferredItem KALAPPA_SPAWN_EGG = ITEMS.register("kalappa_spawn_egg", () -> new SpawnEggItem(UFEntities.KALAPPA.get(), 0x624051, 0x886d86, new Item.Properties())); + public static final DeferredItem LOBED_SKIPPER_SPAWN_EGG = ITEMS.register("lobed_skipper_spawn_egg", () -> new SpawnEggItem(UFEntities.LOBED_SKIPPER.get(), 0x4b2618, 0x9e632f, new Item.Properties())); + public static final DeferredItem STOUT_BICHIR_SPAWN_EGG = ITEMS.register("stout_bichir_spawn_egg", () -> new SpawnEggItem(UFEntities.STOUT_BICHIR.get(), 0x5a5e3d, 0xb08f33, new Item.Properties())); + public static final DeferredItem BEAKED_HERRING_SPAWN_EGG = ITEMS.register("beaked_herring_spawn_egg", () -> new SpawnEggItem(UFEntities.BEAKED_HERRING.get(), 0x8bacc4, 0xc5d0cf, new Item.Properties())); + public static final DeferredItem PICKLEFISH_SPAWN_EGG = ITEMS.register("picklefish_spawn_egg", () -> new SpawnEggItem(UFEntities.PICKLEFISH.get(), 0x235806, 0xd0cd07, new Item.Properties())); + public static final DeferredItem BLIND_SAILFIN_SPAWN_EGG = ITEMS.register("blind_sailfin_spawn_egg", () -> new SpawnEggItem(UFEntities.BLIND_SAILFIN.get(), 0xdcccc3, 0xc19c8e, new Item.Properties())); + public static final DeferredItem DEMON_HERRING_SPAWN_EGG = ITEMS.register("demon_herring_spawn_egg", () -> new SpawnEggItem(UFEntities.DEMON_HERRING.get(), 0x363243, 0xef7930, new Item.Properties())); + public static final DeferredItem AMBER_GOBY_SPAWN_EGG = ITEMS.register("amber_goby_spawn_egg", () -> new SpawnEggItem(UFEntities.AMBER_GOBY.get(), 0xfb912e, 0xae5e2c, new Item.Properties())); + public static final DeferredItem HATCHET_FISH_SPAWN_EGG = ITEMS.register("hatchet_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.HATCHET_FISH.get(), 0x0b0b26, 0x7d3283, new Item.Properties())); + public static final DeferredItem COPPERFLAME_SPAWN_EGG = ITEMS.register("copperflame_spawn_egg", () -> new SpawnEggItem(UFEntities.COPPERFLAME.get(), 0x4fab90, 0x7fcf90, new Item.Properties())); + public static final DeferredItem ROOTBALL_SPAWN_EGG = ITEMS.register("root_spawn_egg", () -> new SpawnEggItem(UFEntities.ROOTBALL.get(), 0x647233, 0xad7d65, new Item.Properties())); + public static final DeferredItem CELESTIAL_FISH_SPAWN_EGG = ITEMS.register("celestial_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.CELESTIAL_FISH.get(), 0x6876a2, 0xe2e4c5, new Item.Properties())); + public static final DeferredItem GNASHER_SPAWN_EGG = ITEMS.register("gnasher_spawn_egg", () -> new SpawnEggItem(UFEntities.GNASHER.get(), 0x323232, 0x465bb2, new Item.Properties())); + public static final DeferredItem PRAWN_SPAWN_EGG = ITEMS.register("prawn_spawn_egg", () -> new SpawnEggItem(UFEntities.PRAWN.get(), 0x5a579e, 0x4694d1, new Item.Properties())); + public static final DeferredItem SQUODDLE_SPAWN_EGG = ITEMS.register("squoddle_spawn_egg", () -> new SpawnEggItem(UFEntities.SQUODDLE.get(), 0xb37817, 0xe58a2e, new Item.Properties())); + public static final DeferredItem SEA_MOSQUITO_SPAWN_EGG = ITEMS.register("sea_mosquito_spawn_egg", () -> new SpawnEggItem(UFEntities.SEA_MOSQUITO.get(), 0x326934, 0x6c122f, new Item.Properties())); + public static final DeferredItem FORKFISH_SPAWN_EGG = ITEMS.register("forkfish_spawn_egg", () -> new SpawnEggItem(UFEntities.FORKFISH.get(), 0x8e882c, 0x3dbba0, new Item.Properties())); + public static final DeferredItem SPOON_SHARK_SPAWN_EGG = ITEMS.register("spoon_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.SPOON_SHARK.get(), 0xddbd78, 0xb3925b, new Item.Properties())); + public static final DeferredItem CORAL_SKRIMP_EGG = ITEMS.register("coral_skrimp_spawn_egg", () -> new SpawnEggItem(UFEntities.CORAL_SKRIMP.get(), 0x5a0e7a, 0xb34aa2, new Item.Properties())); + public static final DeferredItem CIRCUS_FISH_SPAWN_EGG = ITEMS.register("circus_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.CIRCUS_FISH.get(), 0xab4b36, 0xc88f62, new Item.Properties())); + public static final DeferredItem BLIZZARDFIN_SPAWN_EGG = ITEMS.register("blizzardfin_spawn_egg", () -> new SpawnEggItem(UFEntities.BLIZZARDFIN_TUNA.get(), 0x9ed7dc, 0x6182a6, new Item.Properties())); + public static final DeferredItem EYELASH_FISH_SPAWN_EGG = ITEMS.register("eyelash_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.EYELASH.get(), 0xb7b7ba, 0xfcfcfa, new Item.Properties())); + public static final DeferredItem FROSTY_FIN_FISH_SPAWN_EGG = ITEMS.register("frosty_fin_fish_spawn_egg", () -> new SpawnEggItem(UFEntities.FROSTY_FIN.get(), 0x649ccc, 0xcbe8e6, new Item.Properties())); + public static final DeferredItem TIGER_JUNGLE_SHARK_SPAWN_EGG = ITEMS.register("tiger_jungle_shark_spawn_egg", () -> new SpawnEggItem(UFEntities.TIGER_JUNGLE_SHARK.get(), 0x272530, 0xa5a8c6, new Item.Properties())); + public static final DeferredItem CRIMSONSHELL_SQUID_SPAWN_EGG = ITEMS.register("crimsonshell_squid_spawn_egg", () -> new SpawnEggItem(UFEntities.CRIMSONSHELL_SQUID.get(), 0xab101c, 0x432c39, new Item.Properties())); + public static final DeferredItem VOLT_ANGLER_SPAWN_EGG = ITEMS.register("volt_angler_spawn_egg", () -> new SpawnEggItem(UFEntities.VOLT_ANGLER.get(), 0x2d4035, 0x509033, new Item.Properties())); + public static final DeferredItem TRIBBLE_SPAWN_EGG = ITEMS.register("tribble_spawn_egg", () -> new SpawnEggItem(UFEntities.TRIBBLE.get(), 0x656f26, 0x46491a, new Item.Properties())); + private static final ChatFormatting TITLE_FORMAT = ChatFormatting.GRAY; + private static final ChatFormatting DESCRIPTION_FORMAT = ChatFormatting.BLUE; + private static final Component ANCIENT_WEAPON_UPGRADE = Component.translatable(Util.makeDescriptionId("upgrade", loc("ancient_weapon_upgrade"))).withStyle(TITLE_FORMAT); + private static final Component ANCIENT_WEAPON_APPLIES_TO = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.applies_to"))).withStyle(DESCRIPTION_FORMAT); + private static final Component ANCIENT_WEAPON_INGREDIENTS = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.ingredients"))).withStyle(DESCRIPTION_FORMAT); + private static final Component ANCIENT_WEAPON_BASE_SLOT_DESCRIPTION = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.base_slot_description"))); + private static final Component ANCIENT_WEAPON_ADDITIONS_SLOT_DESCRIPTION = Component.translatable(Util.makeDescriptionId("item", loc("smithing_template.ancient_weapon_parts.additions_slot_description"))); + private static final ResourceLocation EMPTY_SLOT_WEAPON_PARTS = loc("item/empty_slot_weapon_parts"); + private static final ResourceLocation EMPTY_SLOT_DEPTH_CLAW = loc("item/empty_slot_depth_claw"); + private static final ResourceLocation EMPTY_SLOT_RIPPER_TOOTH = loc("item/empty_slot_ripper_tooth"); + public static final DeferredItem ANCIENT_WEAPON_SMITHING_TEMPLATE = ITEMS.register("ancient_weapon_smithing_template", () -> new SmithingTemplateItem(ANCIENT_WEAPON_APPLIES_TO, ANCIENT_WEAPON_INGREDIENTS, ANCIENT_WEAPON_UPGRADE, ANCIENT_WEAPON_ADDITIONS_SLOT_DESCRIPTION, ANCIENT_WEAPON_BASE_SLOT_DESCRIPTION, List.of(EMPTY_SLOT_WEAPON_PARTS), List.of(EMPTY_SLOT_DEPTH_CLAW, EMPTY_SLOT_RIPPER_TOOTH))); +} diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFLootModifiers.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFLootModifiers.java index 4242c4a..07bd9ba 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFLootModifiers.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFLootModifiers.java @@ -11,9 +11,9 @@ import net.neoforged.neoforge.registries.NeoForgeRegistries; public class UFLootModifiers { - public static final DeferredRegister> LOOT_MODIFIERS = DeferredRegister.create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, UnusualFishMod.MOD_ID); + public static final DeferredRegister> LOOT_MODIFIERS = DeferredRegister.create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, UnusualFishMod.MOD_ID); - public static final DeferredHolder, MapCodec> UNUSUAL_CATCH_LOOT_MODIFIER = LOOT_MODIFIERS.register("unusual_catch_glm", () -> UnusualCatchLootModifier.CODEC); - public static final DeferredHolder, MapCodec> UNDERWATER_RUINS_LOOT_MODIFIER = LOOT_MODIFIERS.register("underwater_ruins_glm", () -> UnderwaterRuinsLootModifier.CODEC); - public static final DeferredHolder, MapCodec> BURIED_TREASURE_LOOT_MODIFIER = LOOT_MODIFIERS.register("buried_treasure_glm", () -> BuriedTreasureLootModifier.CODEC); + public static final DeferredHolder, MapCodec> UNUSUAL_CATCH_LOOT_MODIFIER = LOOT_MODIFIERS.register("unusual_catch_glm", () -> UnusualCatchLootModifier.CODEC); + public static final DeferredHolder, MapCodec> UNDERWATER_RUINS_LOOT_MODIFIER = LOOT_MODIFIERS.register("underwater_ruins_glm", () -> UnderwaterRuinsLootModifier.CODEC); + public static final DeferredHolder, MapCodec> BURIED_TREASURE_LOOT_MODIFIER = LOOT_MODIFIERS.register("buried_treasure_glm", () -> BuriedTreasureLootModifier.CODEC); } \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java index 896015e..9bbd0f2 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFSounds.java @@ -23,7 +23,7 @@ public class UFSounds { public static final DeferredHolder SAWING = createSoundEvent("sawing"); public static final DeferredHolder MUSIC_DISC_SEAFOAM = createSoundEvent("seafoam"); - public static final ResourceKey SEAFOAM_SONG = ResourceKey.create( Registries.JUKEBOX_SONG, UnusualFishMod.loc("seafoam")); + public static final ResourceKey SEAFOAM_SONG = ResourceKey.create(Registries.JUKEBOX_SONG, UnusualFishMod.loc("seafoam")); private static DeferredHolder createSoundEvent(final String name) { return SOUND_EVENTS.register(name, () -> SoundEvent.createVariableRangeEvent(loc(name))); diff --git a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java index 9d373ed..9c38b51 100644 --- a/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java +++ b/src/main/java/codyhuh/unusualfishmod/core/registry/UFTabs.java @@ -6,6 +6,7 @@ import net.minecraft.world.item.CreativeModeTab; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; + public class UFTabs { public static final DeferredRegister CREATIVE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, UnusualFishMod.MOD_ID); From 9f74ddf33ed87c1b380f78278696a0bbf46890c5 Mon Sep 17 00:00:00 2001 From: Chakyl Date: Wed, 17 Jun 2026 18:10:49 -0400 Subject: [PATCH 07/12] seaspike saving error --- gradle.properties | 2 +- .../codyhuh/unusualfishmod/common/entity/item/SeaSpike.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 5e773da..7e6b891 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,6 +39,6 @@ mod_version=1.21.1-1.1.10 # See https://maven.apache.org/guides/mini/guide-naming-conventions.html mod_group_id=codyhuh.unusualfishmod # The authors of the mod. This is a simple text string that is used for display purposes in the mod list. -mod_authors=codyhuh (code), OmayPaty (art), Peeko (former author), Chakyl (Code) +mod_authors=codyhuh (code), OmayPaty (art), Peeko (former author), Chakyl (1.21.1 port) # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. mod_description=A mod that adds a variety of new aquatic creatures, both useful and aesthetic! \ No newline at end of file diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java b/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java index cca0568..6aea6ef 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/item/SeaSpike.java @@ -6,6 +6,7 @@ import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; @@ -46,12 +47,12 @@ protected float getWaterInertia() { @Override protected ItemStack getPickupItem() { - return ItemStack.EMPTY; + return new ItemStack(Items.ARROW); } @Override protected ItemStack getDefaultPickupItem() { - return ItemStack.EMPTY; + return new ItemStack(Items.ARROW); } @Override From daf7cfdab8aa0d387ec3597023679c684e494846 Mon Sep 17 00:00:00 2001 From: Chakyl Date: Wed, 17 Jun 2026 19:57:20 -0400 Subject: [PATCH 08/12] rhino bucketing --- .../java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java b/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java index a40e7d2..fba964b 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/RhinoTetra.java @@ -81,10 +81,6 @@ public ItemStack getBucketStack() { return new ItemStack(UFItems.RHINO_TETRA_BUCKET.get()); } - protected InteractionResult mobInteract(Player p_27477_, InteractionHand p_27478_) { - return InteractionResult.PASS; - } - protected void registerGoals() { this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); this.goalSelector.addGoal(0, new MeleeAttackGoal(this, 1.0D, true)); From 0bf57570c25b9443ab3bf2d62ea49176d4fc31ac Mon Sep 17 00:00:00 2001 From: Chakyl Date: Thu, 18 Jun 2026 19:11:37 -0400 Subject: [PATCH 09/12] Fix sea mosquito --- .../java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java index 2d7c6a2..8e74e91 100644 --- a/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java +++ b/src/main/java/codyhuh/unusualfishmod/common/entity/SeaMosquito.java @@ -37,7 +37,6 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class SeaMosquito extends BucketableWaterAnimal implements GeoEntity { - private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(SeaMosquito.class, EntityDataSerializers.BOOLEAN); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public SeaMosquito(EntityType entityType, Level level) { From d8791af494b28e44e4b2bbefe41dae3d25962a4a Mon Sep 17 00:00:00 2001 From: Chakyl Date: Thu, 18 Jun 2026 19:36:04 -0400 Subject: [PATCH 10/12] version bump missed in last PR --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 7e6b891..ce630ad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,7 +33,7 @@ mod_name=Unusual Fish Mod # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPLv3 # The mod version. See https://semver.org/ -mod_version=1.21.1-1.1.10 +mod_version=1.21.1-1.1.11 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html From 4730d604243b4c6cb83eecfd6ceb71f7eb078ae1 Mon Sep 17 00:00:00 2001 From: Chakyl Date: Tue, 23 Jun 2026 08:50:23 -0400 Subject: [PATCH 11/12] Fix tags --- gradle.properties | 2 +- .../minecraft/tags/entity_type/aquatic.json | 58 +++++++++++++++++++ .../entity_type/can_breathe_under_water.json | 13 +++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/data/minecraft/tags/entity_type/aquatic.json create mode 100644 src/main/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json diff --git a/gradle.properties b/gradle.properties index ce630ad..0489d49 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,7 +33,7 @@ mod_name=Unusual Fish Mod # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPLv3 # The mod version. See https://semver.org/ -mod_version=1.21.1-1.1.11 +mod_version=1.21.1-1.1.12 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/resources/data/minecraft/tags/entity_type/aquatic.json b/src/main/resources/data/minecraft/tags/entity_type/aquatic.json new file mode 100644 index 0000000..1420c01 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/entity_type/aquatic.json @@ -0,0 +1,58 @@ +{ + "values": [ + "unusualfishmod:duality_damselfish", + "unusualfishmod:mossthorn", + "unusualfishmod:ripper", + "unusualfishmod:spindlefish", + "unusualfishmod:rhino_tetra", + "unusualfishmod:drooping_gourami", + "unusualfishmod:sailor_barb", + "unusualfishmod:sea_spider", + "unusualfishmod:triple_twirl_pleco", + "unusualfishmod:aero_mono", + "unusualfishmod:clownthorn_shark", + "unusualfishmod:roughback_guitarfish", + "unusualfishmod:sea_pancake", + "unusualfishmod:pinkfin", + "unusualfishmod:brick_snail", + "unusualfishmod:zebra_cornetfish", + "unusualfishmod:tiger_puffer", + "unusualfishmod:blackcap_snail", + "unusualfishmod:sneep_snorp", + "unusualfishmod:deep_crawler", + "unusualfishmod:wizard_jelly", + "unusualfishmod:porcupine_lobsta", + "unusualfishmod:trumpet_squid", + "unusualfishmod:freshwater_mantis", + "unusualfishmod:bark_angelfish", + "unusualfishmod:shockcat", + "unusualfishmod:muddytop", + "unusualfishmod:kalappa", + "unusualfishmod:skipper", + "unusualfishmod:stout_bichir", + "unusualfishmod:beaked_herring", + "unusualfishmod:picklefish", + "unusualfishmod:blindsailfin", + "unusualfishmod:demon_herring", + "unusualfishmod:amber_goby", + "unusualfishmod:hatchet_fish", + "unusualfishmod:copperflame", + "unusualfishmod:rootball", + "unusualfishmod:celestial", + "unusualfishmod:gnasher", + "unusualfishmod:prawn", + "unusualfishmod:squoddle", + "unusualfishmod:sea_mosquito", + "unusualfishmod:forkfish", + "unusualfishmod:spoon_shark", + "unusualfishmod:coral_skrimp", + "unusualfishmod:circus", + "unusualfishmod:blizzardfin", + "unusualfishmod:frostyfin", + "unusualfishmod:eyelash", + "unusualfishmod:jungleshark", + "unusualfishmod:crimsonshell", + "unusualfishmod:volt_angler", + "unusualfishmod:tribble" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json b/src/main/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json new file mode 100644 index 0000000..0ebadfc --- /dev/null +++ b/src/main/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json @@ -0,0 +1,13 @@ +{ + "values": [ + "unusualfishmod:brick_snail", + "unusualfishmod:muddytop", + "unusualfishmod:blackcap_snail", + "unusualfishmod:squoddle", + "unusualfishmod:deep_crawler", + "unusualfishmod:sea_spider", + "unusualfishmod:coral_skrimp", + "unusualfishmod:tribble", + "unusualfishmod:porcupine_lobsta" + ] +} \ No newline at end of file From 2cf80b9f26777afe43dea31a1c11a63e02d293e7 Mon Sep 17 00:00:00 2001 From: Chakyl Date: Fri, 26 Jun 2026 19:05:23 -0400 Subject: [PATCH 12/12] Fix mods.toml --- build.gradle | 1 + gradle.properties | 2 +- src/main/templates/META-INF/neoforge.mods.toml | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e876c6d..15c9e54 100644 --- a/build.gradle +++ b/build.gradle @@ -157,6 +157,7 @@ var generateModMetadata = tasks.register("generateModMetadata", ProcessResources minecraft_version : minecraft_version, minecraft_version_range: minecraft_version_range, neo_version : neo_version, + geckolib_version : geckolib_version, loader_version_range : loader_version_range, mod_authors : mod_authors, mod_description : mod_description, diff --git a/gradle.properties b/gradle.properties index 0489d49..0ffb793 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,7 +33,7 @@ mod_name=Unusual Fish Mod # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPLv3 # The mod version. See https://semver.org/ -mod_version=1.21.1-1.1.12 +mod_version=1.21.1-1.1.13 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml index b8ba29b..3305a55 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -81,6 +81,13 @@ description='''${mod_description}''' ordering="NONE" side="BOTH" +[[dependencies.${ mod_id }]] + modId = "geckolib" + type = "required" + referralUrl = "https://www.curseforge.com/minecraft/mc-mods/geckolib" + versionRange = "[${geckolib_version},]" + ordering = "NONE" + side = "BOTH" # Features are specific properties of the game environment, that you may want to declare you require. This example declares # that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't # stop your mod loading on the server for example.