/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.blocks.machine.gamma; import buildcraft.api.statements.IActionExternal; import mods.railcraft.api.carts.CartTools; import mods.railcraft.common.blocks.machine.TileMachineItem; import mods.railcraft.common.blocks.tracks.TrackTools; import mods.railcraft.common.plugins.buildcraft.actions.Actions; import mods.railcraft.common.plugins.buildcraft.triggers.IHasCart; import mods.railcraft.common.plugins.buildcraft.triggers.IHasWork; import mods.railcraft.common.plugins.forge.WorldPlugin; import mods.railcraft.common.util.inventory.PhantomInventory; import mods.railcraft.common.util.misc.Game; import mods.railcraft.common.util.misc.MiscTools; import net.minecraft.block.Block; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; /** * @author CovertJaguar <http://www.railcraft.info> */ public abstract class TileLoaderBase extends TileMachineItem implements IHasCart, IHasWork { public static final float STOP_VELOCITY = 0.02f; public static final int PAUSE_DELAY = 4; private final PhantomInventory invCarts = new PhantomInventory(2, this); protected EntityMinecart currentCart; private boolean powered; private boolean sendCartGateAction = false; private int pause = 0; @Override public boolean hasMinecart() { return currentCart != null; } public abstract boolean canHandleCart(EntityMinecart cart); @Override public boolean hasWork() { return currentCart != null && canHandleCart(currentCart) && (isProcessing() || !shouldSendCart(currentCart)); } public abstract boolean isManualMode(); public abstract boolean isProcessing(); protected abstract boolean shouldSendCart(EntityMinecart cart); protected void sendCart(EntityMinecart cart) { if (cart == null) return; if (isManualMode()) return; if (CartTools.cartVelocityIsLessThan(cart, STOP_VELOCITY) || cart.isPoweredCart()) { setPowered(true); } } public final boolean isPowered() { return powered; } protected void setPowered(boolean p) { if (isManualMode()) p = false; if (powered != p) { powered = p; notifyBlocksOfNeighborChange(); } } public final PhantomInventory getCartFilters() { return invCarts; } @Override public void actionActivated(IActionExternal action) { if (action == Actions.SEND_CART) sendCartGateAction = true; if (action == Actions.PAUSE) pause = PAUSE_DELAY; } public boolean isSendCartGateAction() { return sendCartGateAction; } public void cartWasSent() { sendCartGateAction = false; } public boolean isPaused() { return pause > 0; } @Override public final boolean canUpdate() { return true; } @Override public void updateEntity() { super.updateEntity(); if (Game.isNotHost(getWorld())) return; if (pause > 0) pause--; } @Override public final boolean canConnectRedstone(int dir) { return true; } @Override public final boolean isPoweringTo(int side) { if (!isPowered()) return false; ForgeDirection opSide = MiscTools.getOppositeSide(side); Block block = WorldPlugin.getBlockOnSide(worldObj, xCoord, yCoord, zCoord, opSide); return TrackTools.isRailBlock(block) || block == Blocks.redstone_wire || block == Blocks.powered_repeater || block == Blocks.unpowered_repeater; } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setBoolean("powered", powered); getCartFilters().writeToNBT("invCarts", data); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); setPowered(data.getBoolean("powered")); getCartFilters().readFromNBT("invCarts", data); } }