package com.austinv11.peripheralsplusplus.turtles.peripherals; import com.austinv11.peripheralsplusplus.reference.Config; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.turtle.ITurtleAccess; import net.minecraft.block.BlockDispenser; import net.minecraft.dispenser.IBehaviorDispenseItem; import net.minecraft.dispenser.IBlockSource; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class PeripheralDispenser extends MountedPeripheral { private ITurtleAccess turtle; public PeripheralDispenser(ITurtleAccess turtle) { this.turtle = turtle; } @Override public String getType() { return "flinging"; } @Override public String[] getMethodNames() { return new String[]{"dispense", "dispenseUp", "dispenseDown"}; } @Override public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException { if (!Config.enableFlingingTurtle) throw new LuaException("Flinging turtles have been disabled"); if (arguments.length > 0 && !(arguments[0] instanceof Double)) throw new LuaException("Bad argument #1 (expected number)"); int slot = 1; int direction; if (method == 1) direction = ForgeDirection.DOWN.flag; //Why these are reversed, idk. Dispensers be dum else if (method == 2) direction = ForgeDirection.UP.flag; else direction = turtle.getDirection(); turtle.getDirection(); if (arguments.length > 0) slot += (int)(double)(Double)arguments[0]; else slot = turtle.getSelectedSlot(); synchronized (this) { ItemStack stack = turtle.getInventory().getStackInSlot(slot); if (stack != null) { IBehaviorDispenseItem behavior = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(stack.getItem()); if (behavior != IBehaviorDispenseItem.itemDispenseBehaviorProvider) { BlockSourceTurtle blockSource = new BlockSourceTurtle(direction); ItemStack newStack = behavior.dispense(blockSource, stack); turtle.getInventory().setInventorySlotContents(slot, newStack.stackSize == 0 ? null : newStack); turtle.getInventory().markDirty(); } } } return new Object[0]; } @Override public boolean equals(IPeripheral other) { return this == other; } public class BlockSourceTurtle implements IBlockSource { public int direction; public BlockSourceTurtle(int direction) { this.direction = direction; } @Override public double getX() { return turtle.getPosition().posX; } @Override public double getY() { return turtle.getPosition().posY; } @Override public double getZ() { return turtle.getPosition().posZ; } @Override public int getXInt() { return turtle.getPosition().posX; } @Override public int getYInt() { return turtle.getPosition().posY; } @Override public int getZInt() { return turtle.getPosition().posZ; } @Override public int getBlockMetadata() { return direction; } @Override public TileEntity getBlockTileEntity() { return getWorld().getTileEntity(getXInt(), getYInt(), getZInt()); } @Override public World getWorld() { return turtle.getWorld(); } } }