/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.tile.pipes; import cpw.mods.fml.relauncher.Side; import matteroverdrive.api.transport.IPipe; import matteroverdrive.data.MatterStorage; import matteroverdrive.data.transport.FluidPipeNetwork; import matteroverdrive.data.transport.IFluidPipe; import matteroverdrive.fluids.FluidMatterPlasma; import matteroverdrive.init.MatterOverdriveFluids; import matteroverdrive.machines.MachineNBTCategory; import matteroverdrive.util.FluidNetworkHelper; import matteroverdrive.util.TimeTracker; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.Random; /** * Created by Simeon on 3/7/2015. */ public class TileEntityMatterPipe extends TileEntityPipe implements IFluidPipe { protected MatterStorage storage; protected FluidPipeNetwork fluidPipeNetwork; public static Random rand = new Random(); protected int transferSpeed; TimeTracker t; public TileEntityMatterPipe() { t = new TimeTracker(); storage = new MatterStorage(32); this.transferSpeed = 10; } @Override public void updateEntity() { super.updateEntity(); if (!worldObj.isRemote) { manageNetwork(); manageTransfer(); } } public void manageNetwork() { if (fluidPipeNetwork == null) { FluidNetworkHelper.getFluidPipeNetworkFromPool().addPipe(this); } FluidPipeNetwork lastNetwork = null; for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { TileEntity tileEntity = worldObj.getTileEntity(xCoord+direction.offsetX,yCoord+direction.offsetY,zCoord+direction.offsetZ); if (tileEntity instanceof IFluidPipe) { if (lastNetwork == null || ((IFluidPipe) tileEntity).getNetwork() != null && lastNetwork.getNetworkPipes().size() < ((IFluidPipe) tileEntity).getNetwork().getNetworkPipes().size()) { lastNetwork = ((IFluidPipe) tileEntity).getNetwork(); } } } if (lastNetwork != null && lastNetwork != getNetwork()) { lastNetwork.addPipe(this); //MatterOverdrive.log.info("Matter Pipe Added to network"); } } public void manageTransfer() { if (getMatterStored() > 0 && getNetwork() != null) { for (IFluidPipe pipe : getNetwork().getFluidHandlers()) { for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { TileEntity fluidHandler = pipe.getTile().getWorldObj().getTileEntity(pipe.getTile().xCoord + direction.offsetX,pipe.getTile().yCoord + direction.offsetY,pipe.getTile().zCoord + direction.offsetZ); if (fluidHandler != null && fluidHandler instanceof IFluidHandler && !(fluidHandler instanceof IFluidPipe) && getMatterStored() > 0 && ((IFluidHandler)fluidHandler).canFill(ForgeDirection.UNKNOWN,MatterOverdriveFluids.matterPlasma)) { extractMatter(ForgeDirection.UNKNOWN,((IFluidHandler)fluidHandler).fill(ForgeDirection.UNKNOWN,new FluidStack(MatterOverdriveFluids.matterPlasma,getMatterStored()),true),false); } } } } } @Override public boolean canConnectTo(TileEntity entity,ForgeDirection direction) { if (entity != null) { if (entity instanceof IFluidHandler) { return ((IFluidHandler) entity).canDrain(direction, MatterOverdriveFluids.matterPlasma) || ((IFluidHandler) entity).canFill(direction,MatterOverdriveFluids.matterPlasma); } } return false; } @Override public void writeCustomNBT(NBTTagCompound comp, EnumSet<MachineNBTCategory> categories, boolean toDisk) { if(!worldObj.isRemote && categories.contains(MachineNBTCategory.DATA) && toDisk) { storage.writeToNBT(comp); } } @Override public void readCustomNBT(NBTTagCompound comp, EnumSet<MachineNBTCategory> categories) { if (categories.contains(MachineNBTCategory.DATA)) { storage.readFromNBT(comp); } } @Override protected void onAwake(Side side) { } @Override public int getMatterStored() { return storage.getMatterStored(); } @Override public int getMatterCapacity() { return storage.getCapacity(); } @Override public int receiveMatter(ForgeDirection side, int amount, boolean simulate) { return storage.receiveMatter(side,amount,simulate); } @Override public int extractMatter(ForgeDirection direction, int amount, boolean simulate) { return storage.extractMatter(direction,amount,simulate); } @Override public void onAdded(World world, int x, int y, int z) { //MatterOverdrive.log.info("Tile Entity Matter Pipe placed"); } @Override public void onPlaced(World world, EntityLivingBase entityLiving) { } @Override public void onDestroyed() { getNetwork().destroyPipe(this); //MatterOverdrive.log.info("Tile Entity Matter Pipe Destroyed"); } @Override public void writeToDropItem(ItemStack itemStack) { } @Override public void readFromPlaceItem(ItemStack itemStack) { } @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { return storage.fill(resource,doFill); } @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { return storage.drain(resource.amount,doDrain); } @Override public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { return storage.drain(maxDrain,doDrain); } @Override public boolean canFill(ForgeDirection from, Fluid fluid) { return fluid instanceof FluidMatterPlasma; } @Override public boolean canDrain(ForgeDirection from, Fluid fluid) { return fluid instanceof FluidMatterPlasma; } @Override public FluidTankInfo[] getTankInfo(ForgeDirection from) { return new FluidTankInfo[]{storage.getInfo()}; } @Override public TileEntity getTile() { return this; } @Override public void onNetworkUpdate() { } @Override public FluidPipeNetwork getNetwork() { return fluidPipeNetwork; } @Override public void setNetwork(FluidPipeNetwork network) { this.fluidPipeNetwork = network; } @Override public List<IPipe<FluidPipeNetwork>> getConnections() { List<IPipe<FluidPipeNetwork>> connections = new ArrayList<>(); for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { TileEntity tileEntity = worldObj.getTileEntity(xCoord+direction.offsetX,yCoord+direction.offsetY,zCoord+direction.offsetZ); if (tileEntity instanceof IFluidPipe) { connections.add((IFluidPipe)tileEntity); } } return connections; } @Override public void onNeighborBlockChange() { super.onNeighborBlockChange(); if (getNetwork() != null) { getNetwork().networkUpdate(this); } } }