/**
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.transport.pipes;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLiquid;
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.WorldServer;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.IFluidBlock;
import cofh.api.energy.IEnergyHandler;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.core.Position;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.StatementSlot;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.IStripesHandler;
import buildcraft.api.transport.IStripesHandler.StripesHandlerType;
import buildcraft.api.transport.IStripesPipe;
import buildcraft.api.transport.PipeManager;
import buildcraft.core.lib.RFBattery;
import buildcraft.core.lib.inventory.InvUtils;
import buildcraft.core.lib.utils.BlockUtils;
import buildcraft.core.proxy.CoreProxy;
import buildcraft.transport.Pipe;
import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.PipeTransportItems;
import buildcraft.transport.TravelingItem;
import buildcraft.transport.pipes.events.PipeEventItem;
import buildcraft.transport.statements.ActionPipeDirection;
import buildcraft.transport.utils.TransportUtils;
public class PipeItemsStripes extends Pipe<PipeTransportItems> implements IEnergyHandler, IStripesPipe {
private RFBattery battery = new RFBattery(320 * 50, 640, 0);
private ForgeDirection actionDir = ForgeDirection.UNKNOWN;
public PipeItemsStripes(Item item) {
super(new PipeTransportItems(), item);
}
@Override
public void updateEntity() {
super.updateEntity();
if (container.getWorldObj().isRemote) {
return;
}
if (battery.getEnergyStored() >= 10) {
ForgeDirection o = actionDir;
if (o == ForgeDirection.UNKNOWN) {
o = getOpenOrientation();
}
if (o != ForgeDirection.UNKNOWN) {
Position p = new Position(container.xCoord, container.yCoord,
container.zCoord, o);
p.moveForwards(1.0);
if (!BlockUtils.isUnbreakableBlock(getWorld(), (int) p.x, (int) p.y, (int) p.z)) {
Block block = getWorld().getBlock((int) p.x, (int) p.y, (int) p.z);
int metadata = getWorld().getBlockMetadata((int) p.x, (int) p.y, (int) p.z);
if (block instanceof BlockLiquid || block instanceof IFluidBlock) {
return;
}
ItemStack stack = new ItemStack(block, 1, metadata);
EntityPlayer player = CoreProxy.proxy.getBuildCraftPlayer((WorldServer) getWorld(),
(int) p.x, (int) p.y, (int) p.z).get();
if (battery.useEnergy(10, 10, false) != 10) {
return;
}
for (IStripesHandler handler : PipeManager.stripesHandlers) {
if (handler.getType() == StripesHandlerType.BLOCK_BREAK
&& handler.shouldHandle(stack)) {
if (handler.handle(getWorld(), (int) p.x, (int) p.y, (int) p.z,
o, stack, player, this)) {
return;
}
}
}
ArrayList<ItemStack> stacks = block.getDrops(
getWorld(), (int) p.x, (int) p.y, (int) p.z,
metadata, 0
);
if (stacks != null) {
for (ItemStack s : stacks) {
if (s != null) {
sendItem(s, o.getOpposite());
}
}
}
getWorld().setBlockToAir((int) p.x, (int) p.y, (int) p.z);
}
}
return;
}
}
public void eventHandler(PipeEventItem.DropItem event) {
if (container.getWorldObj().isRemote) {
return;
}
ForgeDirection direction = actionDir;
if (direction == ForgeDirection.UNKNOWN) {
direction = event.direction;
}
Position p = new Position(container.xCoord, container.yCoord,
container.zCoord, direction);
p.moveForwards(1.0);
ItemStack stack = event.entity.getEntityItem();
EntityPlayer player = CoreProxy.proxy.getBuildCraftPlayer((WorldServer) getWorld(),
(int) p.x, (int) p.y, (int) p.z).get();
switch (direction) {
case DOWN:
player.rotationPitch = 90;
player.rotationYaw = 0;
break;
case UP:
player.rotationPitch = 270;
player.rotationYaw = 0;
break;
case NORTH:
player.rotationPitch = 0;
player.rotationYaw = 180;
break;
case SOUTH:
player.rotationPitch = 0;
player.rotationYaw = 0;
break;
case WEST:
player.rotationPitch = 0;
player.rotationYaw = 90;
break;
case EAST:
player.rotationPitch = 0;
player.rotationYaw = 270;
break;
case UNKNOWN:
break;
}
/**
* Check if there's a handler for this item type.
*/
for (IStripesHandler handler : PipeManager.stripesHandlers) {
if (handler.getType() == StripesHandlerType.ITEM_USE
&& handler.shouldHandle(stack)) {
if (handler.handle(getWorld(), (int) p.x, (int) p.y, (int) p.z,
direction, stack, player, this)) {
event.entity = null;
return;
}
}
}
}
@Override
public void dropItem(ItemStack itemStack, ForgeDirection direction) {
Position p = new Position(container.xCoord, container.yCoord,
container.zCoord, direction);
p.moveForwards(1.0);
InvUtils.dropItems(getWorld(), itemStack, (int) p.x, (int) p.y, (int) p.z);
}
@Override
public LinkedList<IActionInternal> getActions() {
LinkedList<IActionInternal> action = super.getActions();
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
if (!container.isPipeConnected(direction)) {
action.add(BuildCraftTransport.actionPipeDirection[direction.ordinal()]);
}
}
return action;
}
@Override
protected void actionsActivated(Collection<StatementSlot> actions) {
super.actionsActivated(actions);
actionDir = ForgeDirection.UNKNOWN;
for (StatementSlot action : actions) {
if (action.statement instanceof ActionPipeDirection) {
actionDir = ((ActionPipeDirection) action.statement).direction;
break;
}
}
}
@Override
public void sendItem(ItemStack itemStack, ForgeDirection direction) {
Position pos = new Position(container.xCoord + 0.5,
container.yCoord + TransportUtils.getPipeFloorOf(itemStack),
container.zCoord + 0.5, direction);
pos.moveBackwards(0.25D);
TravelingItem newItem = TravelingItem.make(pos.x, pos.y, pos.z, itemStack);
transport.injectItem(newItem, direction);
}
@Override
public IIconProvider getIconProvider() {
return BuildCraftTransport.instance.pipeIconProvider;
}
@Override
public int getIconIndex(ForgeDirection direction) {
return PipeIconProvider.TYPE.Stripes.ordinal();
}
@Override
public boolean canPipeConnect(TileEntity tile, ForgeDirection side) {
if (tile instanceof IPipeTile) {
IPipeTile tilePipe = (IPipeTile) tile;
if (tilePipe.getPipe() instanceof PipeItemsStripes) {
return false;
}
}
return super.canPipeConnect(tile, side);
}
@Override
public boolean canConnectEnergy(ForgeDirection from) {
return true;
}
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive,
boolean simulate) {
return battery.receiveEnergy(maxReceive, simulate);
}
@Override
public int extractEnergy(ForgeDirection from, int maxExtract,
boolean simulate) {
return 0;
}
@Override
public int getEnergyStored(ForgeDirection from) {
return 0;
}
@Override
public int getMaxEnergyStored(ForgeDirection from) {
return 10;
}
}