From c94d50a52b255521f33e7b6e3ef535675eb34e83 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 3 May 2022 12:24:34 +0200 Subject: [PATCH] wip processing containers --- .../minosoft/data/container/Container.kt | 2 + .../data/container/DefaultInventoryTypes.kt | 3 +- .../data/container/slots/FuelSlotType.kt | 17 ++ .../data/container/types/CraftingContainer.kt | 10 +- .../data/container/types/PlayerInventory.kt | 8 +- .../types/processing/ProcessingContainer.kt | 21 ++ .../smelting/BlastFurnaceContainer.kt | 33 ++++ .../processing/smelting/FurnaceContainer.kt | 33 ++++ .../processing/smelting/SmeltingContainer.kt | 91 +++++++++ .../processing/smelting/SmokerContainer.kt | 33 ++++ .../other/containers/ContainerFactory.kt | 1 - .../containers/DefaultContainerFactories.kt | 7 + .../play/container/ContainerPropertiesS2CP.kt | 7 +- .../assets/minosoft/mapping/atlas.json | 179 ++++++++++++++++++ 14 files changed, 433 insertions(+), 12 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/data/container/slots/FuelSlotType.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/container/types/processing/ProcessingContainer.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/BlastFurnaceContainer.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/FurnaceContainer.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/SmeltingContainer.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/SmokerContainer.kt diff --git a/src/main/java/de/bixilon/minosoft/data/container/Container.kt b/src/main/java/de/bixilon/minosoft/data/container/Container.kt index ad8c7306a..7a20a5340 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/Container.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/Container.kt @@ -220,6 +220,8 @@ open class Container( revision++ } + open fun readProperty(property: Int, value: Int) = Unit + companion object : ContainerFactory { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:container".toResourceLocation() diff --git a/src/main/java/de/bixilon/minosoft/data/container/DefaultInventoryTypes.kt b/src/main/java/de/bixilon/minosoft/data/container/DefaultInventoryTypes.kt index 64ca5e7a3..fa124b00b 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/DefaultInventoryTypes.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/DefaultInventoryTypes.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -17,6 +17,5 @@ import de.bixilon.minosoft.util.KUtil.toResourceLocation @Deprecated("Will be removed") object DefaultInventoryTypes { - val CHEST = "minecraft:chest".toResourceLocation() val HORSE = "minecraft:EntityHorse".toResourceLocation() } diff --git a/src/main/java/de/bixilon/minosoft/data/container/slots/FuelSlotType.kt b/src/main/java/de/bixilon/minosoft/data/container/slots/FuelSlotType.kt new file mode 100644 index 000000000..9621bc30c --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/container/slots/FuelSlotType.kt @@ -0,0 +1,17 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.container.slots + +@Deprecated("ToDo") +object FuelSlotType : SlotType diff --git a/src/main/java/de/bixilon/minosoft/data/container/types/CraftingContainer.kt b/src/main/java/de/bixilon/minosoft/data/container/types/CraftingContainer.kt index 5b0f362ad..75b5f7f5f 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/types/CraftingContainer.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/types/CraftingContainer.kt @@ -26,13 +26,13 @@ import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.util.KUtil.toResourceLocation class CraftingContainer(connection: PlayConnection, type: ContainerType, title: ChatComponent?) : Container(connection, type, title) { - override val sections: Array = arrayOf(0..0, 1 until 1 + CRAFTING_SLOTS, 1 + CRAFTING_SLOTS until 1 + CRAFTING_SLOTS + SLOTS_PER_ROW * ROWS) + override val sections: Array = arrayOf(0..0, 1 until 1 + CRAFTING_SLOTS, 1 + CRAFTING_SLOTS until 1 + CRAFTING_SLOTS + PlayerInventory.MAIN_SLOTS) override fun getSlotType(slotId: Int): SlotType? { if (slotId == 0) { return RemoveOnlySlotType } - if (slotId in 1 until 1 + CRAFTING_SLOTS + SLOTS_PER_ROW * ROWS) { + if (slotId in 1 until 1 + CRAFTING_SLOTS + PlayerInventory.MAIN_SLOTS) { return DefaultSlotType } return null @@ -45,7 +45,7 @@ class CraftingContainer(connection: PlayConnection, type: ContainerType, title: if (slotId in 1 until 1 + CRAFTING_SLOTS) { return 1 } - if (slotId in 1 + CRAFTING_SLOTS until 1 + CRAFTING_SLOTS + SLOTS_PER_ROW * ROWS) { + if (slotId in 1 + CRAFTING_SLOTS until 1 + CRAFTING_SLOTS + PlayerInventory.MAIN_SLOTS) { return 2 } return null @@ -55,15 +55,13 @@ class CraftingContainer(connection: PlayConnection, type: ContainerType, title: if (slot == SlotSwapContainerAction.SwapTargets.OFFHAND) { return null // ToDo: It is possible to press F in vanilla, but there is no slot for it } - return 1 + CRAFTING_SLOTS + SLOTS_PER_ROW * 3 + slot.ordinal + return 1 + CRAFTING_SLOTS + PlayerInventory.MAIN_SLOTS_PER_ROW * 3 + slot.ordinal } companion object : ContainerFactory { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:crafting".toResourceLocation() const val CRAFTING_SLOTS = 3 * 3 - const val SLOTS_PER_ROW = 9 - const val ROWS = 4 override fun build(connection: PlayConnection, type: ContainerType, title: ChatComponent?): CraftingContainer { return CraftingContainer(connection, type, title) diff --git a/src/main/java/de/bixilon/minosoft/data/container/types/PlayerInventory.kt b/src/main/java/de/bixilon/minosoft/data/container/types/PlayerInventory.kt index 44c48e61e..b9764e71d 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/types/PlayerInventory.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/types/PlayerInventory.kt @@ -150,9 +150,13 @@ class PlayerInventory(connection: PlayConnection) : Container(connection = conne resourceLocation = RESOURCE_LOCATION, factory = this, ) - const val HOTBAR_OFFSET = 36 + const val MAIN_SLOTS_PER_ROW = 9 + const val MAIN_ROWS = 4 + const val MAIN_SLOTS = MAIN_SLOTS_PER_ROW * MAIN_ROWS + + const val HOTBAR_OFFSET = (MAIN_ROWS - 1) * MAIN_SLOTS_PER_ROW const val ARMOR_OFFSET = 5 - const val HOTBAR_SLOTS = 9 + const val HOTBAR_SLOTS = MAIN_SLOTS_PER_ROW const val OFFHAND_SLOT = 45 private val SECTIONS = arrayOf( diff --git a/src/main/java/de/bixilon/minosoft/data/container/types/processing/ProcessingContainer.kt b/src/main/java/de/bixilon/minosoft/data/container/types/processing/ProcessingContainer.kt new file mode 100644 index 000000000..3227f74d1 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/container/types/processing/ProcessingContainer.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.container.types.processing + +import de.bixilon.minosoft.data.container.Container +import de.bixilon.minosoft.data.registries.other.containers.ContainerType +import de.bixilon.minosoft.data.text.ChatComponent +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection + +abstract class ProcessingContainer(connection: PlayConnection, type: ContainerType, title: ChatComponent?) : Container(connection, type, title) diff --git a/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/BlastFurnaceContainer.kt b/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/BlastFurnaceContainer.kt new file mode 100644 index 000000000..18d72cba6 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/BlastFurnaceContainer.kt @@ -0,0 +1,33 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.container.types.processing.smelting + +import de.bixilon.minosoft.data.container.types.CraftingContainer +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.other.containers.ContainerFactory +import de.bixilon.minosoft.data.registries.other.containers.ContainerType +import de.bixilon.minosoft.data.text.ChatComponent +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import de.bixilon.minosoft.util.KUtil.toResourceLocation + +class BlastFurnaceContainer(connection: PlayConnection, type: ContainerType, title: ChatComponent?) : SmeltingContainer(connection, type, title) { + + companion object : ContainerFactory { + override val RESOURCE_LOCATION: ResourceLocation = "minecraft:blast_furnace".toResourceLocation() + + override fun build(connection: PlayConnection, type: ContainerType, title: ChatComponent?): CraftingContainer { + return CraftingContainer(connection, type, title) + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/FurnaceContainer.kt b/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/FurnaceContainer.kt new file mode 100644 index 000000000..9c87f6c47 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/FurnaceContainer.kt @@ -0,0 +1,33 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.container.types.processing.smelting + +import de.bixilon.minosoft.data.container.types.CraftingContainer +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.other.containers.ContainerFactory +import de.bixilon.minosoft.data.registries.other.containers.ContainerType +import de.bixilon.minosoft.data.text.ChatComponent +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import de.bixilon.minosoft.util.KUtil.toResourceLocation + +class FurnaceContainer(connection: PlayConnection, type: ContainerType, title: ChatComponent?) : SmeltingContainer(connection, type, title) { + + companion object : ContainerFactory { + override val RESOURCE_LOCATION: ResourceLocation = "minecraft:furnace".toResourceLocation() + + override fun build(connection: PlayConnection, type: ContainerType, title: ChatComponent?): CraftingContainer { + return CraftingContainer(connection, type, title) + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/SmeltingContainer.kt b/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/SmeltingContainer.kt new file mode 100644 index 000000000..4c366d6ec --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/SmeltingContainer.kt @@ -0,0 +1,91 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.container.types.processing.smelting + +import de.bixilon.minosoft.data.container.click.SlotSwapContainerAction +import de.bixilon.minosoft.data.container.slots.DefaultSlotType +import de.bixilon.minosoft.data.container.slots.FuelSlotType +import de.bixilon.minosoft.data.container.slots.RemoveOnlySlotType +import de.bixilon.minosoft.data.container.slots.SlotType +import de.bixilon.minosoft.data.container.types.CraftingContainer +import de.bixilon.minosoft.data.container.types.PlayerInventory +import de.bixilon.minosoft.data.container.types.processing.ProcessingContainer +import de.bixilon.minosoft.data.registries.other.containers.ContainerType +import de.bixilon.minosoft.data.text.ChatComponent +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection + +abstract class SmeltingContainer(connection: PlayConnection, type: ContainerType, title: ChatComponent?) : ProcessingContainer(connection, type, title) { + var processTime: Int = 0 + private set + get() = minOf(field, maxProcessTime) + var maxProcessTime: Int = 200 + private set + + var fuel: Int = 0 + private set + get() = minOf(field, maxFuel) + var maxFuel: Int = 0 + private set + + + override fun getSlotType(slotId: Int): SlotType? { + if (slotId == 0) { + return DefaultSlotType // ToDo: only smeltable items + } + if (slotId == 1) { + return FuelSlotType + } + if (slotId == 2) { + return RemoveOnlySlotType + } + if (slotId in SMELTING_SLOTS until +SMELTING_SLOTS + PlayerInventory.MAIN_SLOTS) { + return DefaultSlotType + } + return null + } + + override fun getSection(slotId: Int): Int? { + if (slotId == 2) { + return 0 + } + if (slotId == 0 || slotId == 1) { + return 1 + } + if (slotId in SMELTING_SLOTS until SMELTING_SLOTS + CraftingContainer.CRAFTING_SLOTS) { + return 2 + } + return null + } + + override fun getSlotSwap(slot: SlotSwapContainerAction.SwapTargets): Int? { + if (slot == SlotSwapContainerAction.SwapTargets.OFFHAND) { + return null // ToDo: It is possible to press F in vanilla, but there is no slot for it + } + return SMELTING_SLOTS + PlayerInventory.MAIN_SLOTS_PER_ROW * 3 + slot.ordinal + } + + override fun readProperty(property: Int, value: Int) { + when (property) { + 0 -> this.fuel = maxOf(value, 0) + 1 -> this.maxFuel = maxOf(value, 0) + 2 -> this.processTime = maxOf(value, 0) + 3 -> this.maxProcessTime = maxOf(value, 0) + else -> super.readProperty(property, value) + } + } + + companion object { + const val SMELTING_SLOTS = 3 + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/SmokerContainer.kt b/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/SmokerContainer.kt new file mode 100644 index 000000000..23119dd7e --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/container/types/processing/smelting/SmokerContainer.kt @@ -0,0 +1,33 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.container.types.processing.smelting + +import de.bixilon.minosoft.data.container.types.CraftingContainer +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.other.containers.ContainerFactory +import de.bixilon.minosoft.data.registries.other.containers.ContainerType +import de.bixilon.minosoft.data.text.ChatComponent +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import de.bixilon.minosoft.util.KUtil.toResourceLocation + +class SmokerContainer(connection: PlayConnection, type: ContainerType, title: ChatComponent?) : SmeltingContainer(connection, type, title) { + + companion object : ContainerFactory { + override val RESOURCE_LOCATION: ResourceLocation = "minecraft:smoker".toResourceLocation() + + override fun build(connection: PlayConnection, type: ContainerType, title: ChatComponent?): CraftingContainer { + return CraftingContainer(connection, type, title) + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/ContainerFactory.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/ContainerFactory.kt index 0fc72b292..296d1c807 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/ContainerFactory.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/ContainerFactory.kt @@ -20,6 +20,5 @@ import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection interface ContainerFactory : CompanionResourceLocation { - fun build(connection: PlayConnection, type: ContainerType, title: ChatComponent? = null): T } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/DefaultContainerFactories.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/DefaultContainerFactories.kt index 47ae385c1..4bc298dcf 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/containers/DefaultContainerFactories.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/containers/DefaultContainerFactories.kt @@ -16,6 +16,9 @@ package de.bixilon.minosoft.data.registries.other.containers import de.bixilon.minosoft.data.container.types.CraftingContainer import de.bixilon.minosoft.data.container.types.PlayerInventory import de.bixilon.minosoft.data.container.types.generic.* +import de.bixilon.minosoft.data.container.types.processing.smelting.BlastFurnaceContainer +import de.bixilon.minosoft.data.container.types.processing.smelting.FurnaceContainer +import de.bixilon.minosoft.data.container.types.processing.smelting.SmokerContainer import de.bixilon.minosoft.data.registries.factory.DefaultFactory object DefaultContainerFactories : DefaultFactory>( @@ -29,4 +32,8 @@ object DefaultContainerFactories : DefaultFactory>( Generic9x6Container, CraftingContainer, + + BlastFurnaceContainer, + FurnaceContainer, + SmokerContainer, ) diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/container/ContainerPropertiesS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/container/ContainerPropertiesS2CP.kt index 5b2fba78f..c95026204 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/container/ContainerPropertiesS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/container/ContainerPropertiesS2CP.kt @@ -12,6 +12,7 @@ */ package de.bixilon.minosoft.protocol.packets.s2c.play.container +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.factory.LoadPacket import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer @@ -21,10 +22,14 @@ import de.bixilon.minosoft.util.logging.LogMessageType @LoadPacket class ContainerPropertiesS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { - val containerId: Byte = buffer.readByte() + val containerId = buffer.readUnsignedByte() val property = buffer.readUnsignedShort() val value = buffer.readUnsignedShort() + override fun handle(connection: PlayConnection) { + connection.player.containers[containerId]?.readProperty(property, value) + } + override fun log(reducedLog: Boolean) { Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Container properties (containerId=$containerId, property=$property, value=$value)" } } diff --git a/src/main/resources/assets/minosoft/mapping/atlas.json b/src/main/resources/assets/minosoft/mapping/atlas.json index 440464468..c72e87940 100644 --- a/src/main/resources/assets/minosoft/mapping/atlas.json +++ b/src/main/resources/assets/minosoft/mapping/atlas.json @@ -1368,5 +1368,184 @@ "start": [96, 10], "end": [102, 31] } + }, + "minecraft:furnace_container": { + "0": { + "start": [0, 0], + "end": [176, 166], + "texture": "minecraft:textures/gui/container/furnace.png", + "slots": { + "0": { + "start": [56, 17], + "end": [72, 33] + }, + "1": { + "start": [56, 53], + "end": [72, 69] + }, + "2": { + "start": [112, 31], + "end": [136, 55] + }, + "3": { + "start": [8, 84], + "end": [25, 101] + }, + "4": { + "start": [26, 84], + "end": [43, 101] + }, + "5": { + "start": [44, 84], + "end": [61, 101] + }, + "6": { + "start": [62, 84], + "end": [79, 101] + }, + "7": { + "start": [80, 84], + "end": [97, 101] + }, + "8": { + "start": [98, 84], + "end": [115, 101] + }, + "9": { + "start": [116, 84], + "end": [133, 101] + }, + "10": { + "start": [134, 84], + "end": [151, 101] + }, + "11": { + "start": [152, 84], + "end": [169, 101] + }, + "12": { + "start": [8, 102], + "end": [25, 119] + }, + "13": { + "start": [26, 102], + "end": [43, 119] + }, + "14": { + "start": [44, 102], + "end": [61, 119] + }, + "15": { + "start": [62, 102], + "end": [79, 119] + }, + "16": { + "start": [80, 102], + "end": [97, 119] + }, + "17": { + "start": [98, 102], + "end": [115, 119] + }, + "18": { + "start": [116, 102], + "end": [133, 119] + }, + "19": { + "start": [134, 102], + "end": [151, 119] + }, + "20": { + "start": [152, 102], + "end": [169, 119] + }, + "21": { + "start": [8, 120], + "end": [25, 137] + }, + "22": { + "start": [26, 120], + "end": [43, 137] + }, + "23": { + "start": [44, 120], + "end": [61, 137] + }, + "24": { + "start": [62, 120], + "end": [79, 137] + }, + "25": { + "start": [80, 120], + "end": [97, 137] + }, + "26": { + "start": [98, 120], + "end": [115, 137] + }, + "27": { + "start": [116, 120], + "end": [133, 137] + }, + "28": { + "start": [134, 120], + "end": [151, 137] + }, + "29": { + "start": [152, 120], + "end": [169, 137] + }, + "30": { + "start": [8, 142], + "end": [25, 159] + }, + "31": { + "start": [26, 142], + "end": [43, 159] + }, + "32": { + "start": [44, 142], + "end": [61, 159] + }, + "33": { + "start": [62, 142], + "end": [79, 159] + }, + "34": { + "start": [80, 142], + "end": [97, 159] + }, + "35": { + "start": [98, 142], + "end": [115, 159] + }, + "36": { + "start": [116, 142], + "end": [133, 159] + }, + "37": { + "start": [134, 142], + "end": [151, 159] + }, + "38": { + "start": [152, 142], + "end": [169, 159] + } + } + } + }, + "minecraft:furnace_container_fuel": { + "0": { + "start": [176, 0], + "end": [190, 14], + "texture": "minecraft:textures/gui/container/furnace.png" + } + }, + "minecraft:furnace_container_process": { + "0": { + "start": [176, 14], + "end": [199, 30], + "texture": "minecraft:textures/gui/container/furnace.png" + } } }