192 lines
6 KiB
Java
192 lines
6 KiB
Java
/**
|
|
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
|
|
* http://www.mod-buildcraft.com
|
|
*
|
|
* 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.HashSet;
|
|
import java.util.Set;
|
|
import io.netty.buffer.ByteBuf;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.inventory.IInventory;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
import net.minecraftforge.fluids.Fluid;
|
|
import buildcraft.BuildCraftTransport;
|
|
import buildcraft.api.core.IIconProvider;
|
|
import buildcraft.core.GuiIds;
|
|
import buildcraft.core.lib.inventory.SimpleInventory;
|
|
import buildcraft.core.lib.utils.FluidUtils;
|
|
import buildcraft.core.lib.utils.NetworkUtils;
|
|
import buildcraft.transport.BlockGenericPipe;
|
|
import buildcraft.transport.IDiamondPipe;
|
|
import buildcraft.transport.Pipe;
|
|
import buildcraft.transport.PipeIconProvider;
|
|
import buildcraft.transport.PipeTransportFluids;
|
|
import buildcraft.transport.pipes.events.PipeEventFluid;
|
|
|
|
public class PipeFluidsDiamond extends Pipe<PipeTransportFluids> implements IDiamondPipe {
|
|
|
|
private class FilterInventory extends SimpleInventory {
|
|
public boolean[] filteredDirections = new boolean[6];
|
|
public Fluid[] fluids = new Fluid[54];
|
|
|
|
public FilterInventory(int size, String invName, int invStackLimit) {
|
|
super(size, invName, invStackLimit);
|
|
}
|
|
|
|
@Override
|
|
public boolean isItemValidForSlot(int slot, ItemStack stack) {
|
|
return stack == null || FluidUtils.isFluidContainer(stack);
|
|
}
|
|
|
|
@Override
|
|
public void markDirty() {
|
|
// calculate fluid cache
|
|
for (int i = 0; i < 6; i++) {
|
|
filteredDirections[i] = false;
|
|
}
|
|
|
|
for (int i = 0; i < 54; i++) {
|
|
fluids[i] = FluidUtils.getFluidFromItemStack(getStackInSlot(i));
|
|
if (fluids[i] != null) {
|
|
filteredDirections[i / 9] = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private FilterInventory filters = new FilterInventory(54, "Filters", 1);
|
|
|
|
public PipeFluidsDiamond(Item item) {
|
|
super(new PipeTransportFluids(), item);
|
|
|
|
transport.initFromPipe(getClass());
|
|
}
|
|
|
|
@Override
|
|
public IInventory getFilters() {
|
|
return filters;
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public IIconProvider getIconProvider() {
|
|
return BuildCraftTransport.instance.pipeIconProvider;
|
|
}
|
|
|
|
@Override
|
|
public int getIconIndex(ForgeDirection direction) {
|
|
switch (direction) {
|
|
case UNKNOWN:
|
|
return PipeIconProvider.TYPE.PipeFluidsDiamond_Center.ordinal();
|
|
case DOWN:
|
|
return PipeIconProvider.TYPE.PipeFluidsDiamond_Down.ordinal();
|
|
case UP:
|
|
return PipeIconProvider.TYPE.PipeFluidsDiamond_Up.ordinal();
|
|
case NORTH:
|
|
return PipeIconProvider.TYPE.PipeFluidsDiamond_North.ordinal();
|
|
case SOUTH:
|
|
return PipeIconProvider.TYPE.PipeFluidsDiamond_South.ordinal();
|
|
case WEST:
|
|
return PipeIconProvider.TYPE.PipeFluidsDiamond_West.ordinal();
|
|
case EAST:
|
|
return PipeIconProvider.TYPE.PipeFluidsDiamond_East.ordinal();
|
|
default:
|
|
throw new IllegalArgumentException("direction out of bounds");
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getIconIndexForItem() {
|
|
return PipeIconProvider.TYPE.PipeFluidsDiamond_Item.ordinal();
|
|
}
|
|
|
|
@Override
|
|
public boolean blockActivated(EntityPlayer entityplayer) {
|
|
if (entityplayer.getCurrentEquippedItem() != null) {
|
|
if (Block.getBlockFromItem(entityplayer.getCurrentEquippedItem().getItem()) instanceof BlockGenericPipe) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (!container.getWorldObj().isRemote) {
|
|
entityplayer.openGui(BuildCraftTransport.instance, GuiIds.PIPE_DIAMOND, container.getWorldObj(), container.xCoord, container.yCoord, container.zCoord);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public void eventHandler(PipeEventFluid.FindDest event) {
|
|
Fluid fluidInTank = event.fluidStack.getFluid();
|
|
Set<ForgeDirection> originalDestinations = new HashSet<ForgeDirection>();
|
|
originalDestinations.addAll(event.destinations.elementSet());
|
|
boolean isFiltered = true;
|
|
int[] filterCount = new int[6];
|
|
|
|
for (ForgeDirection dir : originalDestinations) {
|
|
if (container.isPipeConnected(dir) && filters.filteredDirections[dir.ordinal()]) {
|
|
for (int slot = dir.ordinal() * 9; slot < dir.ordinal() * 9 + 9; ++slot) {
|
|
if (filters.fluids[slot] != null && filters.fluids[slot].getID() == fluidInTank.getID()) {
|
|
filterCount[dir.ordinal()]++;
|
|
isFiltered = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
event.destinations.clear();
|
|
|
|
if (!isFiltered) {
|
|
for (ForgeDirection to : originalDestinations) {
|
|
if (!filters.filteredDirections[to.ordinal()]) {
|
|
event.destinations.add(to);
|
|
}
|
|
}
|
|
} else {
|
|
for (ForgeDirection to : originalDestinations) {
|
|
if (filterCount[to.ordinal()] > 0) {
|
|
event.destinations.add(to, filterCount[to.ordinal()]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* SAVING & LOADING */
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound nbt) {
|
|
super.readFromNBT(nbt);
|
|
filters.readFromNBT(nbt);
|
|
filters.markDirty();
|
|
}
|
|
|
|
@Override
|
|
public void writeToNBT(NBTTagCompound nbt) {
|
|
super.writeToNBT(nbt);
|
|
filters.writeToNBT(nbt);
|
|
}
|
|
|
|
// ICLIENTSTATE
|
|
@Override
|
|
public void writeData(ByteBuf data) {
|
|
NBTTagCompound nbt = new NBTTagCompound();
|
|
writeToNBT(nbt);
|
|
NetworkUtils.writeNBT(data, nbt);
|
|
}
|
|
|
|
@Override
|
|
public void readData(ByteBuf data) {
|
|
NBTTagCompound nbt = NetworkUtils.readNBT(data);
|
|
readFromNBT(nbt);
|
|
}
|
|
}
|