/* * 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 java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import mods.railcraft.api.carts.CartTools; import mods.railcraft.common.carts.CartUtils; import mods.railcraft.common.fluids.FluidItemHelper; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.inventory.IInventory; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.ForgeDirection; import mods.railcraft.common.fluids.FluidHelper; import mods.railcraft.common.fluids.TankManager; import mods.railcraft.common.fluids.tanks.StandardTank; import mods.railcraft.common.util.inventory.InvTools; import mods.railcraft.common.util.inventory.PhantomInventory; import mods.railcraft.common.util.inventory.wrappers.InventoryMapper; import mods.railcraft.common.util.misc.Game; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; public abstract class TileLoaderFluidBase extends TileLoaderBase implements IInventory, IFluidHandler, ISidedInventory { protected static final int SLOT_INPUT = 0; protected static final int SLOT_OUTPUT = 1; protected static final int[] SLOTS = InvTools.buildSlotArray(0, 2); protected static final int CAPACITY = FluidHelper.BUCKET_VOLUME * 32; protected final PhantomInventory invFilter = new PhantomInventory(1); protected final IInventory invInput = new InventoryMapper(this, SLOT_INPUT, 1); protected final TankManager tankManager = new TankManager(); protected final StandardTank loaderTank = new StandardTank(CAPACITY, this); protected int flow = 0; protected TileLoaderFluidBase() { super(); setInventorySize(2); tankManager.add(loaderTank); } public TankManager getTankManager() { return tankManager; } public PhantomInventory getFluidFilter() { return invFilter; } public Fluid getFilterFluid() { if (invFilter.getStackInSlot(0) != null) { FluidStack fluidStack = FluidItemHelper.getFluidStackInContainer(invFilter.getStackInSlot(0)); return fluidStack != null ? fluidStack.getFluid() : null; } return null; } public Fluid getFluidHandled() { Fluid fluid = getFilterFluid(); if (fluid != null) return fluid; return loaderTank.getFluidType(); } @Override public boolean isProcessing() { return flow > 0; } protected void sendCart(EntityMinecart cart) { if (cart == null) return; if (isManualMode()) return; if (CartTools.cartVelocityIsLessThan(cart, STOP_VELOCITY)) { flow = 0; setPowered(true); } } @Override protected void setPowered(boolean p) { if (isManualMode()) p = false; super.setPowered(p); } @Override public boolean canHandleCart(EntityMinecart cart) { if (isSendCartGateAction()) return false; if (!(cart instanceof IFluidHandler)) return false; ItemStack minecartSlot1 = getCartFilters().getStackInSlot(0); ItemStack minecartSlot2 = getCartFilters().getStackInSlot(1); if (minecartSlot1 != null || minecartSlot2 != null) if (!CartUtils.doesCartMatchFilter(minecartSlot1, cart) && !CartUtils.doesCartMatchFilter(minecartSlot2, cart)) return false; return true; } @Override public void updateEntity() { super.updateEntity(); if (Game.isHost(getWorld()) && clock % FluidHelper.NETWORK_UPDATE_INTERVAL == 0) sendUpdateToClient(); } @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return slot != SLOT_OUTPUT; } @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { return tankManager.fill(from, resource, doFill); } @Override public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { return tankManager.drain(from, maxDrain, doDrain); } @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { return tankManager.drain(from, resource, doDrain); } @Override public FluidTankInfo[] getTankInfo(ForgeDirection dir) { return tankManager.getTankInfo(); } @Override public int[] getAccessibleSlotsFromSide(int side) { return SLOTS; } @Override public boolean canInsertItem(int slot, ItemStack stack, int side) { return isItemValidForSlot(slot, stack); } @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { return slot == SLOT_OUTPUT; } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); if (data.getTag("tanks") instanceof NBTTagCompound) data.setTag("tanks", new NBTTagList()); tankManager.readTanksFromNBT(data); if (data.hasKey("filter")) { NBTTagCompound filter = data.getCompoundTag("filter"); getFluidFilter().readFromNBT("Items", filter); } else getFluidFilter().readFromNBT("invFilter", data); } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); tankManager.writeTanksToNBT(data); getFluidFilter().writeToNBT("invFilter", data); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); tankManager.writePacketData(data); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); tankManager.readPacketData(data); } }