package crazypants.enderio.conduit;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import com.enderio.core.common.util.BlockCoord;
import crazypants.enderio.conduit.geom.CollidableCache.CacheKey;
import crazypants.enderio.conduit.geom.CollidableComponent;
public interface IConduit {
// Base functionality
Class<? extends IConduit> getBaseConduitType();
ItemStack createItem();
List<ItemStack> getDrops();
int getLightValue();
boolean isActive();
void setActive(boolean active);
void writeToNBT(NBTTagCompound conduitBody);
void readFromNBT(NBTTagCompound conduitBody, short nbtVersion);
// Container
void setBundle(IConduitBundle tileConduitBundle);
IConduitBundle getBundle();
void onAddedToBundle();
void onRemovedFromBundle();
BlockCoord getLocation();
// Conections
boolean hasConnections();
boolean hasExternalConnections();
boolean hasConduitConnections();
// Conduit Connections
boolean canConnectToConduit(ForgeDirection direction, IConduit conduit);
Set<ForgeDirection> getConduitConnections();
boolean containsConduitConnection(ForgeDirection dir);
void conduitConnectionAdded(ForgeDirection fromDirection);
void conduitConnectionRemoved(ForgeDirection fromDirection);
void connectionsChanged();
AbstractConduitNetwork<?, ?> getNetwork();
boolean setNetwork(AbstractConduitNetwork<?, ?> network);
// External Connections
boolean canConnectToExternal(ForgeDirection direction, boolean ignoreConnectionMode);
Set<ForgeDirection> getExternalConnections();
boolean containsExternalConnection(ForgeDirection dir);
void externalConnectionAdded(ForgeDirection fromDirection);
void externalConnectionRemoved(ForgeDirection fromDirection);
boolean isConnectedTo(ForgeDirection dir);
ConnectionMode getConnectionMode(ForgeDirection dir);
void setConnectionMode(ForgeDirection dir, ConnectionMode mode);
boolean hasConnectionMode(ConnectionMode mode);
ConnectionMode getNextConnectionMode(ForgeDirection dir);
ConnectionMode getPreviousConnectionMode(ForgeDirection dir);
// rendering, only needed us default rendering is used
IIcon getTextureForState(CollidableComponent component);
IIcon getTransmitionTextureForState(CollidableComponent component);
float getTransmitionGeometryScale();
float getSelfIlluminationForState(CollidableComponent component);
// geometry
boolean haveCollidablesChangedSinceLastCall();
Collection<CollidableComponent> getCollidableComponents();
Collection<CollidableComponent> createCollidables(CacheKey key);
Class<? extends IConduit> getCollidableType();
// Actions
boolean onBlockActivated(EntityPlayer player, RaytraceResult res, List<RaytraceResult> all);
void onChunkUnload(World worldObj);
void updateEntity(World worldObj);
boolean onNeighborBlockChange(Block blockId);
boolean onNeighborChange(IBlockAccess world, int x, int y, int z, int tileX, int tileY, int tileZ);
//For Copy/Paste of connection settings
boolean writeConnectionSettingsToNBT(ForgeDirection dir, NBTTagCompound nbt);
boolean readConduitSettingsFromNBT(ForgeDirection dir, NBTTagCompound nbt);
public AbstractConduitNetwork<?, ?> createNetworkForType();
/**
* Should the texture of the conduit connectors be mirrored around the conduit
* node?
*/
boolean shouldMirrorTexture();
}