package crazypants.enderio.conduit;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import li.cil.oc.api.network.Environment;
import li.cil.oc.api.network.SidedEnvironment;
import li.cil.oc.api.network.Node;
import mekanism.api.gas.IGasHandler;
import mods.immibis.microblocks.api.IMicroblockSupporterTile;
import net.minecraft.block.Block;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.IFluidHandler;
import appeng.api.networking.IGridHost;
import cofh.api.transport.IItemDuct;
import com.enderio.core.common.util.BlockCoord;
import cpw.mods.fml.common.Optional.Interface;
import cpw.mods.fml.common.Optional.InterfaceList;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.conduit.facade.ItemConduitFacade.FacadeType;
import crazypants.enderio.conduit.geom.CollidableComponent;
import crazypants.enderio.conduit.geom.Offset;
import crazypants.enderio.power.IInternalPowerHandler;
@InterfaceList({
@Interface(iface = "appeng.api.networking.IGridHost", modid = "appliedenergistics2"),
@Interface(iface = "mekanism.api.gas.IGasHandler", modid = "MekanismAPI|gas"),
@Interface(iface = "mods.immibis.microblocks.api.IMicroblockSupporterTile", modid = "ImmibisMicroblocks"),
@Interface(iface = "li.cil.oc.api.network.Environment", modid = "OpenComputersAPI|Network"),
@Interface(iface = "li.cil.oc.api.network.SidedEnvironment", modid = "OpenComputersAPI|Network")
})
public interface IConduitBundle extends IInternalPowerHandler, IFluidHandler, IItemDuct, IGasHandler, IGridHost,
IMicroblockSupporterTile, Environment, SidedEnvironment {
TileEntity getEntity();
@Override
BlockCoord getLocation();
// conduits
boolean hasType(Class<? extends IConduit> type);
<T extends IConduit> T getConduit(Class<T> type);
void addConduit(IConduit conduit);
void removeConduit(IConduit conduit);
Collection<IConduit> getConduits();
Offset getOffset(Class<? extends IConduit> type, ForgeDirection dir);
// connections
Set<ForgeDirection> getConnections(Class<? extends IConduit> type);
boolean containsConnection(Class<? extends IConduit> type, ForgeDirection west);
Set<ForgeDirection> getAllConnections();
boolean containsConnection(ForgeDirection dir);
//geometry
List<CollidableComponent> getCollidableComponents();
List<CollidableComponent> getConnectors();
// events
void onNeighborBlockChange(Block blockId);
void onNeighborChange(IBlockAccess world, int x, int y, int z, int tileX, int tileY, int tileZ);
void onBlockRemoved();
void dirty();
// Facade
enum FacadeRenderState {
NONE,
FULL,
WIRE_FRAME
}
@SideOnly(Side.CLIENT)
FacadeRenderState getFacadeRenderedAs();
@SideOnly(Side.CLIENT)
void setFacadeRenderAs(FacadeRenderState state);
int getLightOpacity();
void setLightOpacity(int opacity);
boolean hasFacade();
void setFacadeId(Block block);
void setFacadeId(Block block, boolean triggerUpdate);
void setFacadeMetadata(int meta);
void setFacadeType(FacadeType type);
Block getFacadeId();
int getFacadeMetadata();
FacadeType getFacadeType();
World getWorld();
void setGridNode(Object node);
}