From 737d8a2585c7ebbb28fe02a49ac38cccf8c72375 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 20 Nov 2022 19:41:36 +0000 Subject: [PATCH] Add a couple of tests for inventory transfer For now this is just a couple of regression tests for a couple of CC:R bugs. --- .../platform/ContainerTransferContract.java | 21 +++ .../computercraft/gametest/Inventory_Test.kt | 69 +++++++++ .../computercraft/gametest/core/TestHooks.kt | 1 + .../inventory_test.checks_valid_item.snbt | 142 ++++++++++++++++++ .../inventory_test.fails_on_full.snbt | 142 ++++++++++++++++++ 5 files changed, 375 insertions(+) create mode 100644 projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Inventory_Test.kt create mode 100644 projects/common/src/testMod/resources/data/cctest/structures/inventory_test.checks_valid_item.snbt create mode 100644 projects/common/src/testMod/resources/data/cctest/structures/inventory_test.fails_on_full.snbt diff --git a/projects/common/src/testFixtures/java/dan200/computercraft/test/shared/platform/ContainerTransferContract.java b/projects/common/src/testFixtures/java/dan200/computercraft/test/shared/platform/ContainerTransferContract.java index 746146c16..b8dd6c0fb 100644 --- a/projects/common/src/testFixtures/java/dan200/computercraft/test/shared/platform/ContainerTransferContract.java +++ b/projects/common/src/testFixtures/java/dan200/computercraft/test/shared/platform/ContainerTransferContract.java @@ -109,6 +109,27 @@ public interface ContainerTransferContract { assertNoOverlap(source, destination); } + @Test + default void testNoMoveReject() { + var destination = new SimpleContainer(4) { + @Override + public boolean canPlaceItem(int slot, ItemStack item) { + return false; + } + }; + + var source = new SimpleContainer(4); + source.setItem(0, new ItemStack(Items.DIRT, 64)); + + var move = wrap(source).moveTo(wrap(destination), 64); + assertEquals(ContainerTransfer.NO_SPACE, move); + + assertThat(source.getItem(0), isStack(new ItemStack(Items.DIRT, 64))); + assertThat(destination.getItem(0), isStack(ItemStack.EMPTY)); + + assertNoOverlap(source, destination); + } + static void assertNoOverlap(Container... containers) { Set stacks = Collections.newSetFromMap(new IdentityHashMap<>()); for (var container : containers) { diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Inventory_Test.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Inventory_Test.kt new file mode 100644 index 000000000..e33050fdc --- /dev/null +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Inventory_Test.kt @@ -0,0 +1,69 @@ +package dan200.computercraft.gametest + +import dan200.computercraft.api.lua.ObjectArguments +import dan200.computercraft.core.apis.PeripheralAPI +import dan200.computercraft.gametest.api.assertContainerExactly +import dan200.computercraft.gametest.api.sequence +import dan200.computercraft.gametest.api.thenOnComputer +import dan200.computercraft.test.core.assertArrayEquals +import dan200.computercraft.test.core.computer.getApi +import net.minecraft.core.BlockPos +import net.minecraft.core.NonNullList +import net.minecraft.gametest.framework.GameTest +import net.minecraft.gametest.framework.GameTestHelper +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items + +class Inventory_Test { + /** + * Ensures inventory methods check an item is valid before moving it. + * + * @see + */ + @GameTest(required = false) + fun Checks_valid_item(helper: GameTestHelper) = helper.sequence { + thenOnComputer { + getApi().call( + context, + ObjectArguments( + "back", + "callRemote", + "minecraft:barrel_0", + "pushItems", + "minecraft:shulker_box_0", + 1, + ), + ).await().assertArrayEquals(0, message = "Does not move items") + } + thenExecute { + helper.assertContainerExactly(BlockPos(1, 2, 2), listOf()) + helper.assertContainerExactly(BlockPos(3, 2, 2), listOf(ItemStack(Items.SHULKER_BOX))) + } + } + + /** + * Ensures inventory methods check an item is valid before moving it. + * + * @see + */ + @GameTest + fun Fails_on_full(helper: GameTestHelper) = helper.sequence { + thenOnComputer { + getApi().call( + context, + ObjectArguments( + "back", + "callRemote", + "minecraft:furnace_0", + "pushItems", + "minecraft:barrel_0", + 1, + ), + ).await().assertArrayEquals(0, message = "Does not move items") + } + thenExecute { + helper.assertContainerExactly(BlockPos(1, 2, 2), listOf(ItemStack.EMPTY, ItemStack.EMPTY, ItemStack(Items.IRON_INGOT))) + helper.assertContainerExactly(BlockPos(3, 2, 2), NonNullList.withSize(27, ItemStack(Items.POLISHED_ANDESITE))) + } + } +} diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt index 16f4badbe..348a294d6 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt @@ -74,6 +74,7 @@ object TestHooks { Computer_Test::class.java, CraftOs_Test::class.java, Disk_Drive_Test::class.java, + Inventory_Test::class.java, Loot_Test::class.java, Modem_Test::class.java, Monitor_Test::class.java, diff --git a/projects/common/src/testMod/resources/data/cctest/structures/inventory_test.checks_valid_item.snbt b/projects/common/src/testMod/resources/data/cctest/structures/inventory_test.checks_valid_item.snbt new file mode 100644 index 000000000..800b24487 --- /dev/null +++ b/projects/common/src/testMod/resources/data/cctest/structures/inventory_test.checks_valid_item.snbt @@ -0,0 +1,142 @@ +{ + DataVersion: 3120, + size: [5, 5, 5], + data: [ + {pos: [0, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [0, 1, 3], state: "minecraft:air"}, + {pos: [0, 1, 4], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:shulker_box{facing:up}", nbt: {id: "minecraft:shulker_box"}}, + {pos: [1, 1, 3], state: "computercraft:wired_modem_full{modem:false,peripheral:true}", nbt: {PeripheralAccess: 1b, PeripheralId2: 0, PeripheralType2: "minecraft:shulker_box", id: "computercraft:wired_modem_full"}}, + {pos: [1, 1, 4], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "computercraft:computer_advanced{facing:north,state:on}", nbt: {ComputerId: 1, Label: "inventory_test.checks_valid_item", On: 1b, id: "computercraft:computer_advanced"}}, + {pos: [2, 1, 2], state: "computercraft:cable{cable:true,down:false,east:false,modem:north_off,north:true,south:true,up:false,waterlogged:false,west:false}", nbt: {PeirpheralAccess: 0b, id: "computercraft:cable"}}, + {pos: [2, 1, 3], state: "computercraft:cable{cable:true,down:false,east:true,modem:none,north:true,south:false,up:false,waterlogged:false,west:true}", nbt: {PeirpheralAccess: 0b, id: "computercraft:cable"}}, + {pos: [2, 1, 4], state: "minecraft:air"}, + {pos: [3, 1, 0], state: "minecraft:air"}, + {pos: [3, 1, 1], state: "minecraft:air"}, + {pos: [3, 1, 2], state: "minecraft:barrel{facing:up,open:false}", nbt: {Items: [{Count: 1b, Slot: 0b, id: "minecraft:shulker_box"}], id: "minecraft:barrel"}}, + {pos: [3, 1, 3], state: "computercraft:wired_modem_full{modem:false,peripheral:true}", nbt: {PeripheralAccess: 1b, PeripheralId2: 0, PeripheralType2: "minecraft:barrel", id: "computercraft:wired_modem_full"}}, + {pos: [3, 1, 4], state: "minecraft:air"}, + {pos: [4, 1, 0], state: "minecraft:air"}, + {pos: [4, 1, 1], state: "minecraft:air"}, + {pos: [4, 1, 2], state: "minecraft:air"}, + {pos: [4, 1, 3], state: "minecraft:air"}, + {pos: [4, 1, 4], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [0, 2, 3], state: "minecraft:air"}, + {pos: [0, 2, 4], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 3], state: "minecraft:air"}, + {pos: [1, 2, 4], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 3], state: "minecraft:air"}, + {pos: [2, 2, 4], state: "minecraft:air"}, + {pos: [3, 2, 0], state: "minecraft:air"}, + {pos: [3, 2, 1], state: "minecraft:air"}, + {pos: [3, 2, 2], state: "minecraft:air"}, + {pos: [3, 2, 3], state: "minecraft:air"}, + {pos: [3, 2, 4], state: "minecraft:air"}, + {pos: [4, 2, 0], state: "minecraft:air"}, + {pos: [4, 2, 1], state: "minecraft:air"}, + {pos: [4, 2, 2], state: "minecraft:air"}, + {pos: [4, 2, 3], state: "minecraft:air"}, + {pos: [4, 2, 4], state: "minecraft:air"}, + {pos: [0, 3, 0], state: "minecraft:air"}, + {pos: [0, 3, 1], state: "minecraft:air"}, + {pos: [0, 3, 2], state: "minecraft:air"}, + {pos: [0, 3, 3], state: "minecraft:air"}, + {pos: [0, 3, 4], state: "minecraft:air"}, + {pos: [1, 3, 0], state: "minecraft:air"}, + {pos: [1, 3, 1], state: "minecraft:air"}, + {pos: [1, 3, 2], state: "minecraft:air"}, + {pos: [1, 3, 3], state: "minecraft:air"}, + {pos: [1, 3, 4], state: "minecraft:air"}, + {pos: [2, 3, 0], state: "minecraft:air"}, + {pos: [2, 3, 1], state: "minecraft:air"}, + {pos: [2, 3, 2], state: "minecraft:air"}, + {pos: [2, 3, 3], state: "minecraft:air"}, + {pos: [2, 3, 4], state: "minecraft:air"}, + {pos: [3, 3, 0], state: "minecraft:air"}, + {pos: [3, 3, 1], state: "minecraft:air"}, + {pos: [3, 3, 2], state: "minecraft:air"}, + {pos: [3, 3, 3], state: "minecraft:air"}, + {pos: [3, 3, 4], state: "minecraft:air"}, + {pos: [4, 3, 0], state: "minecraft:air"}, + {pos: [4, 3, 1], state: "minecraft:air"}, + {pos: [4, 3, 2], state: "minecraft:air"}, + {pos: [4, 3, 3], state: "minecraft:air"}, + {pos: [4, 3, 4], state: "minecraft:air"}, + {pos: [0, 4, 0], state: "minecraft:air"}, + {pos: [0, 4, 1], state: "minecraft:air"}, + {pos: [0, 4, 2], state: "minecraft:air"}, + {pos: [0, 4, 3], state: "minecraft:air"}, + {pos: [0, 4, 4], state: "minecraft:air"}, + {pos: [1, 4, 0], state: "minecraft:air"}, + {pos: [1, 4, 1], state: "minecraft:air"}, + {pos: [1, 4, 2], state: "minecraft:air"}, + {pos: [1, 4, 3], state: "minecraft:air"}, + {pos: [1, 4, 4], state: "minecraft:air"}, + {pos: [2, 4, 0], state: "minecraft:air"}, + {pos: [2, 4, 1], state: "minecraft:air"}, + {pos: [2, 4, 2], state: "minecraft:air"}, + {pos: [2, 4, 3], state: "minecraft:air"}, + {pos: [2, 4, 4], state: "minecraft:air"}, + {pos: [3, 4, 0], state: "minecraft:air"}, + {pos: [3, 4, 1], state: "minecraft:air"}, + {pos: [3, 4, 2], state: "minecraft:air"}, + {pos: [3, 4, 3], state: "minecraft:air"}, + {pos: [3, 4, 4], state: "minecraft:air"}, + {pos: [4, 4, 0], state: "minecraft:air"}, + {pos: [4, 4, 1], state: "minecraft:air"}, + {pos: [4, 4, 2], state: "minecraft:air"}, + {pos: [4, 4, 3], state: "minecraft:air"}, + {pos: [4, 4, 4], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:polished_andesite", + "minecraft:air", + "minecraft:shulker_box{facing:up}", + "computercraft:wired_modem_full{modem:false,peripheral:true}", + "computercraft:computer_advanced{facing:north,state:on}", + "computercraft:cable{cable:true,down:false,east:false,modem:north_off,north:true,south:true,up:false,waterlogged:false,west:false}", + "computercraft:cable{cable:true,down:false,east:true,modem:none,north:true,south:false,up:false,waterlogged:false,west:true}", + "minecraft:barrel{facing:up,open:false}" + ] +} diff --git a/projects/common/src/testMod/resources/data/cctest/structures/inventory_test.fails_on_full.snbt b/projects/common/src/testMod/resources/data/cctest/structures/inventory_test.fails_on_full.snbt new file mode 100644 index 000000000..199189ce6 --- /dev/null +++ b/projects/common/src/testMod/resources/data/cctest/structures/inventory_test.fails_on_full.snbt @@ -0,0 +1,142 @@ +{ + DataVersion: 3120, + size: [5, 5, 5], + data: [ + {pos: [0, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [0, 1, 3], state: "minecraft:air"}, + {pos: [0, 1, 4], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:furnace{facing:north,lit:false}", nbt: {BurnTime: 0s, CookTime: 0s, CookTimeTotal: 200s, Items: [{Count: 1b, Slot: 2b, id: "minecraft:iron_ingot"}], RecipesUsed: {"minecraft:iron_ingot_from_smelting_iron_ore": 1}, id: "minecraft:furnace"}}, + {pos: [1, 1, 3], state: "computercraft:wired_modem_full{modem:false,peripheral:true}", nbt: {PeripheralAccess: 1b, PeripheralId2: 0, PeripheralType2: "minecraft:furnace", id: "computercraft:wired_modem_full"}}, + {pos: [1, 1, 4], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "computercraft:computer_advanced{facing:north,state:on}", nbt: {ComputerId: 1, Label: "inventory_test.fails_on_full", On: 1b, id: "computercraft:computer_advanced"}}, + {pos: [2, 1, 2], state: "computercraft:cable{cable:true,down:false,east:false,modem:north_off,north:true,south:true,up:false,waterlogged:false,west:false}", nbt: {PeirpheralAccess: 0b, id: "computercraft:cable"}}, + {pos: [2, 1, 3], state: "computercraft:cable{cable:true,down:false,east:true,modem:none,north:true,south:false,up:false,waterlogged:false,west:true}", nbt: {PeirpheralAccess: 0b, id: "computercraft:cable"}}, + {pos: [2, 1, 4], state: "minecraft:air"}, + {pos: [3, 1, 0], state: "minecraft:air"}, + {pos: [3, 1, 1], state: "minecraft:air"}, + {pos: [3, 1, 2], state: "minecraft:barrel{facing:up,open:false}", nbt: {Items: [{Count: 1b, Slot: 0b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 1b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 2b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 3b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 4b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 5b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 6b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 7b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 8b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 9b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 10b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 11b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 12b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 13b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 14b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 15b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 16b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 17b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 18b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 19b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 20b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 21b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 22b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 23b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 24b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 25b, id: "minecraft:polished_andesite"}, {Count: 1b, Slot: 26b, id: "minecraft:polished_andesite"}], id: "minecraft:barrel"}}, + {pos: [3, 1, 3], state: "computercraft:wired_modem_full{modem:false,peripheral:true}", nbt: {PeripheralAccess: 1b, PeripheralId2: 0, PeripheralType2: "minecraft:barrel", id: "computercraft:wired_modem_full"}}, + {pos: [3, 1, 4], state: "minecraft:air"}, + {pos: [4, 1, 0], state: "minecraft:air"}, + {pos: [4, 1, 1], state: "minecraft:air"}, + {pos: [4, 1, 2], state: "minecraft:air"}, + {pos: [4, 1, 3], state: "minecraft:air"}, + {pos: [4, 1, 4], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [0, 2, 3], state: "minecraft:air"}, + {pos: [0, 2, 4], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 3], state: "minecraft:air"}, + {pos: [1, 2, 4], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 3], state: "minecraft:air"}, + {pos: [2, 2, 4], state: "minecraft:air"}, + {pos: [3, 2, 0], state: "minecraft:air"}, + {pos: [3, 2, 1], state: "minecraft:air"}, + {pos: [3, 2, 2], state: "minecraft:air"}, + {pos: [3, 2, 3], state: "minecraft:air"}, + {pos: [3, 2, 4], state: "minecraft:air"}, + {pos: [4, 2, 0], state: "minecraft:air"}, + {pos: [4, 2, 1], state: "minecraft:air"}, + {pos: [4, 2, 2], state: "minecraft:air"}, + {pos: [4, 2, 3], state: "minecraft:air"}, + {pos: [4, 2, 4], state: "minecraft:air"}, + {pos: [0, 3, 0], state: "minecraft:air"}, + {pos: [0, 3, 1], state: "minecraft:air"}, + {pos: [0, 3, 2], state: "minecraft:air"}, + {pos: [0, 3, 3], state: "minecraft:air"}, + {pos: [0, 3, 4], state: "minecraft:air"}, + {pos: [1, 3, 0], state: "minecraft:air"}, + {pos: [1, 3, 1], state: "minecraft:air"}, + {pos: [1, 3, 2], state: "minecraft:air"}, + {pos: [1, 3, 3], state: "minecraft:air"}, + {pos: [1, 3, 4], state: "minecraft:air"}, + {pos: [2, 3, 0], state: "minecraft:air"}, + {pos: [2, 3, 1], state: "minecraft:air"}, + {pos: [2, 3, 2], state: "minecraft:air"}, + {pos: [2, 3, 3], state: "minecraft:air"}, + {pos: [2, 3, 4], state: "minecraft:air"}, + {pos: [3, 3, 0], state: "minecraft:air"}, + {pos: [3, 3, 1], state: "minecraft:air"}, + {pos: [3, 3, 2], state: "minecraft:air"}, + {pos: [3, 3, 3], state: "minecraft:air"}, + {pos: [3, 3, 4], state: "minecraft:air"}, + {pos: [4, 3, 0], state: "minecraft:air"}, + {pos: [4, 3, 1], state: "minecraft:air"}, + {pos: [4, 3, 2], state: "minecraft:air"}, + {pos: [4, 3, 3], state: "minecraft:air"}, + {pos: [4, 3, 4], state: "minecraft:air"}, + {pos: [0, 4, 0], state: "minecraft:air"}, + {pos: [0, 4, 1], state: "minecraft:air"}, + {pos: [0, 4, 2], state: "minecraft:air"}, + {pos: [0, 4, 3], state: "minecraft:air"}, + {pos: [0, 4, 4], state: "minecraft:air"}, + {pos: [1, 4, 0], state: "minecraft:air"}, + {pos: [1, 4, 1], state: "minecraft:air"}, + {pos: [1, 4, 2], state: "minecraft:air"}, + {pos: [1, 4, 3], state: "minecraft:air"}, + {pos: [1, 4, 4], state: "minecraft:air"}, + {pos: [2, 4, 0], state: "minecraft:air"}, + {pos: [2, 4, 1], state: "minecraft:air"}, + {pos: [2, 4, 2], state: "minecraft:air"}, + {pos: [2, 4, 3], state: "minecraft:air"}, + {pos: [2, 4, 4], state: "minecraft:air"}, + {pos: [3, 4, 0], state: "minecraft:air"}, + {pos: [3, 4, 1], state: "minecraft:air"}, + {pos: [3, 4, 2], state: "minecraft:air"}, + {pos: [3, 4, 3], state: "minecraft:air"}, + {pos: [3, 4, 4], state: "minecraft:air"}, + {pos: [4, 4, 0], state: "minecraft:air"}, + {pos: [4, 4, 1], state: "minecraft:air"}, + {pos: [4, 4, 2], state: "minecraft:air"}, + {pos: [4, 4, 3], state: "minecraft:air"}, + {pos: [4, 4, 4], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:polished_andesite", + "minecraft:air", + "minecraft:furnace{facing:north,lit:false}", + "computercraft:wired_modem_full{modem:false,peripheral:true}", + "computercraft:computer_advanced{facing:north,state:on}", + "computercraft:cable{cable:true,down:false,east:false,modem:north_off,north:true,south:true,up:false,waterlogged:false,west:false}", + "computercraft:cable{cable:true,down:false,east:true,modem:none,north:true,south:false,up:false,waterlogged:false,west:true}", + "minecraft:barrel{facing:up,open:false}" + ] +}