diff --git a/src/main/java/knightminer/inspirations/common/network/CauldronContentUpatePacket.java b/src/main/java/knightminer/inspirations/common/network/CauldronContentUpatePacket.java new file mode 100644 index 00000000..2ef01a60 --- /dev/null +++ b/src/main/java/knightminer/inspirations/common/network/CauldronContentUpatePacket.java @@ -0,0 +1,46 @@ +package knightminer.inspirations.common.network; + +import knightminer.inspirations.library.recipe.cauldron.CauldronContentTypes; +import knightminer.inspirations.library.recipe.cauldron.contents.ICauldronContents; +import knightminer.inspirations.recipes.tileentity.CauldronTileEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.network.NetworkEvent.Context; +import slimeknights.mantle.network.packet.IThreadsafePacket; +import slimeknights.mantle.util.TileEntityHelper; + +public class CauldronContentUpatePacket implements IThreadsafePacket { + private final BlockPos pos; + private final ICauldronContents contents; + + public CauldronContentUpatePacket(BlockPos pos, ICauldronContents contents) { + this.pos = pos; + this.contents = contents; + } + + public CauldronContentUpatePacket(PacketBuffer buffer) { + this.pos = buffer.readBlockPos(); + this.contents = CauldronContentTypes.read(buffer); + } + + @Override + public void encode(PacketBuffer buffer) { + buffer.writeBlockPos(pos); + CauldronContentTypes.write(contents, buffer); + } + + @Override + public void handleThreadsafe(Context context) { + HandleClient.handle(this); + } + + /** Once removed client class */ + private static class HandleClient { + private static void handle(CauldronContentUpatePacket packet) { + TileEntityHelper.getTile(CauldronTileEntity.class, Minecraft.getInstance().world, packet.pos, true).ifPresent(te -> { + te.setContents(packet.contents); + }); + } + } +} diff --git a/src/main/java/knightminer/inspirations/common/network/InspirationsNetwork.java b/src/main/java/knightminer/inspirations/common/network/InspirationsNetwork.java index 04a77d4f..bb0d5626 100644 --- a/src/main/java/knightminer/inspirations/common/network/InspirationsNetwork.java +++ b/src/main/java/knightminer/inspirations/common/network/InspirationsNetwork.java @@ -23,12 +23,9 @@ private InspirationsNetwork() { * Called during mod construction to register all packets */ public void setup() { - // register all the packets - - // bookshelf registerPacket(InventorySlotSyncPacket.class, InventorySlotSyncPacket::new, NetworkDirection.PLAY_TO_CLIENT); - // milk cooldown registerPacket(MilkablePacket.class, MilkablePacket::new, NetworkDirection.PLAY_TO_CLIENT); + registerPacket(CauldronContentUpatePacket.class, CauldronContentUpatePacket::new, NetworkDirection.PLAY_TO_CLIENT); } /** diff --git a/src/main/java/knightminer/inspirations/library/client/ConfigurableResourcePack.java b/src/main/java/knightminer/inspirations/library/client/ConfigurableResourcePack.java index eb5f3687..cbf41704 100644 --- a/src/main/java/knightminer/inspirations/library/client/ConfigurableResourcePack.java +++ b/src/main/java/knightminer/inspirations/library/client/ConfigurableResourcePack.java @@ -24,7 +24,6 @@ import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.function.Supplier; /** * Resource pack that overrides resources based on config @@ -65,7 +64,7 @@ public ConfigurableResourcePack(Class resourceLoader, ResourceLocation packId private ConfigurableResourcePack(Class resourceLoader, String packId, String pathPrefix, String displayName, Set namespaces) { super(new File(pathPrefix)); this.resourceLoader = resourceLoader; - this.packId = packId.toString(); + this.packId = packId; this.displayName = displayName; this.pathPrefix = pathPrefix; this.namespaces = namespaces; @@ -138,7 +137,7 @@ public void func_230230_a_(Consumer consumer, IF * @param originalPath Original resource path * @param resource Path to the replacement resource relative to the pack root */ - protected void addReplacement(BooleanSupplier condition, String originalPath, Supplier resource) { + public void addReplacement(BooleanSupplier condition, String originalPath, String resource) { if (replacements.containsKey(originalPath)) { throw new IllegalArgumentException("Duplicate replacement '" + originalPath + "' for configurable pack " + packId); } @@ -162,7 +161,7 @@ private static String makePath(ResourceLocation id, String folder, String extens * @param resource Name of blockstate replacement */ public void addBlockstateReplacement(BooleanSupplier condition, Block block, String resource) { - addReplacement(condition, makePath(Objects.requireNonNull(block.getRegistryName()), "blockstates", "json"), () -> "blockstates/" + resource + ".json"); + addReplacement(condition, makePath(Objects.requireNonNull(block.getRegistryName()), "blockstates", "json"), "blockstates/" + resource + ".json"); } /** @@ -171,18 +170,8 @@ public void addBlockstateReplacement(BooleanSupplier condition, Block block, Str * @param item Item to replace the model * @param resource New name supplier */ - public void addItemModelReplacement(BooleanSupplier condition, IItemProvider item, Supplier resource) { - addReplacement(condition, makePath(Objects.requireNonNull(item.asItem().getRegistryName()), "models/item", "json"), () -> "item_models/" + resource.get() + ".json"); - } - - /** - * Adds a replacement for a blockstate JSON - * @param condition Condition for replacement - * @param item Item to replace the model - * @param resource New name supplier - */ public void addItemModelReplacement(BooleanSupplier condition, IItemProvider item, String resource) { - addItemModelReplacement(condition, item, () -> resource); + addReplacement(condition, makePath(Objects.requireNonNull(item.asItem().getRegistryName()), "models/item", "json"), "item_models/" + resource + ".json"); } /** @@ -190,20 +179,20 @@ public void addItemModelReplacement(BooleanSupplier condition, IItemProvider ite */ private static class Replacement { private final BooleanSupplier condition; - private final Supplier name; + private final String name; /** * Creates a new replacement * @param condition Condition for the replacement * @param name New file name, relative to pack root */ - public Replacement(BooleanSupplier condition, Supplier name) { + public Replacement(BooleanSupplier condition, String name) { this.name = name; this.condition = condition; } public String getName() { - return name.get(); + return name; } /** diff --git a/src/main/java/knightminer/inspirations/library/client/model/CauldronModel.java b/src/main/java/knightminer/inspirations/library/client/model/CauldronModel.java new file mode 100644 index 00000000..03435765 --- /dev/null +++ b/src/main/java/knightminer/inspirations/library/client/model/CauldronModel.java @@ -0,0 +1,146 @@ +package knightminer.inspirations.library.client.model; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.mojang.datafixers.util.Pair; +import knightminer.inspirations.recipes.tileentity.CauldronTileEntity; +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.BlockPart; +import net.minecraft.client.renderer.model.BlockPartFace; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.IModelTransform; +import net.minecraft.client.renderer.model.IUnbakedModel; +import net.minecraft.client.renderer.model.ItemOverrideList; +import net.minecraft.client.renderer.model.ModelBakery; +import net.minecraft.client.renderer.model.RenderMaterial; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IModelConfiguration; +import net.minecraftforge.client.model.IModelLoader; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.geometry.IModelGeometry; +import slimeknights.mantle.client.model.RetexturedModel; +import slimeknights.mantle.client.model.RetexturedModel.RetexturedConfiguration; +import slimeknights.mantle.client.model.util.DynamicBakedWrapper; +import slimeknights.mantle.client.model.util.SimpleBlockModel; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Random; +import java.util.Set; +import java.util.function.Function; + +/** + * Model to replace cauldron water texture with the relevant fluid texture + */ +public class CauldronModel implements IModelGeometry { + public static final Loader LOADER = new Loader(); + + private final SimpleBlockModel model; + private final Set retextured; + + /** + * Creates a new model instance + * @param model Model instance + * @param retextured Names of fluid textures to retexture + */ + protected CauldronModel(SimpleBlockModel model, Set retextured) { + this.model = model; + this.retextured = retextured; + } + + @Override + public Collection getTextures(IModelConfiguration owner, Function modelGetter, Set> missingTextureErrors) { + return model.getTextures(owner, modelGetter, missingTextureErrors); + } + + @Override + public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform modelTransform, ItemOverrideList overrides, ResourceLocation modelLocation) { + List elements = new ArrayList<>(); + for (BlockPart part : model.getElements()) { + boolean updated = false; + Map newFaces = new EnumMap<>(Direction.class); + for (Entry entry : part.mapFaces.entrySet()) { + BlockPartFace face = entry.getValue(); + if (face.tintIndex != 1 && retextured.contains(face.texture.substring(1))) { + updated = true; + newFaces.put(entry.getKey(), new BlockPartFace(face.cullFace, 1, face.texture, face.blockFaceUV)); + } else { + newFaces.put(entry.getKey(), face); + } + } + if (updated) { + elements.add(new BlockPart(part.positionFrom, part.positionTo, newFaces, part.partRotation, part.shade)); + } else { + elements.add(part); + } + } + + IBakedModel baked = SimpleBlockModel.bakeModel(owner, elements, modelTransform, overrides, spriteGetter, modelLocation); + return new BakedModel(baked, owner, elements, modelTransform, RetexturedModel.getAllRetextured(owner, model, retextured)); + } + + /** Baked model, to swap out textures dynamically */ + private static class BakedModel extends DynamicBakedWrapper { + private final Map fluidCache = new HashMap<>(); + // data needed to rebake + private final IModelConfiguration owner; + private final List elements; + private final IModelTransform transform; + private final Set retextured; + protected BakedModel(IBakedModel originalModel, IModelConfiguration owner, List elements, IModelTransform transform, Set fluidNames) { + super(originalModel); + this.owner = owner; + this.elements = elements; + this.transform = transform; + this.retextured = fluidNames; + + // for each part face using the fluid texture, set the tint index to 1. Saves having to recreate models + // the vanilla model does this using tint index 0, but that is problematic as that also tints the particle texture + // plus, ensures resource pack support if a resource pack does weird cauldron stuff + + } + + /** + * Bakes the baked model for the given fluid + * @param fluid Fluid texture + * @return Baked model + */ + private IBakedModel getFluidModel(ResourceLocation fluid) { + return SimpleBlockModel.bakeDynamic(new RetexturedConfiguration(owner, retextured, fluid), elements, transform); + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction direction, Random random, IModelData data) { + ResourceLocation texture = data.getData(CauldronTileEntity.TEXTURE); + if (texture == null) { + return originalModel.getQuads(state, direction, random, data); + } + return fluidCache.computeIfAbsent(texture, this::getFluidModel).getQuads(state, direction, random, data); + } + } + + /** Loader class */ + private static class Loader implements IModelLoader { + private Loader() {} + + @Override + public void onResourceManagerReload(IResourceManager resourceManager) {} + + @Override + public CauldronModel read(JsonDeserializationContext context, JsonObject json) { + SimpleBlockModel model = SimpleBlockModel.deserialize(context, json); + Set retextured = RetexturedModel.Loader.getRetextured(json); + return new CauldronModel(model, retextured); + } + } +} diff --git a/src/main/java/knightminer/inspirations/recipes/RecipesClientEvents.java b/src/main/java/knightminer/inspirations/recipes/RecipesClientEvents.java index 18d45c3e..4330b106 100644 --- a/src/main/java/knightminer/inspirations/recipes/RecipesClientEvents.java +++ b/src/main/java/knightminer/inspirations/recipes/RecipesClientEvents.java @@ -2,16 +2,29 @@ import knightminer.inspirations.Inspirations; import knightminer.inspirations.common.ClientEvents; +import knightminer.inspirations.common.Config; +import knightminer.inspirations.library.client.model.CauldronModel; +import knightminer.inspirations.library.recipe.cauldron.CauldronContentTypes; +import knightminer.inspirations.library.recipe.cauldron.contents.ICauldronContents; import knightminer.inspirations.recipes.client.BoilingParticle; import knightminer.inspirations.recipes.item.MixedDyedBottleItem; import knightminer.inspirations.recipes.recipe.cauldron.contents.ColorContentType; import knightminer.inspirations.recipes.recipe.cauldron.contents.PotionContentType; +import knightminer.inspirations.recipes.tileentity.CauldronTileEntity; +import knightminer.inspirations.shared.SharedClientEvents; +import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.color.BlockColors; import net.minecraft.client.renderer.color.ItemColors; +import net.minecraft.fluid.Fluids; import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.biome.BiomeColors; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ColorHandlerEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; @@ -20,29 +33,36 @@ @SuppressWarnings("unused") @EventBusSubscriber(modid = Inspirations.modID, value = Dist.CLIENT, bus = Bus.MOD) public class RecipesClientEvents extends ClientEvents { - /* TODO: reimplement @SubscribeEvent - static void registerModels(ModelRegistryEvent event) { - setModelStateMapper(InspirationsRecipes.cauldron, new CauldronStateMapper(CAULDRON_MODEL)); + static void registerModelLoaders(ModelRegistryEvent event) { + ModelLoaderRegistry.registerLoader(Inspirations.getResource("cauldron"), CauldronModel.LOADER); + SharedClientEvents.configPack.addBlockstateReplacement(Config.extendedCauldron, Blocks.CAULDRON, "cauldron"); } @SubscribeEvent static void registerBlockColors(ColorHandlerEvent.Block event) { BlockColors blockColors = event.getBlockColors(); - // coloring of liquid inside, either for potions or dyes + // coloring of liquid inside, for fluids, potions, and dyes registerBlockColors(blockColors, (state, world, pos, tintIndex) -> { - if(tintIndex == 1) { + // skip tint index 0, that is particles + if (tintIndex > 0 && world != null && pos != null) { + // must be cauldron TE TileEntity te = world.getTileEntity(pos); if(te instanceof CauldronTileEntity) { - return ((CauldronTileEntity) te).getColor(); + // if it contains water, run vanilla tinting + ICauldronContents contents = ((CauldronTileEntity) te).getContents(); + if (!contents.matches(CauldronContentTypes.FLUID, Fluids.WATER)) { + return contents.getTintColor(); + } } + // water tinting if contains water or TE is missing + return BiomeColors.getWaterColor(world, pos); } return -1; - }, InspirationsRecipes.cauldron); + }, InspirationsRecipes.cauldron, InspirationsRecipes.boilingCauldron); } - */ @SubscribeEvent static void clientSetup(FMLClientSetupEvent event) { diff --git a/src/main/java/knightminer/inspirations/recipes/tileentity/CauldronTileEntity.java b/src/main/java/knightminer/inspirations/recipes/tileentity/CauldronTileEntity.java index 5809bd0e..257f5d43 100644 --- a/src/main/java/knightminer/inspirations/recipes/tileentity/CauldronTileEntity.java +++ b/src/main/java/knightminer/inspirations/recipes/tileentity/CauldronTileEntity.java @@ -1,6 +1,8 @@ package knightminer.inspirations.recipes.tileentity; import knightminer.inspirations.Inspirations; +import knightminer.inspirations.common.network.CauldronContentUpatePacket; +import knightminer.inspirations.common.network.InspirationsNetwork; import knightminer.inspirations.library.recipe.RecipeTypes; import knightminer.inspirations.library.recipe.cauldron.CauldronContentTypes; import knightminer.inspirations.library.recipe.cauldron.contents.EmptyCauldronContents; @@ -20,8 +22,6 @@ import net.minecraft.fluid.Fluids; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Potion; import net.minecraft.tags.FluidTags; @@ -74,7 +74,8 @@ public CauldronTileEntity(EnhancedCauldronBlock block) { */ protected CauldronTileEntity(TileEntityType type, EnhancedCauldronBlock block) { super(type); - this.contents = CauldronContentTypes.FLUID.of(Fluids.WATER); + this.contents = EmptyCauldronContents.INSTANCE; + this.data.setData(TEXTURE, contents.getTextureName()); this.cauldronBlock = block; } @@ -125,15 +126,25 @@ public EnhancedCauldronBlock getBlock() { * @param contents New contents */ public void setContents(ICauldronContents contents) { + // noting to do + if (this.contents.equals(contents)) { + return; + } + + // normalize empty into water if (contents == EmptyCauldronContents.INSTANCE) { - contents = CauldronContentTypes.FLUID.of(Fluids.WATER);; + contents = CauldronContentTypes.FLUID.of(Fluids.WATER); } this.contents = contents; - // TODO: serverside safe? - if (world != null && world.isRemote) { - this.data.setData(TEXTURE, contents.getTextureName()); - this.requestModelDataUpdate(); + // update display client side, sync to client serverside + if (world != null) { + if (world.isRemote) { + this.data.setData(TEXTURE, contents.getTextureName()); + this.requestModelDataUpdate(); + } else { + InspirationsNetwork.sendToClients(world,pos,new CauldronContentUpatePacket(pos, contents)); + } } } @@ -406,14 +417,4 @@ public void read(BlockState state, CompoundNBT tags) { this.cauldronBlock = (EnhancedCauldronBlock)block; } } - - @Override - public SUpdateTileEntityPacket getUpdatePacket() { - return new SUpdateTileEntityPacket(this.getPos(), 0, CauldronContentTypes.toNbt(getContents())); - } - - @Override - public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { - setContents(CauldronContentTypes.read(pkt.getNbtCompound())); - } } diff --git a/src/main/java/knightminer/inspirations/tweaks/TweaksClientEvents.java b/src/main/java/knightminer/inspirations/tweaks/TweaksClientEvents.java index c05defdf..8fea1b5b 100644 --- a/src/main/java/knightminer/inspirations/tweaks/TweaksClientEvents.java +++ b/src/main/java/knightminer/inspirations/tweaks/TweaksClientEvents.java @@ -52,7 +52,7 @@ static void modelRegistry(ModelRegistryEvent event) { SharedClientEvents.configPack.addBlockstateReplacement(Config.customPortalColor, Blocks.NETHER_PORTAL, "nether_portal"); SharedClientEvents.configPack.addItemModelReplacement(Config.coloredEnchantedRibbons, Items.ENCHANTED_BOOK, "enchanted_book"); SharedClientEvents.configPack.addItemModelReplacement(Config.coloredFireworkItems, Items.FIREWORK_ROCKET, "fireworks"); - SharedClientEvents.configPack.addItemModelReplacement(Config.betterCauldronItem, Items.CAULDRON, () -> Config.extendedCauldron.getAsBoolean() ? "cauldron" : "cauldron_vanilla"); + SharedClientEvents.configPack.addItemModelReplacement(Config.betterCauldronItem, Items.CAULDRON, "cauldron"); } @SubscribeEvent diff --git a/src/main/resources/assets/inspirations/blockstates/boiling_cauldron.json b/src/main/resources/assets/inspirations/blockstates/boiling_cauldron.json index b1dc2484..f20e1f55 100644 --- a/src/main/resources/assets/inspirations/blockstates/boiling_cauldron.json +++ b/src/main/resources/assets/inspirations/blockstates/boiling_cauldron.json @@ -1,6 +1,6 @@ { "variants": { - "level=0": { "model": "inspirations:block/cauldron/empty" }, + "level=0": { "model": "minecraft:block/cauldron" }, "level=1": { "model": "inspirations:block/cauldron/level_1" }, "level=2": { "model": "inspirations:block/cauldron/level_2" }, "level=3": { "model": "inspirations:block/cauldron/level_3" } diff --git a/src/main/resources/assets/inspirations/config_resources/blockstates/cauldron.json b/src/main/resources/assets/inspirations/config_resources/blockstates/cauldron.json index b1dc2484..f20e1f55 100644 --- a/src/main/resources/assets/inspirations/config_resources/blockstates/cauldron.json +++ b/src/main/resources/assets/inspirations/config_resources/blockstates/cauldron.json @@ -1,6 +1,6 @@ { "variants": { - "level=0": { "model": "inspirations:block/cauldron/empty" }, + "level=0": { "model": "minecraft:block/cauldron" }, "level=1": { "model": "inspirations:block/cauldron/level_1" }, "level=2": { "model": "inspirations:block/cauldron/level_2" }, "level=3": { "model": "inspirations:block/cauldron/level_3" } diff --git a/src/main/resources/assets/inspirations/config_resources/item_models/cauldron.json b/src/main/resources/assets/inspirations/config_resources/item_models/cauldron.json index 58452b72..dbcba584 100644 --- a/src/main/resources/assets/inspirations/config_resources/item_models/cauldron.json +++ b/src/main/resources/assets/inspirations/config_resources/item_models/cauldron.json @@ -1,3 +1,3 @@ { - "parent": "inspirations:block/cauldron/empty" + "parent": "minecraft:block/cauldron" } diff --git a/src/main/resources/assets/inspirations/config_resources/item_models/cauldron_vanilla.json b/src/main/resources/assets/inspirations/config_resources/item_models/cauldron_vanilla.json deleted file mode 100644 index dbcba584..00000000 --- a/src/main/resources/assets/inspirations/config_resources/item_models/cauldron_vanilla.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "minecraft:block/cauldron" -} diff --git a/src/main/resources/assets/inspirations/models/block/cauldron/empty.json b/src/main/resources/assets/inspirations/models/block/cauldron/empty.json deleted file mode 100644 index ffacc4cb..00000000 --- a/src/main/resources/assets/inspirations/models/block/cauldron/empty.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "parent": "block/block", - "ambientocclusion": false, - "textures": { - "particle": "block/cauldron_side", - "top": "block/cauldron_top", - "bottom": "block/cauldron_bottom", - "side": "block/cauldron_side", - "inside": "block/cauldron_inner" - }, - "elements": [ - { "from": [ 0, 3, 0 ], - "to": [ 2, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 3, 2 ], - "to": [ 14, 4, 14 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#inside", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 14, 3, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 0 ], - "to": [ 14, 16, 2 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 14 ], - "to": [ 14, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 4, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 2 ], - "to": [ 2, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 0 ], - "to": [ 16, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 2 ], - "to": [ 16, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 14 ], - "to": [ 4, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 12 ], - "to": [ 2, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 14 ], - "to": [ 16, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 12 ], - "to": [ 16, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - } - ] -} diff --git a/src/main/resources/assets/inspirations/models/block/cauldron/level_0.json b/src/main/resources/assets/inspirations/models/block/cauldron/level_0.json deleted file mode 100644 index 121233fe..00000000 --- a/src/main/resources/assets/inspirations/models/block/cauldron/level_0.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "ambientocclusion": false, - "textures": { - "particle": "block/cauldron_side", - "top": "block/cauldron_top", - "bottom": "block/cauldron_bottom", - "side": "block/cauldron_side", - "inside": "block/cauldron_inner", - "water": "block/water_still" - }, - "elements": [ - { "from": [ 0, 3, 0 ], - "to": [ 2, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 3, 2 ], - "to": [ 14, 4, 14 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#inside", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 14, 3, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 0 ], - "to": [ 14, 16, 2 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 14 ], - "to": [ 14, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 4, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 2 ], - "to": [ 2, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 0 ], - "to": [ 16, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 2 ], - "to": [ 16, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 14 ], - "to": [ 4, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 12 ], - "to": [ 2, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 14 ], - "to": [ 16, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 12 ], - "to": [ 16, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 6, 2 ], - "to": [ 14, 6, 14 ], - "faces": { - "up": { "texture": "#water", "tintindex": 1 } - } - } - ] -} diff --git a/src/main/resources/assets/inspirations/models/block/cauldron/level_1.json b/src/main/resources/assets/inspirations/models/block/cauldron/level_1.json index fd40432a..700e80c8 100644 --- a/src/main/resources/assets/inspirations/models/block/cauldron/level_1.json +++ b/src/main/resources/assets/inspirations/models/block/cauldron/level_1.json @@ -1,162 +1,5 @@ { - "ambientocclusion": false, - "textures": { - "particle": "block/cauldron_side", - "top": "block/cauldron_top", - "bottom": "block/cauldron_bottom", - "side": "block/cauldron_side", - "inside": "block/cauldron_inner", - "water": "block/water_still" - }, - "elements": [ - { "from": [ 0, 3, 0 ], - "to": [ 2, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 3, 2 ], - "to": [ 14, 4, 14 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#inside", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 14, 3, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 0 ], - "to": [ 14, 16, 2 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 14 ], - "to": [ 14, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 4, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 2 ], - "to": [ 2, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 0 ], - "to": [ 16, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 2 ], - "to": [ 16, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 14 ], - "to": [ 4, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 12 ], - "to": [ 2, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 14 ], - "to": [ 16, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 12 ], - "to": [ 16, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 9, 2 ], - "to": [ 14, 9, 14 ], - "faces": { - "up": { "texture": "#water", "tintindex": 1 } - } - } - ] + "loader": "inspirations:cauldron", + "parent": "block/cauldron_level1", + "retextured": ["water"] } diff --git a/src/main/resources/assets/inspirations/models/block/cauldron/level_2.json b/src/main/resources/assets/inspirations/models/block/cauldron/level_2.json index a1cb664b..a3fd0e44 100644 --- a/src/main/resources/assets/inspirations/models/block/cauldron/level_2.json +++ b/src/main/resources/assets/inspirations/models/block/cauldron/level_2.json @@ -1,162 +1,5 @@ { - "ambientocclusion": false, - "textures": { - "particle": "block/cauldron_side", - "top": "block/cauldron_top", - "bottom": "block/cauldron_bottom", - "side": "block/cauldron_side", - "inside": "block/cauldron_inner", - "water": "block/water_still" - }, - "elements": [ - { "from": [ 0, 3, 0 ], - "to": [ 2, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 3, 2 ], - "to": [ 14, 4, 14 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#inside", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 14, 3, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 0 ], - "to": [ 14, 16, 2 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 14 ], - "to": [ 14, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 4, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 2 ], - "to": [ 2, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 0 ], - "to": [ 16, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 2 ], - "to": [ 16, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 14 ], - "to": [ 4, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 12 ], - "to": [ 2, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 14 ], - "to": [ 16, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 12 ], - "to": [ 16, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 12, 2 ], - "to": [ 14, 12, 14 ], - "faces": { - "up": { "texture": "#water", "tintindex": 1 } - } - } - ] + "loader": "inspirations:cauldron", + "parent": "block/cauldron_level2", + "retextured": ["water"] } diff --git a/src/main/resources/assets/inspirations/models/block/cauldron/level_3.json b/src/main/resources/assets/inspirations/models/block/cauldron/level_3.json index 5b5db310..923d0c23 100644 --- a/src/main/resources/assets/inspirations/models/block/cauldron/level_3.json +++ b/src/main/resources/assets/inspirations/models/block/cauldron/level_3.json @@ -1,162 +1,5 @@ { - "ambientocclusion": false, - "textures": { - "particle": "block/cauldron_side", - "top": "block/cauldron_top", - "bottom": "block/cauldron_bottom", - "side": "block/cauldron_side", - "inside": "block/cauldron_inner", - "water": "block/water_still" - }, - "elements": [ - { "from": [ 0, 3, 0 ], - "to": [ 2, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 3, 2 ], - "to": [ 14, 4, 14 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#inside", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 14, 3, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 0 ], - "to": [ 14, 16, 2 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side", "cullface": "north" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 2, 3, 14 ], - "to": [ 14, 16, 16 ], - "faces": { - "down": { "texture": "#inside" }, - "up": { "texture": "#top", "cullface": "up" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side", "cullface": "south" }, - "west": { "texture": "#side", "cullface": "west" }, - "east": { "texture": "#side", "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 4, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 2 ], - "to": [ 2, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 0 ], - "to": [ 16, 3, 2 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 2 ], - "to": [ 16, 3, 4 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 14 ], - "to": [ 4, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 0, 0, 12 ], - "to": [ 2, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 12, 0, 14 ], - "to": [ 16, 3, 16 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 14, 0, 12 ], - "to": [ 16, 3, 14 ], - "faces": { - "down": { "texture": "#bottom" }, - "up": { "texture": "#top" }, - "north": { "texture": "#side" }, - "south": { "texture": "#side" }, - "west": { "texture": "#side" }, - "east": { "texture": "#side" } - } - }, - { "from": [ 2, 15, 2 ], - "to": [ 14, 15, 14 ], - "faces": { - "up": { "texture": "#water", "tintindex": 1 } - } - } - ] + "loader": "inspirations:cauldron", + "parent": "block/cauldron_level3", + "retextured": ["water"] }