package org.bukkit.craftbukkit.block; import net.minecraft.tileentity.TileEntityChest; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Chest; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest; import org.bukkit.inventory.Inventory; public class CraftChest extends CraftBlockState implements Chest { private final CraftWorld world; private final TileEntityChest chest; public CraftChest(final Block block) { super(block); world = (CraftWorld) block.getWorld(); chest = (TileEntityChest) world.getTileEntityAt(getX(), getY(), getZ()); } public Inventory getBlockInventory() { return new CraftInventory(chest); } public Inventory getInventory() { int x = getX(); int y = getY(); int z = getZ(); // The logic here is basically identical to the logic in BlockChest.interact CraftInventory inventory = new CraftInventory(chest); int id; if(world.getBlockTypeIdAt(x, y, z) == Material.CHEST.getId()) { id = Material.CHEST.getId(); } else if(world.getBlockTypeIdAt(x, y, z) == Material.TRAPPED_CHEST.getId()) { id = Material.TRAPPED_CHEST.getId(); } else { throw new IllegalStateException("CraftChest is not a chest but is instead " + world.getBlockAt(x, y, z)); } if(world.getBlockTypeIdAt(x - 1, y, z) == id) { CraftInventory left = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x - 1, y, z)); inventory = new CraftInventoryDoubleChest(left, inventory); } if(world.getBlockTypeIdAt(x + 1, y, z) == id) { CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x + 1, y, z)); inventory = new CraftInventoryDoubleChest(inventory, right); } if(world.getBlockTypeIdAt(x, y, z - 1) == id) { CraftInventory left = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x, y, z - 1)); inventory = new CraftInventoryDoubleChest(left, inventory); } if(world.getBlockTypeIdAt(x, y, z + 1) == id) { CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x, y, z + 1)); inventory = new CraftInventoryDoubleChest(inventory, right); } return inventory; } @Override public boolean update(boolean force, boolean applyPhysics) { boolean result = super.update(force, applyPhysics); if(result) { chest.markDirty(); } return result; } }