buildcraft.core.lib.fluids.TankManager.java Source code

Java tutorial

Introduction

Here is the source code for buildcraft.core.lib.fluids.TankManager.java

Source

/**
 * 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.core.lib.fluids;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.google.common.collect.ForwardingList;
import io.netty.buffer.ByteBuf;

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 net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;

public class TankManager<T extends Tank> extends ForwardingList<T> implements IFluidHandler, List<T> {

    private List<T> tanks = new ArrayList<T>();

    public TankManager() {
    }

    public TankManager(T... tanks) {
        addAll(Arrays.asList(tanks));
    }

    @Override
    protected List<T> delegate() {
        return tanks;
    }

    @Override
    public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
        for (Tank tank : tanks) {
            int used = tank.fill(resource, doFill);
            if (used > 0) {
                return used;
            }
        }
        return 0;
    }

    @Override
    public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
        if (resource == null) {
            return null;
        }
        for (Tank tank : tanks) {
            if (!resource.isFluidEqual(tank.getFluid())) {
                continue;
            }
            FluidStack drained = tank.drain(resource.amount, doDrain);
            if (drained != null && drained.amount > 0) {
                return drained;
            }
        }
        return null;
    }

    @Override
    public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
        for (Tank tank : tanks) {
            FluidStack drained = tank.drain(maxDrain, doDrain);
            if (drained != null && drained.amount > 0) {
                return drained;
            }
        }
        return null;
    }

    @Override
    public boolean canFill(ForgeDirection from, Fluid fluid) {
        return true;
    }

    @Override
    public boolean canDrain(ForgeDirection from, Fluid fluid) {
        return true;
    }

    @Override
    public FluidTankInfo[] getTankInfo(ForgeDirection from) {
        FluidTankInfo[] info = new FluidTankInfo[size()];
        for (int i = 0; i < size(); i++) {
            info[i] = get(i).getInfo();
        }
        return info;
    }

    public void writeToNBT(NBTTagCompound data) {
        for (Tank tank : tanks) {
            tank.writeToNBT(data);
        }
    }

    public void readFromNBT(NBTTagCompound data) {
        for (Tank tank : tanks) {
            tank.readFromNBT(data);
        }
    }

    public void writeData(ByteBuf data) {
        for (Tank tank : tanks) {
            FluidStack fluidStack = tank.getFluid();
            if (fluidStack != null && fluidStack.getFluid() != null) {
                data.writeShort(fluidStack.getFluid().getID());
                data.writeInt(fluidStack.amount);
                data.writeInt(fluidStack.getFluid().getColor(fluidStack));
            } else {
                data.writeShort(-1);
            }
        }
    }

    @SideOnly(Side.CLIENT)
    public void readData(ByteBuf data) {
        for (Tank tank : tanks) {
            int fluidId = data.readShort();
            if (FluidRegistry.getFluid(fluidId) != null) {
                tank.setFluid(new FluidStack(FluidRegistry.getFluid(fluidId), data.readInt()));
                tank.colorRenderCache = data.readInt();
            } else {
                tank.setFluid(null);
                tank.colorRenderCache = 0xFFFFFF;
            }
        }
    }
}