buildcraft/common/buildcraft/transport/pipes/PipeFluidsDiamond.java
2015-04-18 10:23:41 +02:00

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);
}
}