From 947ff4f6791277900e213c6c6e5333d924a4f77b Mon Sep 17 00:00:00 2001 From: KnightMiner Date: Sun, 30 Oct 2022 01:42:49 -0400 Subject: [PATCH] Implement potion cauldrons No brewing yet, but bottling and tipped arrows works --- src/generated/resources/.cache/cache | 10 +- .../loot_tables/blocks/potion_cauldron.json | 20 +++ .../cauldron/potion/lingering_empty.json | 15 -- .../cauldron/potion/lingering_fill.json | 17 --- .../recipes/cauldron/potion/normal_empty.json | 15 -- .../recipes/cauldron/potion/normal_fill.json | 17 --- .../recipes/cauldron/potion/splash_empty.json | 15 -- .../recipes/cauldron/potion/splash_fill.json | 17 --- .../recipes/cauldron/potion/tipped_arrow.json | 18 --- .../data/minecraft/tags/blocks/cauldrons.json | 3 +- .../datagen/InspirationsBlockLootTable.java | 1 + .../InspirationsBlockTagsProvider.java | 3 +- .../network/CauldronPotionUpdatePacket.java | 50 +++++++ .../common/network/InspirationsNetwork.java | 1 + .../library/recipe/RecipeSerializers.java | 5 - .../special/EmptyPotionCauldronRecipe.java | 137 ------------------ .../special/FillPotionCauldronRecipe.java | 118 --------------- .../recipes/InspirationsRecipes.java | 39 ++++- .../recipes/RecipesClientEvents.java | 18 ++- .../recipes/block/PotionCauldronBlock.java | 24 +++ .../entity/PotionCauldronBlockEntity.java | 77 ++++++++++ .../AbstractModifyCauldronInteraction.java | 4 +- .../cauldron/FillCauldronInteraction.java | 5 +- .../IncreaseLayerCauldronInteraction.java | 33 +---- .../dye/DyeWaterCauldronInteraction.java | 2 +- ...yedBottleIntoWaterCauldronInteraction.java | 2 +- .../dye/MixDyeCauldronInteraction.java | 2 +- .../potion/FillPotionCauldronInteraction.java | 32 ++++ .../potion/PotionIntoEmptyInteraction.java | 46 ++++++ .../potion/PotionIntoPotionCauldron.java | 38 +++++ .../potion/TipArrowCauldronInteraction.java | 33 +++++ .../WaterBottleIntoWaterInteraction.java | 32 ++++ .../cauldron/potion}/package-info.java | 2 +- .../recipes/data/RecipesRecipeProvider.java | 24 +-- .../blockstates/potion_cauldron.json | 7 + .../assets/inspirations/lang/en_us.json | 1 + .../block/cauldron/potion/level_1_of_3.json | 6 + .../block/cauldron/potion/level_2_of_3.json | 6 + .../block/cauldron/potion/level_3_of_3.json | 6 + .../models/cauldron_textures.json | 1 - 40 files changed, 455 insertions(+), 447 deletions(-) create mode 100644 src/generated/resources/data/inspirations/loot_tables/blocks/potion_cauldron.json delete mode 100644 src/generated/resources/data/inspirations/recipes/cauldron/potion/lingering_empty.json delete mode 100644 src/generated/resources/data/inspirations/recipes/cauldron/potion/lingering_fill.json delete mode 100644 src/generated/resources/data/inspirations/recipes/cauldron/potion/normal_empty.json delete mode 100644 src/generated/resources/data/inspirations/recipes/cauldron/potion/normal_fill.json delete mode 100644 src/generated/resources/data/inspirations/recipes/cauldron/potion/splash_empty.json delete mode 100644 src/generated/resources/data/inspirations/recipes/cauldron/potion/splash_fill.json delete mode 100644 src/generated/resources/data/inspirations/recipes/cauldron/potion/tipped_arrow.json create mode 100644 src/main/java/knightminer/inspirations/common/network/CauldronPotionUpdatePacket.java delete mode 100644 src/main/java/knightminer/inspirations/library/recipe/cauldron/special/EmptyPotionCauldronRecipe.java delete mode 100644 src/main/java/knightminer/inspirations/library/recipe/cauldron/special/FillPotionCauldronRecipe.java create mode 100644 src/main/java/knightminer/inspirations/recipes/block/PotionCauldronBlock.java create mode 100644 src/main/java/knightminer/inspirations/recipes/block/entity/PotionCauldronBlockEntity.java create mode 100644 src/main/java/knightminer/inspirations/recipes/cauldron/potion/FillPotionCauldronInteraction.java create mode 100644 src/main/java/knightminer/inspirations/recipes/cauldron/potion/PotionIntoEmptyInteraction.java create mode 100644 src/main/java/knightminer/inspirations/recipes/cauldron/potion/PotionIntoPotionCauldron.java create mode 100644 src/main/java/knightminer/inspirations/recipes/cauldron/potion/TipArrowCauldronInteraction.java create mode 100644 src/main/java/knightminer/inspirations/recipes/cauldron/potion/WaterBottleIntoWaterInteraction.java rename src/main/java/knightminer/inspirations/{library/recipe/cauldron/special => recipes/cauldron/potion}/package-info.java (72%) create mode 100644 src/main/resources/assets/inspirations/blockstates/potion_cauldron.json create mode 100644 src/main/resources/assets/inspirations/models/block/cauldron/potion/level_1_of_3.json create mode 100644 src/main/resources/assets/inspirations/models/block/cauldron/potion/level_2_of_3.json create mode 100644 src/main/resources/assets/inspirations/models/block/cauldron/potion/level_3_of_3.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 82cbe75c..b3010fa9 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -296,6 +296,7 @@ f280ee000a52a10701153862211a994503d2dcc7 data/inspirations/loot_tables/blocks/pi 7206af2b677328855b9a8c284326b308f0bf7968 data/inspirations/loot_tables/blocks/pipe.json 4e0d3a3ec09d691c73314948aa7dce9441acc96a data/inspirations/loot_tables/blocks/plain_mulch.json 454e0edadb6f3abe01e7d41dff87502f4f689ef4 data/inspirations/loot_tables/blocks/potato_soup_cauldron.json +454e0edadb6f3abe01e7d41dff87502f4f689ef4 data/inspirations/loot_tables/blocks/potion_cauldron.json fd327a16d7fecc67ed0602589d5992d985573eb2 data/inspirations/loot_tables/blocks/potted_cyan.json 7e18036dec955f36c49b3e5b8423562a7a24a0af data/inspirations/loot_tables/blocks/potted_paeonia.json 3c3d0d49ae0b7d68544698a754a21a36b7991818 data/inspirations/loot_tables/blocks/potted_rose.json @@ -518,16 +519,9 @@ a5dbcf365ff37b5617a28a057f057ec6ffa6eca1 data/inspirations/recipes/cauldron/ice/ 55b751b5237c3c8dbe171f55604e7c7a94df5923 data/inspirations/recipes/cauldron/potato_soup/item.json 4bc0c49d46ca8634ad03920ad3fc73aa655f3db1 data/inspirations/recipes/cauldron/potion/forge_brewing.json c9de2e3800af3d019d81be1eace6d08e6deb7195 data/inspirations/recipes/cauldron/potion/lingering_bottle.json -3c4d644f1f1072d8a9ada2ff147de2b0bcf15354 data/inspirations/recipes/cauldron/potion/lingering_empty.json -d9c611348b17634f9ea886a154104241a274db34 data/inspirations/recipes/cauldron/potion/lingering_fill.json -47424706c9c3dd50cc12453931821682d18a9f5c data/inspirations/recipes/cauldron/potion/normal_empty.json -49b05c1a42d06cfe853c8519028b6cfe07c2b8d9 data/inspirations/recipes/cauldron/potion/normal_fill.json 386ad3be1ee2b6d03ad0b8ea9024e7eab367f389 data/inspirations/recipes/cauldron/potion/potion_brewing.json d7c18d79d56bd1d40532e86276130c76809f56af data/inspirations/recipes/cauldron/potion/potion_ferment.json f8323b474fafb97b99f72e735540059420e4daf3 data/inspirations/recipes/cauldron/potion/splash_bottle.json -19f63976122e48ba4c58d5966fc3e3f88ba2633b data/inspirations/recipes/cauldron/potion/splash_empty.json -c7e3e2f5fd5b1366c14b1877727c3ba4e2e3dde6 data/inspirations/recipes/cauldron/potion/splash_fill.json -b0846b0af6bfeb156fbc5cbbc5cb23b188ab10b2 data/inspirations/recipes/cauldron/potion/tipped_arrow.json 16a719f79bdc48f49c973b2ccd36073b4601d990 data/inspirations/recipes/tools/barometer.json fcb024c548dc92aa8e9f95e9a558faa00b0a629b data/inspirations/recipes/tools/charged_arrow.json 22d286d6b42e779b94afc402e616f6c1d0bfe320 data/inspirations/recipes/tools/dimension_compass.json @@ -579,7 +573,7 @@ ed609d879b511fc63075a70306670eca432041c0 data/inspirations/tags/items/small_flow 6a070b00a6a93fa6077bad494c8ddc4ab303c4b8 data/inspirations/tags/items/terracotta.json 99552ca43885337f75f5a3b8813d495bf4f7d799 data/minecraft/tags/blocks/bamboo_plantable_on.json 85ffca6ba9dbf11c357e030212a6d171e185ac2e data/minecraft/tags/blocks/carpets.json -481a2abd45593c65e26e102436e3bd78d309904c data/minecraft/tags/blocks/cauldrons.json +16d653c5513b56a9bc7cd437dbaa6806aeadbfcc data/minecraft/tags/blocks/cauldrons.json 5f68bb98fe3d1964c24b8e6a95116911769d5fe8 data/minecraft/tags/blocks/climbable.json de86ddaf84d20985b4cce5e7df18a2fff7832076 data/minecraft/tags/blocks/doors.json 00df993619a2f7d35c51e653f41bc1cda4577e0f data/minecraft/tags/blocks/flower_pots.json diff --git a/src/generated/resources/data/inspirations/loot_tables/blocks/potion_cauldron.json b/src/generated/resources/data/inspirations/loot_tables/blocks/potion_cauldron.json new file mode 100644 index 00000000..80956e06 --- /dev/null +++ b/src/generated/resources/data/inspirations/loot_tables/blocks/potion_cauldron.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:cauldron" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/inspirations/recipes/cauldron/potion/lingering_empty.json b/src/generated/resources/data/inspirations/recipes/cauldron/potion/lingering_empty.json deleted file mode 100644 index 82a11004..00000000 --- a/src/generated/resources/data/inspirations/recipes/cauldron/potion/lingering_empty.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "inspirations:cauldron_empty_potion", - "conditions": [ - { - "prop": "recipes_module", - "type": "inspirations:config" - }, - { - "prop": "cauldron_potions", - "type": "inspirations:config" - } - ], - "potion": "minecraft:lingering_potion", - "bottle": "inspirations:lingering_bottle" -} \ No newline at end of file diff --git a/src/generated/resources/data/inspirations/recipes/cauldron/potion/lingering_fill.json b/src/generated/resources/data/inspirations/recipes/cauldron/potion/lingering_fill.json deleted file mode 100644 index 3395679a..00000000 --- a/src/generated/resources/data/inspirations/recipes/cauldron/potion/lingering_fill.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "inspirations:cauldron_fill_potion", - "conditions": [ - { - "prop": "recipes_module", - "type": "inspirations:config" - }, - { - "prop": "cauldron_potions", - "type": "inspirations:config" - } - ], - "bottle": { - "tag": "forge:lingering_bottles" - }, - "potion": "minecraft:lingering_potion" -} \ No newline at end of file diff --git a/src/generated/resources/data/inspirations/recipes/cauldron/potion/normal_empty.json b/src/generated/resources/data/inspirations/recipes/cauldron/potion/normal_empty.json deleted file mode 100644 index 06893d57..00000000 --- a/src/generated/resources/data/inspirations/recipes/cauldron/potion/normal_empty.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "inspirations:cauldron_empty_potion", - "conditions": [ - { - "prop": "recipes_module", - "type": "inspirations:config" - }, - { - "prop": "cauldron_potions", - "type": "inspirations:config" - } - ], - "potion": "minecraft:potion", - "bottle": "minecraft:glass_bottle" -} \ No newline at end of file diff --git a/src/generated/resources/data/inspirations/recipes/cauldron/potion/normal_fill.json b/src/generated/resources/data/inspirations/recipes/cauldron/potion/normal_fill.json deleted file mode 100644 index 22c5011f..00000000 --- a/src/generated/resources/data/inspirations/recipes/cauldron/potion/normal_fill.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "inspirations:cauldron_fill_potion", - "conditions": [ - { - "prop": "recipes_module", - "type": "inspirations:config" - }, - { - "prop": "cauldron_potions", - "type": "inspirations:config" - } - ], - "bottle": { - "item": "minecraft:glass_bottle" - }, - "potion": "minecraft:potion" -} \ No newline at end of file diff --git a/src/generated/resources/data/inspirations/recipes/cauldron/potion/splash_empty.json b/src/generated/resources/data/inspirations/recipes/cauldron/potion/splash_empty.json deleted file mode 100644 index 900248cf..00000000 --- a/src/generated/resources/data/inspirations/recipes/cauldron/potion/splash_empty.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "inspirations:cauldron_empty_potion", - "conditions": [ - { - "prop": "recipes_module", - "type": "inspirations:config" - }, - { - "prop": "cauldron_potions", - "type": "inspirations:config" - } - ], - "potion": "minecraft:splash_potion", - "bottle": "inspirations:splash_bottle" -} \ No newline at end of file diff --git a/src/generated/resources/data/inspirations/recipes/cauldron/potion/splash_fill.json b/src/generated/resources/data/inspirations/recipes/cauldron/potion/splash_fill.json deleted file mode 100644 index a878f17a..00000000 --- a/src/generated/resources/data/inspirations/recipes/cauldron/potion/splash_fill.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "inspirations:cauldron_fill_potion", - "conditions": [ - { - "prop": "recipes_module", - "type": "inspirations:config" - }, - { - "prop": "cauldron_potions", - "type": "inspirations:config" - } - ], - "bottle": { - "tag": "forge:splash_bottles" - }, - "potion": "minecraft:splash_potion" -} \ No newline at end of file diff --git a/src/generated/resources/data/inspirations/recipes/cauldron/potion/tipped_arrow.json b/src/generated/resources/data/inspirations/recipes/cauldron/potion/tipped_arrow.json deleted file mode 100644 index beaf81cd..00000000 --- a/src/generated/resources/data/inspirations/recipes/cauldron/potion/tipped_arrow.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "inspirations:cauldron_fill_potion", - "conditions": [ - { - "prop": "recipes_module", - "type": "inspirations:config" - }, - { - "prop": "cauldron_tip_arrows", - "type": "inspirations:config" - } - ], - "bottle": { - "item": "minecraft:arrow", - "amount_needed": 16 - }, - "potion": "minecraft:tipped_arrow" -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/cauldrons.json b/src/generated/resources/data/minecraft/tags/blocks/cauldrons.json index 0eabc2f2..adf7dcd9 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/cauldrons.json +++ b/src/generated/resources/data/minecraft/tags/blocks/cauldrons.json @@ -6,6 +6,7 @@ "inspirations:potato_soup_cauldron", "inspirations:rabbit_stew_cauldron", "inspirations:honey_cauldron", - "inspirations:dye_cauldron" + "inspirations:dye_cauldron", + "inspirations:potion_cauldron" ] } \ No newline at end of file diff --git a/src/main/java/knightminer/inspirations/common/datagen/InspirationsBlockLootTable.java b/src/main/java/knightminer/inspirations/common/datagen/InspirationsBlockLootTable.java index c78cd0cf..4edb8dff 100644 --- a/src/main/java/knightminer/inspirations/common/datagen/InspirationsBlockLootTable.java +++ b/src/main/java/knightminer/inspirations/common/datagen/InspirationsBlockLootTable.java @@ -92,6 +92,7 @@ private void addRecipes() { this.dropOther(InspirationsRecipes.rabbitStewCauldron, Blocks.CAULDRON); this.dropOther(InspirationsRecipes.honeyCauldron, Blocks.CAULDRON); this.dropOther(InspirationsRecipes.dyeCauldron, Blocks.CAULDRON); + this.dropOther(InspirationsRecipes.potionCauldron, Blocks.CAULDRON); } private void addTools() { diff --git a/src/main/java/knightminer/inspirations/common/datagen/InspirationsBlockTagsProvider.java b/src/main/java/knightminer/inspirations/common/datagen/InspirationsBlockTagsProvider.java index 205f2ecb..eeeb191a 100644 --- a/src/main/java/knightminer/inspirations/common/datagen/InspirationsBlockTagsProvider.java +++ b/src/main/java/knightminer/inspirations/common/datagen/InspirationsBlockTagsProvider.java @@ -68,7 +68,8 @@ private void registerVanillaTags() { ); this.tag(BlockTags.CAULDRONS).add(InspirationsRecipes.beetrootSoupCauldron, InspirationsRecipes.mushroomStewCauldron, InspirationsRecipes.potatoSoupCauldron, InspirationsRecipes.rabbitStewCauldron, - InspirationsRecipes.honeyCauldron, InspirationsRecipes.dyeCauldron); + InspirationsRecipes.honeyCauldron, + InspirationsRecipes.dyeCauldron, InspirationsRecipes.potionCauldron); } private void registerHarvestTags() { diff --git a/src/main/java/knightminer/inspirations/common/network/CauldronPotionUpdatePacket.java b/src/main/java/knightminer/inspirations/common/network/CauldronPotionUpdatePacket.java new file mode 100644 index 00000000..0bbdd6ef --- /dev/null +++ b/src/main/java/knightminer/inspirations/common/network/CauldronPotionUpdatePacket.java @@ -0,0 +1,50 @@ +package knightminer.inspirations.common.network; + +import knightminer.inspirations.library.MiscUtil; +import knightminer.inspirations.recipes.block.entity.PotionCauldronBlockEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraftforge.network.NetworkEvent.Context; +import net.minecraftforge.registries.ForgeRegistries; +import slimeknights.mantle.network.packet.IThreadsafePacket; +import slimeknights.mantle.util.BlockEntityHelper; + +/** Packet to update the potion in a cauldron */ +public class CauldronPotionUpdatePacket implements IThreadsafePacket { + private final BlockPos pos; + private final Potion potion; + + public CauldronPotionUpdatePacket(BlockPos pos, Potion potion) { + this.pos = pos; + this.potion = potion; + } + + public CauldronPotionUpdatePacket(FriendlyByteBuf buffer) { + this.pos = buffer.readBlockPos(); + this.potion = buffer.readRegistryIdUnsafe(ForgeRegistries.POTIONS); + } + + @Override + public void encode(FriendlyByteBuf buffer) { + buffer.writeBlockPos(pos); + buffer.writeRegistryIdUnsafe(ForgeRegistries.POTIONS, potion); + } + + @Override + public void handleThreadsafe(Context context) { + HandleClient.handle(this); + } + + /** Once removed client class */ + private static class HandleClient { + private static void handle(CauldronPotionUpdatePacket packet) { + BlockEntityHelper.get(PotionCauldronBlockEntity.class, Minecraft.getInstance().level, packet.pos, true).ifPresent(te -> { + if (te.setPotion(packet.potion)) { + MiscUtil.notifyClientUpdate(te); + } + }); + } + } +} diff --git a/src/main/java/knightminer/inspirations/common/network/InspirationsNetwork.java b/src/main/java/knightminer/inspirations/common/network/InspirationsNetwork.java index 1a8f1d5f..6affbbd2 100644 --- a/src/main/java/knightminer/inspirations/common/network/InspirationsNetwork.java +++ b/src/main/java/knightminer/inspirations/common/network/InspirationsNetwork.java @@ -27,6 +27,7 @@ public void setup() { registerPacket(MilkablePacket.class, MilkablePacket::new, NetworkDirection.PLAY_TO_CLIENT); registerPacket(CauldronStateUpdatePacket.class, CauldronStateUpdatePacket::new, NetworkDirection.PLAY_TO_CLIENT); registerPacket(CauldronColorUpdatePacket.class, CauldronColorUpdatePacket::new, NetworkDirection.PLAY_TO_CLIENT); + registerPacket(CauldronPotionUpdatePacket.class, CauldronPotionUpdatePacket::new, NetworkDirection.PLAY_TO_CLIENT); registerPacket(CauldronTransformUpatePacket.class, CauldronTransformUpatePacket::new, NetworkDirection.PLAY_TO_CLIENT); registerPacket(DimensionCompassPositionPacket.class, DimensionCompassPositionPacket::new, NetworkDirection.PLAY_TO_CLIENT); } diff --git a/src/main/java/knightminer/inspirations/library/recipe/RecipeSerializers.java b/src/main/java/knightminer/inspirations/library/recipe/RecipeSerializers.java index 1194fbf4..550393fa 100644 --- a/src/main/java/knightminer/inspirations/library/recipe/RecipeSerializers.java +++ b/src/main/java/knightminer/inspirations/library/recipe/RecipeSerializers.java @@ -3,8 +3,6 @@ import knightminer.inspirations.Inspirations; import knightminer.inspirations.library.recipe.cauldron.recipe.CauldronRecipe; import knightminer.inspirations.library.recipe.cauldron.recipe.CauldronTransform; -import knightminer.inspirations.library.recipe.cauldron.special.EmptyPotionCauldronRecipe; -import knightminer.inspirations.library.recipe.cauldron.special.FillPotionCauldronRecipe; import knightminer.inspirations.library.recipe.crafting.ShapelessNoContainerRecipe; import knightminer.inspirations.recipes.recipe.cauldron.BrewingCauldronRecipe; import knightminer.inspirations.recipes.recipe.cauldron.PotionFermentCauldronTransform; @@ -25,9 +23,6 @@ public class RecipeSerializers { */ public static final CauldronRecipe.Serializer CAULDRON = injected(); public static final CauldronTransform.Serializer CAULDRON_TRANSFORM = injected(); - // advanced recipes - public static final EmptyPotionCauldronRecipe.Serializer CAULDRON_EMPTY_POTION = injected(); - public static final FillPotionCauldronRecipe.Serializer CAULDRON_FILL_POTION = injected(); // special recipes public static final BrewingCauldronRecipe.Serializer CAULDRON_POTION_BREWING = injected(); public static final BrewingCauldronRecipe.Serializer CAULDRON_FORGE_BREWING = injected(); diff --git a/src/main/java/knightminer/inspirations/library/recipe/cauldron/special/EmptyPotionCauldronRecipe.java b/src/main/java/knightminer/inspirations/library/recipe/cauldron/special/EmptyPotionCauldronRecipe.java deleted file mode 100644 index be43b027..00000000 --- a/src/main/java/knightminer/inspirations/library/recipe/cauldron/special/EmptyPotionCauldronRecipe.java +++ /dev/null @@ -1,137 +0,0 @@ -package knightminer.inspirations.library.recipe.cauldron.special; - -import com.google.gson.JsonObject; -import knightminer.inspirations.library.MiscUtil; -import knightminer.inspirations.library.recipe.DynamicFinishedRecipe; -import knightminer.inspirations.library.recipe.RecipeSerializers; -import knightminer.inspirations.library.recipe.cauldron.CauldronContentTypes; -import knightminer.inspirations.library.recipe.cauldron.inventory.ICauldronInventory; -import knightminer.inspirations.library.recipe.cauldron.inventory.IModifyableCauldronInventory; -import knightminer.inspirations.library.recipe.cauldron.recipe.ICauldronRecipe; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionUtils; -import net.minecraft.world.item.alchemy.Potions; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.level.Level; -import slimeknights.mantle.recipe.helper.AbstractRecipeSerializer; -import slimeknights.mantle.recipe.helper.RecipeHelper; - -import javax.annotation.Nullable; -import java.util.Objects; - -/** - * Recipe that drains a potion into the cauldron - */ -public class EmptyPotionCauldronRecipe implements ICauldronRecipe { - private final ResourceLocation id; - private final Item potionItem; - private final Item bottle; - - /** - * Creates a new instance - * @param id Recipe ID - * @param potion Potion item to drain - * @param bottle Potion bottle - */ - public EmptyPotionCauldronRecipe(ResourceLocation id, Item potion, Item bottle) { - this.id = id; - this.potionItem = potion; - this.bottle = bottle; - } - - @Override - public boolean matches(ICauldronInventory inv, Level worldIn) { - // not too full - if (inv.getLevel() == MAX) { - return false; - } - // item must be a potion - ItemStack stack = inv.getStack(); - if (stack.getItem() != potionItem) { - return false; - } - Potion potion = PotionUtils.getPotion(stack); - if (potion == Potions.EMPTY) { - return false; - } - - // contents must be empty or match the given potion - return inv.getLevel() == 0 || inv.getContents() - .get(CauldronContentTypes.POTION) - .map(potion::equals) - .orElse(false); - } - - @Override - public void handleRecipe(IModifyableCauldronInventory inv) { - Potion potion = PotionUtils.getPotion(inv.getStack()); - if (potion != Potions.EMPTY) { - // add levels - inv.addLevel(THIRD); - // update contents - inv.setContents(CauldronContentTypes.POTION.of(potion)); - - // shrink stack - inv.shrinkStack(1); - inv.setOrGiveStack(new ItemStack(bottle)); - - // play sound - inv.playSound(SoundEvents.BOTTLE_EMPTY); - } - } - - @Override - public ResourceLocation getId() { - return id; - } - - @Override - public RecipeSerializer getSerializer() { - return RecipeSerializers.CAULDRON_EMPTY_POTION; - } - - public static class Serializer extends AbstractRecipeSerializer { - @Override - public EmptyPotionCauldronRecipe fromJson(ResourceLocation id, JsonObject json) { - Item potion = MiscUtil.deserializeItem(json, "potion"); - Item bottle = MiscUtil.deserializeItem(json, "bottle"); - return new EmptyPotionCauldronRecipe(id, potion, bottle); - } - - @Nullable - @Override - public EmptyPotionCauldronRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { - Item potion = RecipeHelper.readItem(buffer); - Item bottle = RecipeHelper.readItem(buffer); - return new EmptyPotionCauldronRecipe(id, potion, bottle); - } - - @Override - public void toNetwork(FriendlyByteBuf buffer, EmptyPotionCauldronRecipe recipe) { - RecipeHelper.writeItem(buffer, recipe.potionItem); - RecipeHelper.writeItem(buffer, recipe.bottle); - } - } - - /** Finished recipe for datagen */ - public static class FinishedRecipe extends DynamicFinishedRecipe { - private final Item potionItem; - private final Item bottle; - public FinishedRecipe(ResourceLocation id, Item potionItem, Item bottle) { - super(id, RecipeSerializers.CAULDRON_EMPTY_POTION); - this.potionItem = potionItem; - this.bottle = bottle; - } - - @Override - public void serializeRecipeData(JsonObject json) { - json.addProperty("potion", Objects.requireNonNull(potionItem.getRegistryName()).toString()); - json.addProperty("bottle", Objects.requireNonNull(bottle.getRegistryName()).toString()); - } - } -} diff --git a/src/main/java/knightminer/inspirations/library/recipe/cauldron/special/FillPotionCauldronRecipe.java b/src/main/java/knightminer/inspirations/library/recipe/cauldron/special/FillPotionCauldronRecipe.java deleted file mode 100644 index ed7ac400..00000000 --- a/src/main/java/knightminer/inspirations/library/recipe/cauldron/special/FillPotionCauldronRecipe.java +++ /dev/null @@ -1,118 +0,0 @@ -package knightminer.inspirations.library.recipe.cauldron.special; - -import com.google.gson.JsonObject; -import knightminer.inspirations.library.MiscUtil; -import knightminer.inspirations.library.recipe.DynamicFinishedRecipe; -import knightminer.inspirations.library.recipe.RecipeSerializers; -import knightminer.inspirations.library.recipe.cauldron.CauldronContentTypes; -import knightminer.inspirations.library.recipe.cauldron.inventory.ICauldronInventory; -import knightminer.inspirations.library.recipe.cauldron.inventory.IModifyableCauldronInventory; -import knightminer.inspirations.library.recipe.cauldron.recipe.ICauldronRecipe; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.alchemy.PotionUtils; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.level.Level; -import slimeknights.mantle.recipe.helper.AbstractRecipeSerializer; -import slimeknights.mantle.recipe.helper.RecipeHelper; -import slimeknights.mantle.recipe.ingredient.SizedIngredient; - -import javax.annotation.Nullable; -import java.util.Objects; - -/** - * Recipe to fill a potion bottle using a cauldron - */ -public class FillPotionCauldronRecipe implements ICauldronRecipe { - private final ResourceLocation id; - private final SizedIngredient bottle; - private final Item potionItem; - - /** - * Creates a new potion fill recipe - * @param id Recipe ID - * @param bottle Potion bottle - * @param potionItem Item to output - */ - public FillPotionCauldronRecipe(ResourceLocation id, SizedIngredient bottle, Item potionItem) { - this.id = id; - this.potionItem = potionItem; - this.bottle = bottle; - } - - @Override - public boolean matches(ICauldronInventory inv, Level world) { - // must have at least one level, contain any potion, and be using the correct item - return inv.getLevel() >= THIRD && inv.getContents().contains(CauldronContentTypes.POTION) && bottle.test(inv.getStack()); - } - - @Override - public void handleRecipe(IModifyableCauldronInventory inv) { - inv.getContents().get(CauldronContentTypes.POTION).ifPresent(potion -> { - // give player potion, removing a bottle - int amount = bottle.getAmountNeeded(); - inv.shrinkStack(amount); - inv.setOrGiveStack(PotionUtils.setPotion(new ItemStack(potionItem, amount), potion)); - - // update level - inv.addLevel(-THIRD); - - // play sound - inv.playSound(SoundEvents.BOTTLE_FILL); - }); - } - - @Override - public ResourceLocation getId() { - return id; - } - - @Override - public RecipeSerializer getSerializer() { - return RecipeSerializers.CAULDRON_FILL_POTION; - } - - public static class Serializer extends AbstractRecipeSerializer { - @Override - public FillPotionCauldronRecipe fromJson(ResourceLocation id, JsonObject json) { - SizedIngredient bottle = SizedIngredient.deserialize(GsonHelper.getAsJsonObject(json, "bottle")); - Item potion = MiscUtil.deserializeItem(json, "potion"); - return new FillPotionCauldronRecipe(id, bottle, potion); - } - - @Nullable - @Override - public FillPotionCauldronRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { - SizedIngredient bottle = SizedIngredient.read(buffer); - Item potion = RecipeHelper.readItem(buffer); - return new FillPotionCauldronRecipe(id, bottle, potion); - } - - @Override - public void toNetwork(FriendlyByteBuf buffer, FillPotionCauldronRecipe recipe) { - recipe.bottle.write(buffer); - RecipeHelper.writeItem(buffer, recipe.potionItem); - } - } - - /** Finished recipe for datagen */ - public static class FinishedRecipe extends DynamicFinishedRecipe { - private final SizedIngredient bottle; - private final Item potionItem; - public FinishedRecipe(ResourceLocation id, SizedIngredient bottle, Item potionItem) { - super(id, RecipeSerializers.CAULDRON_FILL_POTION); - this.bottle = bottle; - this.potionItem = potionItem; - } - - @Override - public void serializeRecipeData(JsonObject json) { - json.add("bottle", bottle.serialize()); - json.addProperty("potion", Objects.requireNonNull(potionItem.getRegistryName()).toString()); - } - } -} diff --git a/src/main/java/knightminer/inspirations/recipes/InspirationsRecipes.java b/src/main/java/knightminer/inspirations/recipes/InspirationsRecipes.java index 9eee63d9..d009216c 100644 --- a/src/main/java/knightminer/inspirations/recipes/InspirationsRecipes.java +++ b/src/main/java/knightminer/inspirations/recipes/InspirationsRecipes.java @@ -8,11 +8,11 @@ import knightminer.inspirations.library.recipe.cauldron.contents.ICauldronContents; import knightminer.inspirations.library.recipe.cauldron.recipe.CauldronRecipe; import knightminer.inspirations.library.recipe.cauldron.recipe.CauldronTransform; -import knightminer.inspirations.library.recipe.cauldron.special.EmptyPotionCauldronRecipe; -import knightminer.inspirations.library.recipe.cauldron.special.FillPotionCauldronRecipe; import knightminer.inspirations.recipes.block.DyeCauldronBlock; import knightminer.inspirations.recipes.block.FourLayerCauldronBlock; +import knightminer.inspirations.recipes.block.PotionCauldronBlock; import knightminer.inspirations.recipes.block.entity.DyeCauldronBlockEntity; +import knightminer.inspirations.recipes.block.entity.PotionCauldronBlockEntity; import knightminer.inspirations.recipes.cauldron.DecreaseLayerCauldronInteraction; import knightminer.inspirations.recipes.cauldron.EmptyCauldronInteraction; import knightminer.inspirations.recipes.cauldron.FillCauldronInteraction; @@ -27,6 +27,11 @@ import knightminer.inspirations.recipes.cauldron.dye.DyedBottleIntoWaterCauldronInteraction; import knightminer.inspirations.recipes.cauldron.dye.FillDyedBottleCauldronInteraction; import knightminer.inspirations.recipes.cauldron.dye.MixDyeCauldronInteraction; +import knightminer.inspirations.recipes.cauldron.potion.FillPotionCauldronInteraction; +import knightminer.inspirations.recipes.cauldron.potion.PotionIntoEmptyInteraction; +import knightminer.inspirations.recipes.cauldron.potion.PotionIntoPotionCauldron; +import knightminer.inspirations.recipes.cauldron.potion.TipArrowCauldronInteraction; +import knightminer.inspirations.recipes.cauldron.potion.WaterBottleIntoWaterInteraction; import knightminer.inspirations.recipes.data.RecipesRecipeProvider; import knightminer.inspirations.recipes.item.EmptyBottleItem; import knightminer.inspirations.recipes.item.MixedDyedBottleItem; @@ -51,6 +56,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.ItemLike; @@ -105,12 +111,14 @@ public class InspirationsRecipes extends ModuleBase { public static final Map HONEY_CAULDRON_INTERACTIONS = CauldronInteraction.newInteractionMap(); /** Interactions for the dye cauldron */ public static final Map DYE_CAULDRON_INTERACTIONS = CauldronInteraction.newInteractionMap(); + /** Interactions for the dye cauldron */ + public static final Map POTION_CAULDRON_INTERACTION = CauldronInteraction.newInteractionMap(); // blocks public static FourLayerCauldronBlock mushroomStewCauldron, beetrootSoupCauldron, rabbitStewCauldron, potatoSoupCauldron, honeyCauldron; - public static LayeredCauldronBlock dyeCauldron; + public static LayeredCauldronBlock dyeCauldron, potionCauldron; - public static BlockEntityType dyeCauldronEntity; + public static BlockEntityType dyeCauldronEntity, potionCauldronEntity; // items public static Item splashBottle; @@ -186,6 +194,7 @@ void registerBlocks(Register event) { honeyFluidBlock = registry.registerFluidBlock(() -> honey, Material.WATER, 0, "honey"); dyeCauldron = registry.register(new DyeCauldronBlock(Properties.copy(Blocks.CAULDRON)), "dye_cauldron"); + potionCauldron = registry.register(new PotionCauldronBlock(Properties.copy(Blocks.CAULDRON)), "potion_cauldron"); } @SubscribeEvent @@ -193,6 +202,7 @@ void registerBlockEntity(Register> event) { BlockEntityTypeRegistryAdapter registry = new BlockEntityTypeRegistryAdapter(event.getRegistry()); dyeCauldronEntity = registry.register(DyeCauldronBlockEntity::new, dyeCauldron, "dye_cauldron"); + potionCauldronEntity = registry.register(PotionCauldronBlockEntity::new, potionCauldron, "potion_cauldron"); } @SubscribeEvent @@ -237,8 +247,6 @@ void registerParticleTypes(Register> event) { void registerSerializers(Register> event) { RegistryAdapter> registry = new RegistryAdapter<>(event.getRegistry()); registry.register(new CauldronRecipe.Serializer(), "cauldron"); - registry.register(new EmptyPotionCauldronRecipe.Serializer(), "cauldron_empty_potion"); - registry.register(new FillPotionCauldronRecipe.Serializer(), "cauldron_fill_potion"); registry.register(new CauldronTransform.Serializer(), "cauldron_transform"); registry.register(new PotionFermentCauldronTransform.Serializer(), "cauldron_potion_ferment"); @@ -492,6 +500,25 @@ void commonSetup(FMLCommonSetupEvent event) { // wash the compass CauldronInteraction.WATER.put(InspirationsTools.dimensionCompass, CauldronInteraction.DYED_ITEM); + + // fill the potion + POTION_CAULDRON_INTERACTION.put(Items.GLASS_BOTTLE, new FillPotionCauldronInteraction(Items.POTION)); + POTION_CAULDRON_INTERACTION.put(splashBottle, new FillPotionCauldronInteraction(Items.SPLASH_POTION)); + POTION_CAULDRON_INTERACTION.put(lingeringBottle, new FillPotionCauldronInteraction(Items.LINGERING_POTION)); + POTION_CAULDRON_INTERACTION.put(Items.ARROW, TipArrowCauldronInteraction.INSTANCE); + // drain the potion + POTION_CAULDRON_INTERACTION.put(Items.POTION, new PotionIntoPotionCauldron(Items.GLASS_BOTTLE)); + POTION_CAULDRON_INTERACTION.put(Items.SPLASH_POTION, new PotionIntoPotionCauldron(splashBottle)); + POTION_CAULDRON_INTERACTION.put(Items.LINGERING_POTION, new PotionIntoPotionCauldron(lingeringBottle)); + // drain the potion into empty, note this replaces the vanilla one, but it's okay as we still make water cauldrons + CauldronInteraction.EMPTY.put(Items.POTION, new PotionIntoEmptyInteraction(Items.GLASS_BOTTLE)); + CauldronInteraction.EMPTY.put(Items.SPLASH_POTION, new PotionIntoEmptyInteraction(splashBottle)); + CauldronInteraction.EMPTY.put(Items.LINGERING_POTION, new PotionIntoEmptyInteraction(lingeringBottle)); + // water cauldrons work with potions, but not splash or lingering + CauldronInteraction.WATER.put(Items.SPLASH_POTION, new WaterBottleIntoWaterInteraction(splashBottle)); + CauldronInteraction.WATER.put(Items.LINGERING_POTION, new WaterBottleIntoWaterInteraction(lingeringBottle)); + CauldronInteraction.WATER.put(splashBottle, new DecreaseLayerCauldronInteraction(PotionUtils.setPotion(new ItemStack(Items.SPLASH_POTION), Potions.WATER), LayeredCauldronBlock.LEVEL, true, SoundEvents.BOTTLE_FILL)); + CauldronInteraction.WATER.put(lingeringBottle, new DecreaseLayerCauldronInteraction(PotionUtils.setPotion(new ItemStack(Items.LINGERING_POTION), Potions.WATER), LayeredCauldronBlock.LEVEL, true, SoundEvents.BOTTLE_FILL)); }); // inject new cauldron blocks into the leatherworker point of interest diff --git a/src/main/java/knightminer/inspirations/recipes/RecipesClientEvents.java b/src/main/java/knightminer/inspirations/recipes/RecipesClientEvents.java index ca4b4104..2501f067 100644 --- a/src/main/java/knightminer/inspirations/recipes/RecipesClientEvents.java +++ b/src/main/java/knightminer/inspirations/recipes/RecipesClientEvents.java @@ -7,14 +7,19 @@ import knightminer.inspirations.library.client.CustomTextureLoader; import knightminer.inspirations.library.client.model.CauldronModel; import knightminer.inspirations.recipes.block.entity.DyeCauldronBlockEntity; +import knightminer.inspirations.recipes.block.entity.PotionCauldronBlockEntity; import knightminer.inspirations.recipes.client.BoilingParticle; import knightminer.inspirations.recipes.item.MixedDyedBottleItem; import net.minecraft.client.Minecraft; +import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.server.packs.resources.ReloadableResourceManager; import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; @@ -57,7 +62,8 @@ static void clientSetup(FMLClientSetupEvent event) { @SubscribeEvent static void registerBlockColors(ColorHandlerEvent.Block event) { - event.getBlockColors().register((state, level, pos, index) -> { + BlockColors colors = event.getBlockColors(); + colors.register((state, level, pos, index) -> { if (index == 0 && level != null && pos != null) { BlockEntity be = level.getBlockEntity(pos); if (be != null && be.getType() == InspirationsRecipes.dyeCauldronEntity) { @@ -66,6 +72,16 @@ static void registerBlockColors(ColorHandlerEvent.Block event) { } return -1; }, InspirationsRecipes.dyeCauldron); + colors.register((state, level, pos, index) -> { + if (index == 0 && level != null && pos != null) { + BlockEntity be = level.getBlockEntity(pos); + if (be != null && be.getType() == InspirationsRecipes.potionCauldronEntity) { + Potion potion = ((PotionCauldronBlockEntity) be).getPotion(); + return potion == Potions.EMPTY ? -1 : PotionUtils.getColor(potion); + } + } + return -1; + }, InspirationsRecipes.potionCauldron); } @SubscribeEvent diff --git a/src/main/java/knightminer/inspirations/recipes/block/PotionCauldronBlock.java b/src/main/java/knightminer/inspirations/recipes/block/PotionCauldronBlock.java new file mode 100644 index 00000000..a16e9119 --- /dev/null +++ b/src/main/java/knightminer/inspirations/recipes/block/PotionCauldronBlock.java @@ -0,0 +1,24 @@ +package knightminer.inspirations.recipes.block; + +import knightminer.inspirations.recipes.InspirationsRecipes; +import knightminer.inspirations.recipes.block.entity.PotionCauldronBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.LayeredCauldronBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import javax.annotation.Nullable; + +/** Cauldron that contains a data instance for the potion */ +public class PotionCauldronBlock extends LayeredCauldronBlock implements EntityBlock { + public PotionCauldronBlock(Properties props) { + super(props, precipitation -> false, InspirationsRecipes.POTION_CAULDRON_INTERACTION); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new PotionCauldronBlockEntity(pos, state); + } +} diff --git a/src/main/java/knightminer/inspirations/recipes/block/entity/PotionCauldronBlockEntity.java b/src/main/java/knightminer/inspirations/recipes/block/entity/PotionCauldronBlockEntity.java new file mode 100644 index 00000000..f42ed890 --- /dev/null +++ b/src/main/java/knightminer/inspirations/recipes/block/entity/PotionCauldronBlockEntity.java @@ -0,0 +1,77 @@ +package knightminer.inspirations.recipes.block.entity; + +import knightminer.inspirations.common.network.CauldronPotionUpdatePacket; +import knightminer.inspirations.common.network.InspirationsNetwork; +import knightminer.inspirations.library.MiscUtil; +import knightminer.inspirations.recipes.InspirationsRecipes; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; +import slimeknights.mantle.block.entity.MantleBlockEntity; + +import java.util.Objects; + +/** Block entity for a cauldron that also holds a potion */ +public class PotionCauldronBlockEntity extends MantleBlockEntity { + private static final String TAG_POTION = "potion"; + private Potion potion = Potions.EMPTY; + public PotionCauldronBlockEntity(BlockPos pos, BlockState state) { + super(InspirationsRecipes.potionCauldronEntity, pos, state); + } + + /** Gets the potion */ + public Potion getPotion() { + return potion; + } + + /** + * Updates the potion, sending the proper packet on the server + * @param potion New potion + * @return True if the potion changed + */ + public boolean setPotion(Potion potion) { + if (potion != this.potion) { + this.potion = potion; + if (level != null && !level.isClientSide) { + InspirationsNetwork.sendToClients(level, worldPosition, new CauldronPotionUpdatePacket(worldPosition, potion)); + } + return true; + } + return false; + } + + @Override + protected boolean shouldSyncOnUpdate() { + return true; + } + + @Override + protected void saveSynced(CompoundTag nbt) { + super.saveSynced(nbt); + + nbt.putString(TAG_POTION, Objects.requireNonNull(potion.getRegistryName()).toString()); + } + + /** Parses a potion from the key */ + private static Potion parsePotion(String key) { + ResourceLocation id = ResourceLocation.tryParse(key); + if (id != null) { + return Objects.requireNonNullElse(ForgeRegistries.POTIONS.getValue(id), Potions.EMPTY); + } + return Potions.EMPTY; + } + + @Override + public void load(CompoundTag nbt) { + super.load(nbt); + + potion = parsePotion(nbt.getString(TAG_POTION)); + if (level != null && level.isClientSide) { + MiscUtil.notifyClientUpdate(this); + } + } +} diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/AbstractModifyCauldronInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/AbstractModifyCauldronInteraction.java index 1fef28d8..deba68af 100644 --- a/src/main/java/knightminer/inspirations/recipes/cauldron/AbstractModifyCauldronInteraction.java +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/AbstractModifyCauldronInteraction.java @@ -36,11 +36,11 @@ protected void afterSetBlock(BlockState oldState, Level level, BlockPos pos, Ite /** Gets the new block state based on the old block state, or null if unable to change */ @Nullable - protected abstract BlockState getNewState(BlockState oldState); + protected abstract BlockState getNewState(BlockState oldState, Level level, BlockPos pos, ItemStack filledStack); @Override public InteractionResult interact(BlockState oldState, Level level, BlockPos pos, Player player, InteractionHand hand, ItemStack filledStack) { - BlockState newState = getNewState(oldState); + BlockState newState = getNewState(oldState, level, pos, filledStack); if (newState == null) { return InteractionResult.PASS; } diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/FillCauldronInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/FillCauldronInteraction.java index 8eb10ffe..b0c70aaa 100644 --- a/src/main/java/knightminer/inspirations/recipes/cauldron/FillCauldronInteraction.java +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/FillCauldronInteraction.java @@ -1,11 +1,14 @@ package knightminer.inspirations.recipes.cauldron; import knightminer.inspirations.recipes.block.FourLayerCauldronBlock; +import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.stats.Stats; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import javax.annotation.Nullable; @@ -32,7 +35,7 @@ public FillCauldronInteraction(FourLayerCauldronBlock block) { @Nullable @Override - protected BlockState getNewState(BlockState oldState) { + protected BlockState getNewState(BlockState oldState, Level level, BlockPos pos, ItemStack filledStack) { return newState; } } diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/IncreaseLayerCauldronInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/IncreaseLayerCauldronInteraction.java index 381ed790..e653dcbc 100644 --- a/src/main/java/knightminer/inspirations/recipes/cauldron/IncreaseLayerCauldronInteraction.java +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/IncreaseLayerCauldronInteraction.java @@ -2,29 +2,23 @@ import knightminer.inspirations.recipes.block.FourLayerCauldronBlock; import net.minecraft.core.BlockPos; -import net.minecraft.core.cauldron.CauldronInteraction; import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; import net.minecraft.stats.Stats; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ItemUtils; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.world.level.gameevent.GameEvent; + +import javax.annotation.Nullable; /** Fills the cauldron, increasing the layers by one */ -public class IncreaseLayerCauldronInteraction implements CauldronInteraction { - private final ItemLike container; +public class IncreaseLayerCauldronInteraction extends AbstractModifyCauldronInteraction { protected final IntegerProperty prop; private final int max; public IncreaseLayerCauldronInteraction(ItemLike container, IntegerProperty prop, int max) { - this.container = container; + super(container, SoundEvents.BOTTLE_EMPTY, Stats.FILL_CAULDRON); this.prop = prop; this.max = max; } @@ -33,23 +27,12 @@ public static IncreaseLayerCauldronInteraction fourLevel(ItemLike container) { return new IncreaseLayerCauldronInteraction(container, FourLayerCauldronBlock.LEVEL, 4); } - /** Called after the block is set */ - protected void afterSetBlock(BlockState state, Level level, BlockPos pos, ItemStack stack) {} - + @Nullable @Override - public InteractionResult interact(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, ItemStack stack) { + protected BlockState getNewState(BlockState state, Level level, BlockPos pos, ItemStack filledStack) { if (state.getValue(prop) != max) { - if (!level.isClientSide) { - level.setBlockAndUpdate(pos, state.cycle(prop)); - afterSetBlock(state, level, pos, stack); - player.awardStat(Stats.ITEM_USED.get(stack.getItem())); - player.setItemInHand(hand, ItemUtils.createFilledResult(stack, player, new ItemStack(container))); - player.awardStat(Stats.USE_CAULDRON); - level.playSound(null, pos, SoundEvents.BOTTLE_EMPTY, SoundSource.BLOCKS, 1.0F, 1.0F); - level.gameEvent(null, GameEvent.FLUID_PLACE, pos); - } - return InteractionResult.sidedSuccess(level.isClientSide); + return state.cycle(prop); } - return InteractionResult.PASS; + return null; } } diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/dye/DyeWaterCauldronInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/dye/DyeWaterCauldronInteraction.java index 58179aba..16bd18b8 100644 --- a/src/main/java/knightminer/inspirations/recipes/cauldron/dye/DyeWaterCauldronInteraction.java +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/dye/DyeWaterCauldronInteraction.java @@ -33,7 +33,7 @@ public DyeWaterCauldronInteraction(DyeColor dye) { @Nullable @Override - protected BlockState getNewState(BlockState oldState) { + protected BlockState getNewState(BlockState oldState, Level level, BlockPos pos, ItemStack filledStack) { return InspirationsRecipes.dyeCauldron.defaultBlockState().setValue(LEVEL, oldState.getValue(LEVEL)); } diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/dye/DyedBottleIntoWaterCauldronInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/dye/DyedBottleIntoWaterCauldronInteraction.java index 620732c7..a76bd2b4 100644 --- a/src/main/java/knightminer/inspirations/recipes/cauldron/dye/DyedBottleIntoWaterCauldronInteraction.java +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/dye/DyedBottleIntoWaterCauldronInteraction.java @@ -28,7 +28,7 @@ public DyedBottleIntoWaterCauldronInteraction(@Nullable Integer color) { @Nullable @Override - protected BlockState getNewState(BlockState oldState) { + protected BlockState getNewState(BlockState oldState, Level level, BlockPos pos, ItemStack filledStack) { int contentLevel = oldState.getValue(LEVEL); if (contentLevel == 3) { return null; diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/dye/MixDyeCauldronInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/dye/MixDyeCauldronInteraction.java index 9ee7cc35..2a63369a 100644 --- a/src/main/java/knightminer/inspirations/recipes/cauldron/dye/MixDyeCauldronInteraction.java +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/dye/MixDyeCauldronInteraction.java @@ -31,7 +31,7 @@ public MixDyeCauldronInteraction(DyeColor dye) { @Nullable @Override - protected BlockState getNewState(BlockState oldState) { + protected BlockState getNewState(BlockState oldState, Level level, BlockPos pos, ItemStack filledStack) { return oldState; } diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/potion/FillPotionCauldronInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/FillPotionCauldronInteraction.java new file mode 100644 index 00000000..7ac7096c --- /dev/null +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/FillPotionCauldronInteraction.java @@ -0,0 +1,32 @@ +package knightminer.inspirations.recipes.cauldron.potion; + +import knightminer.inspirations.recipes.InspirationsRecipes; +import knightminer.inspirations.recipes.block.entity.PotionCauldronBlockEntity; +import knightminer.inspirations.recipes.cauldron.AbstractDecreaseLayerCauldronInteraction; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.LayeredCauldronBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +/** Fills a potion from the potion cauldron */ +public class FillPotionCauldronInteraction extends AbstractDecreaseLayerCauldronInteraction { + private final Item potionItem; + public FillPotionCauldronInteraction(Item potionItem) { + super(LayeredCauldronBlock.LEVEL, true, SoundEvents.BOTTLE_FILL); + this.potionItem = potionItem; + } + + @Override + protected ItemStack getResult(BlockState state, Level level, BlockPos pos, ItemStack stack) { + BlockEntity be = level.getBlockEntity(pos); + if (be != null && be.getType() == InspirationsRecipes.potionCauldronEntity) { + return PotionUtils.setPotion(new ItemStack(potionItem), ((PotionCauldronBlockEntity) be).getPotion()); + } + return ItemStack.EMPTY; + } +} diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/potion/PotionIntoEmptyInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/PotionIntoEmptyInteraction.java new file mode 100644 index 00000000..2fe5732f --- /dev/null +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/PotionIntoEmptyInteraction.java @@ -0,0 +1,46 @@ +package knightminer.inspirations.recipes.cauldron.potion; + +import knightminer.inspirations.recipes.InspirationsRecipes; +import knightminer.inspirations.recipes.block.entity.PotionCauldronBlockEntity; +import knightminer.inspirations.recipes.cauldron.AbstractModifyCauldronInteraction; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.stats.Stats; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LayeredCauldronBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import javax.annotation.Nullable; + +/** Logic to dump a potion into an empty cauldron */ +public class PotionIntoEmptyInteraction extends AbstractModifyCauldronInteraction { + public PotionIntoEmptyInteraction(ItemLike container) { + super(container, SoundEvents.BOTTLE_FILL, Stats.FILL_CAULDRON); + } + + @Nullable + @Override + protected BlockState getNewState(BlockState oldState, Level level, BlockPos pos, ItemStack filledStack) { + Block block = PotionUtils.getPotion(filledStack) == Potions.WATER ? Blocks.WATER_CAULDRON : InspirationsRecipes.potionCauldron; + return block.defaultBlockState().setValue(LayeredCauldronBlock.LEVEL, 1); + } + + @Override + protected void afterSetBlock(BlockState oldState, Level level, BlockPos pos, ItemStack stack) { + Potion potion = PotionUtils.getPotion(stack); + if (potion != Potions.WATER) { + BlockEntity be = level.getBlockEntity(pos); + if (be != null && be.getType() == InspirationsRecipes.potionCauldronEntity) { + ((PotionCauldronBlockEntity)be).setPotion(potion); + } + } + } +} diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/potion/PotionIntoPotionCauldron.java b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/PotionIntoPotionCauldron.java new file mode 100644 index 00000000..90256c30 --- /dev/null +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/PotionIntoPotionCauldron.java @@ -0,0 +1,38 @@ +package knightminer.inspirations.recipes.cauldron.potion; + +import knightminer.inspirations.recipes.InspirationsRecipes; +import knightminer.inspirations.recipes.block.entity.PotionCauldronBlockEntity; +import knightminer.inspirations.recipes.cauldron.AbstractModifyCauldronInteraction; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.stats.Stats; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import javax.annotation.Nullable; + +import static net.minecraft.world.level.block.LayeredCauldronBlock.LEVEL; + +/** Logic to dump a potion into an empty cauldron */ +public class PotionIntoPotionCauldron extends AbstractModifyCauldronInteraction { + public PotionIntoPotionCauldron(ItemLike container) { + super(container, SoundEvents.BOTTLE_EMPTY, Stats.FILL_CAULDRON); + } + + @Nullable + @Override + protected BlockState getNewState(BlockState oldState, Level level, BlockPos pos, ItemStack filledStack) { + int potionLevel = oldState.getValue(LEVEL); + if (potionLevel < 4) { + BlockEntity be = level.getBlockEntity(pos); + if (be != null && be.getType() == InspirationsRecipes.potionCauldronEntity && ((PotionCauldronBlockEntity) be).getPotion() == PotionUtils.getPotion(filledStack)) { + return oldState.setValue(LEVEL, potionLevel + 1); + } + } + return null; + } +} diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/potion/TipArrowCauldronInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/TipArrowCauldronInteraction.java new file mode 100644 index 00000000..f98e6d92 --- /dev/null +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/TipArrowCauldronInteraction.java @@ -0,0 +1,33 @@ +package knightminer.inspirations.recipes.cauldron.potion; + +import knightminer.inspirations.recipes.InspirationsRecipes; +import knightminer.inspirations.recipes.block.entity.PotionCauldronBlockEntity; +import knightminer.inspirations.recipes.cauldron.AbstractDecreaseLayerCauldronInteraction; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.LayeredCauldronBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +/** Tips a stack of 16 arrows in the cauldron */ +public class TipArrowCauldronInteraction extends AbstractDecreaseLayerCauldronInteraction { + public static final TipArrowCauldronInteraction INSTANCE = new TipArrowCauldronInteraction(); + private TipArrowCauldronInteraction() { + super(LayeredCauldronBlock.LEVEL, true, SoundEvents.GENERIC_SPLASH); + } + + @Override + protected ItemStack getResult(BlockState state, Level level, BlockPos pos, ItemStack stack) { + BlockEntity be = level.getBlockEntity(pos); + if (be != null && be.getType() == InspirationsRecipes.potionCauldronEntity) { + int resultCount = Math.min(stack.getCount(), 16); + stack.shrink(resultCount - 1); + return PotionUtils.setPotion(new ItemStack(Items.TIPPED_ARROW, resultCount), ((PotionCauldronBlockEntity) be).getPotion()); + } + return ItemStack.EMPTY; + } +} diff --git a/src/main/java/knightminer/inspirations/recipes/cauldron/potion/WaterBottleIntoWaterInteraction.java b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/WaterBottleIntoWaterInteraction.java new file mode 100644 index 00000000..d8d78f5a --- /dev/null +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/WaterBottleIntoWaterInteraction.java @@ -0,0 +1,32 @@ +package knightminer.inspirations.recipes.cauldron.potion; + +import knightminer.inspirations.recipes.cauldron.AbstractModifyCauldronInteraction; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.stats.Stats; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.LayeredCauldronBlock; +import net.minecraft.world.level.block.state.BlockState; + +import javax.annotation.Nullable; + +/** Fills a water cauldron with a water potion item */ +public class WaterBottleIntoWaterInteraction extends AbstractModifyCauldronInteraction { + public WaterBottleIntoWaterInteraction(ItemLike container) { + super(container, SoundEvents.BOTTLE_EMPTY, Stats.FILL_CAULDRON); + } + + @Nullable + @Override + protected BlockState getNewState(BlockState state, Level level, BlockPos pos, ItemStack filledStack) { + int waterLevel = state.getValue(LayeredCauldronBlock.LEVEL); + if (waterLevel < 3 && PotionUtils.getPotion(filledStack) == Potions.WATER) { + return state.setValue(LayeredCauldronBlock.LEVEL, waterLevel + 1); + } + return null; + } +} diff --git a/src/main/java/knightminer/inspirations/library/recipe/cauldron/special/package-info.java b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/package-info.java similarity index 72% rename from src/main/java/knightminer/inspirations/library/recipe/cauldron/special/package-info.java rename to src/main/java/knightminer/inspirations/recipes/cauldron/potion/package-info.java index 647fedcc..55b1e258 100644 --- a/src/main/java/knightminer/inspirations/library/recipe/cauldron/special/package-info.java +++ b/src/main/java/knightminer/inspirations/recipes/cauldron/potion/package-info.java @@ -1,6 +1,6 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package knightminer.inspirations.library.recipe.cauldron.special; +package knightminer.inspirations.recipes.cauldron.potion; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/knightminer/inspirations/recipes/data/RecipesRecipeProvider.java b/src/main/java/knightminer/inspirations/recipes/data/RecipesRecipeProvider.java index ded21e41..bcdd87b5 100644 --- a/src/main/java/knightminer/inspirations/recipes/data/RecipesRecipeProvider.java +++ b/src/main/java/knightminer/inspirations/recipes/data/RecipesRecipeProvider.java @@ -9,8 +9,6 @@ import knightminer.inspirations.library.recipe.cauldron.ingredient.ICauldronIngredient; import knightminer.inspirations.library.recipe.cauldron.recipe.CauldronRecipeBuilder; import knightminer.inspirations.library.recipe.cauldron.recipe.CauldronTransformBuilder; -import knightminer.inspirations.library.recipe.cauldron.special.EmptyPotionCauldronRecipe; -import knightminer.inspirations.library.recipe.cauldron.special.FillPotionCauldronRecipe; import knightminer.inspirations.library.recipe.cauldron.util.TemperaturePredicate; import knightminer.inspirations.recipes.InspirationsRecipes; import knightminer.inspirations.recipes.recipe.cauldron.BrewingCauldronRecipe; @@ -242,29 +240,9 @@ private void addCauldronRecipes() { // potions // String potionFolder = folder + "potion/"; Consumer potionConsumer = withCondition(ConfigEnabledCondition.CAULDRON_POTIONS); - // normal - potionConsumer.accept(new EmptyPotionCauldronRecipe.FinishedRecipe( - resource(potionFolder + "normal_empty"), Items.POTION, Items.GLASS_BOTTLE)); - potionConsumer.accept(new FillPotionCauldronRecipe.FinishedRecipe( - resource(potionFolder + "normal_fill"), SizedIngredient.fromItems(Items.GLASS_BOTTLE), Items.POTION)); - - // splash - potionConsumer.accept(new EmptyPotionCauldronRecipe.FinishedRecipe( - resource(potionFolder + "splash_empty"), Items.SPLASH_POTION, InspirationsRecipes.splashBottle)); - potionConsumer.accept(new FillPotionCauldronRecipe.FinishedRecipe( - resource(potionFolder + "splash_fill"), SizedIngredient.fromTag(InspirationsTags.Items.SPLASH_BOTTLES), Items.SPLASH_POTION)); - - // lingering - potionConsumer.accept(new EmptyPotionCauldronRecipe.FinishedRecipe( - resource(potionFolder + "lingering_empty"), Items.LINGERING_POTION, InspirationsRecipes.lingeringBottle)); - potionConsumer.accept(new FillPotionCauldronRecipe.FinishedRecipe( - resource(potionFolder + "lingering_fill"), SizedIngredient.fromTag(InspirationsTags.Items.LINGERING_BOTTLES), Items.LINGERING_POTION)); - - // tipped arrows - withCondition(ConfigEnabledCondition.CAULDRON_TIP_ARROWS).accept( - new FillPotionCauldronRecipe.FinishedRecipe(resource(potionFolder + "tipped_arrow"), SizedIngredient.fromItems(16, Items.ARROW), Items.TIPPED_ARROW)); // craft the bottles + // TODO: brew the bottles ShapelessRecipeBuilder.shapeless(InspirationsRecipes.splashBottle) .requires(Items.GLASS_BOTTLE) .requires(Items.GLASS_BOTTLE) diff --git a/src/main/resources/assets/inspirations/blockstates/potion_cauldron.json b/src/main/resources/assets/inspirations/blockstates/potion_cauldron.json new file mode 100644 index 00000000..4d93e2e3 --- /dev/null +++ b/src/main/resources/assets/inspirations/blockstates/potion_cauldron.json @@ -0,0 +1,7 @@ +{ + "variants": { + "level=1": { "model": "inspirations:block/cauldron/potion/level_1_of_3" }, + "level=2": { "model": "inspirations:block/cauldron/potion/level_2_of_3" }, + "level=3": { "model": "inspirations:block/cauldron/potion/level_3_of_3" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/inspirations/lang/en_us.json b/src/main/resources/assets/inspirations/lang/en_us.json index 95df4eb0..f6727854 100644 --- a/src/main/resources/assets/inspirations/lang/en_us.json +++ b/src/main/resources/assets/inspirations/lang/en_us.json @@ -112,6 +112,7 @@ "item.inspirations.splash_bottle": "Splash Potion Bottle", "item.inspirations.lingering_bottle": "Lingering Potion Bottle", + "block.inspirations.potion_cauldron": "Potion Cauldron", "item.inspirations.mixed_dyed_bottle": "Ink Bottle", "item.inspirations.white_dyed_bottle": "White Ink Bottle", diff --git a/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_1_of_3.json b/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_1_of_3.json new file mode 100644 index 00000000..d2ec9a4a --- /dev/null +++ b/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_1_of_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_cauldron_level1", + "textures": { + "content": "inspirations:block/fluid/potion" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_2_of_3.json b/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_2_of_3.json new file mode 100644 index 00000000..b8f85a8f --- /dev/null +++ b/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_2_of_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_cauldron_level2", + "textures": { + "content": "inspirations:block/fluid/potion" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_3_of_3.json b/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_3_of_3.json new file mode 100644 index 00000000..da8bac4d --- /dev/null +++ b/src/main/resources/assets/inspirations/models/block/cauldron/potion/level_3_of_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_cauldron_full", + "textures": { + "content": "inspirations:block/fluid/potion" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/inspirations/models/cauldron_textures.json b/src/main/resources/assets/inspirations/models/cauldron_textures.json index a1c78a01..155ff72f 100644 --- a/src/main/resources/assets/inspirations/models/cauldron_textures.json +++ b/src/main/resources/assets/inspirations/models/cauldron_textures.json @@ -3,7 +3,6 @@ "minecraft:packed_ice": "minecraft:block/packed_ice", "inspirations:wet_ice": "inspirations:block/wet_ice", - "inspirations:potion": "inspirations:block/fluid/potion", "inspirations:unfermented_potion": "inspirations:block/fluid/potion_brewing", "rats:cheese": "rats:block/cheese"