package miscperipherals.peripheral; import miscperipherals.core.LuaManager; import miscperipherals.util.Util; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryBasic; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import dan200.computer.api.IComputerAccess; import dan200.computer.api.IHostedPeripheral; import dan200.turtle.api.ITurtleAccess; public class PeripheralChest implements IHostedPeripheral { private final ITurtleAccess turtle; private final int pages; private IInventory inventory; private int curPage = 1; public PeripheralChest(ITurtleAccess turtle, int pages) { this.turtle = turtle; this.pages = pages; inventory = new InventoryBasic("Turtle", false, turtle.getInventorySize() * pages); } @Override public String getType() { return "chest"; } @Override public String[] getMethodNames() { return new String[] {"swap", "swapRange", "getPages", "setPage", "getPage"}; } @Override public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception { switch (method) { case 0: { int baseSlot = curPage * turtle.getInventorySize(); if (arguments.length > 1) { int[] slots = new int[arguments.length]; for (int i = 0; i < arguments.length; i++) { if (!(arguments[i] instanceof Double)) throw new Exception("bad argument #" + (i + 1) + " (expected number)"); else { int slot = (int) Math.floor((Double) arguments[i]) - 1; if (slot < 0 || slot > turtle.getInventorySize()) throw new Exception("bad slot " + (slot + 1) + " at argument " + (i + 1) + " (expected 1-16)"); } } for (int i = 0; i < slots.length; i++) { ItemStack stack = inventory.getStackInSlot(baseSlot + slots[i]); inventory.setInventorySlotContents(baseSlot + slots[i], turtle.getSlotContents(slots[i])); turtle.setSlotContents(slots[i], stack); } } else { for (int i = 0; i < turtle.getInventorySize(); i++) { ItemStack stack = inventory.getStackInSlot(baseSlot + i); inventory.setInventorySlotContents(baseSlot + i, turtle.getSlotContents(i)); turtle.setSlotContents(i, stack); } } return new Object[0]; } case 1: { if (arguments.length < 2) throw new Exception("too few arguments"); else if (!(arguments[0] instanceof Double)) throw new Exception("bad argument #1 (expected number)"); else if (!(arguments[1] instanceof Double)) throw new Exception("bad argument #2 (expected number)"); int start = (int) Math.floor((Double) arguments[0]) - 1; if (start < 0 || start > turtle.getInventorySize()) throw new Exception("bad start slot " + (start + 1) + " (expected 1-16)"); int end = (int) Math.floor((Double) arguments[1]) - 1; if (end < 0 || start > turtle.getInventorySize()) throw new Exception("bad end slot " + (end + 1) + " (expected 1-16)"); int baseSlot = curPage * turtle.getInventorySize(); for (int i = Math.min(start, end); i <= Math.max(start, end); i++) { ItemStack stack = inventory.getStackInSlot(baseSlot + i); inventory.setInventorySlotContents(baseSlot + i, turtle.getSlotContents(i)); turtle.setSlotContents(i, stack); } } case 2: { return new Object[] {pages}; } case 3: { if (arguments.length < 1) throw new Exception("too few arguments"); else if (!(arguments[0] instanceof Double)) throw new Exception("bad argument #1 (expected number)"); int page = (int) Math.floor((Double) arguments[0]); if (page < 1 || page > pages) throw new Exception("bad page " + page + " (expected 1-" + pages + ")"); curPage = page; return new Object[0]; } case 4: { return new Object[] {curPage}; } } return new Object[0]; } @Override public boolean canAttachToSide(int side) { return true; } @Override public void attach(IComputerAccess computer) { LuaManager.mount(computer); } @Override public void detach(IComputerAccess computer) { } @Override public void update() { } @Override public void readFromNBT(NBTTagCompound nbttagcompound) { Util.readInventoryFromNBT(inventory, nbttagcompound.getTagList("Items")); curPage = nbttagcompound.getInteger("curPage"); } @Override public void writeToNBT(NBTTagCompound nbttagcompound) { nbttagcompound.setTag("Items", Util.writeInventoryToNBT(inventory)); nbttagcompound.setInteger("curPage", curPage); } }