package buildcraft.transport.stripes; import java.util.ArrayList; import java.util.List; import net.minecraft.block.BlockDispenser; import net.minecraft.dispenser.IBehaviorDispenseItem; import net.minecraft.dispenser.IBlockSource; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.api.core.Position; import buildcraft.api.transport.IStripesActivator; import buildcraft.api.transport.IStripesHandler; public class StripesHandlerDispenser implements IStripesHandler { public static final List<Object> items = new ArrayList<Object>(); public class Source implements IBlockSource { private final World world; private final int x, y, z; private final ForgeDirection side; public Source(World world, int x, int y, int z, ForgeDirection side) { this.world = world; this.x = x; this.y = y; this.z = z; this.side = side; } @Override public double getX() { return (double) x + 0.5D; } @Override public double getY() { return (double) y + 0.5D; } @Override public double getZ() { return (double) z + 0.5D; } @Override public int getXInt() { return x; } @Override public int getYInt() { return y; } @Override public int getZInt() { return z; } @Override public int getBlockMetadata() { return side.ordinal(); } @Override public TileEntity getBlockTileEntity() { return world.getTileEntity(x, y, z); } @Override public World getWorld() { return world; } } @Override public StripesHandlerType getType() { return StripesHandlerType.ITEM_USE; } @Override public boolean shouldHandle(ItemStack stack) { if (items.contains(stack.getItem())) { return true; } Class<?> c = stack.getItem().getClass(); while (c != Item.class) { if (items.contains(c)) { return true; } c = c.getSuperclass(); } return false; } @Override public boolean handle(World world, int x, int y, int z, ForgeDirection direction, ItemStack stack, EntityPlayer player, IStripesActivator activator) { Position origin = new Position(x, y, z, direction); origin.moveBackwards(1.0D); IBlockSource source = new Source(world, (int) origin.x, (int) origin.y, (int) origin.z, direction); IBehaviorDispenseItem behaviour = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(stack.getItem()); if (behaviour != null) { ItemStack output = behaviour.dispense(source, stack.copy()); if (output.stackSize > 0) { activator.sendItem(output, direction.getOpposite()); } return true; } return false; } }