package crazypants.enderio.machine.light;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
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.TileEntityEnder;
import com.enderio.core.common.vecmath.Vector3f;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.BlockEio;
import crazypants.enderio.ModObject;
import crazypants.enderio.api.redstone.IRedstoneConnectable;
public class BlockElectricLight extends BlockEio implements IRedstoneConnectable {
static final float BLOCK_HEIGHT = 0.05f;
static final float BLOCK_WIDTH = 0.3f;
static final float BLOCK_EDGE_MAX = 0.5f + (BLOCK_WIDTH / 2);
static final float BLOCK_EDGE_MIN = 0.5f - (BLOCK_WIDTH / 2);
public static int renderId;
public static BlockElectricLight create() {
BlockElectricLight result = new BlockElectricLight();
result.init();
return result;
}
private IIcon blockIconOff;
private IIcon blockIconSide;
public BlockElectricLight() {
super(ModObject.blockElectricLight.unlocalisedName, TileElectricLight.class);
setLightOpacity(0);
setBlockBounds(BLOCK_EDGE_MIN, 0.0F, BLOCK_EDGE_MIN, BLOCK_EDGE_MAX, BLOCK_HEIGHT, BLOCK_EDGE_MAX);
}
@Override
protected void init() {
GameRegistry.registerBlock(this, BlockItemElectricLight.class, ModObject.blockElectricLight.unlocalisedName);
GameRegistry.registerTileEntity(TileElectricLight.class, ModObject.blockElectricLight.unlocalisedName + "TileEntity");
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
return null;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iIconRegister) {
blockIcon = iIconRegister.registerIcon("enderio:blockElectricLightFace");
blockIconOff = iIconRegister.registerIcon("enderio:blockElectricLightFaceOff");
blockIconSide = iIconRegister.registerIcon("enderio:conduitConnector");
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess blockAccess, int x, int y, int z, int side) {
TileEntity te = blockAccess.getTileEntity(x, y, z);
if(te instanceof TileElectricLight) {
ForgeDirection onFace = ((TileElectricLight) te).getFace();
if(side == (onFace.getOpposite().ordinal())) {
boolean on = blockAccess.getBlockMetadata(x, y, z) != 0;
return on ? blockIcon : blockIconOff;
}
return blockIconSide;
}
return getIcon(side, 0);
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int par2) {
if(side == ForgeDirection.UP.ordinal()) {
return blockIcon;
}
return blockIconSide;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public int getRenderType() {
return renderId;
}
@Override
public int getLightValue(IBlockAccess world, int x, int y, int z) {
Block block = world.getBlock(x, y, z);
if(block != null && block != this) {
return block.getLightValue(world, x, y, z);
}
return world.getBlockMetadata(x, y, z) > 0 ? 15 : 0;
}
@Override
public void setBlockBoundsBasedOnState(IBlockAccess blockAccess, int x, int y, int z) {
ForgeDirection onFace = ForgeDirection.DOWN;
TileEntity te = blockAccess.getTileEntity(x, y, z);
if(te instanceof TileElectricLight) {
onFace = ((TileElectricLight) te).getFace();
}
Vector3f min = new Vector3f();
Vector3f max = new Vector3f();
switch (onFace) {
case UP:
min.set(BLOCK_EDGE_MIN, 1F - BLOCK_HEIGHT, BLOCK_EDGE_MIN);
max.set(BLOCK_EDGE_MAX, 1F, BLOCK_EDGE_MAX);
break;
case DOWN:
min.set(BLOCK_EDGE_MIN, 0.0F, BLOCK_EDGE_MIN);
max.set(BLOCK_EDGE_MAX, BLOCK_HEIGHT, BLOCK_EDGE_MAX);
break;
case EAST:
min.set(1 - BLOCK_HEIGHT, BLOCK_EDGE_MIN, BLOCK_EDGE_MIN);
max.set(1, BLOCK_EDGE_MAX, BLOCK_EDGE_MAX);
break;
case WEST:
min.set(0, BLOCK_EDGE_MIN, BLOCK_EDGE_MIN);
max.set(BLOCK_HEIGHT, BLOCK_EDGE_MAX, BLOCK_EDGE_MAX);
break;
case NORTH:
min.set(BLOCK_EDGE_MIN, BLOCK_EDGE_MIN, 0);
max.set(BLOCK_EDGE_MAX, BLOCK_EDGE_MAX, BLOCK_HEIGHT);
break;
case SOUTH:
min.set(BLOCK_EDGE_MIN, BLOCK_EDGE_MIN, 1 - BLOCK_HEIGHT);
max.set(BLOCK_EDGE_MAX, BLOCK_EDGE_MAX, 1);
break;
case UNKNOWN:
default:
min.set(BLOCK_EDGE_MIN, 0.0F, BLOCK_EDGE_MIN);
max.set(BLOCK_EDGE_MAX, BLOCK_HEIGHT, BLOCK_EDGE_MAX);
break;
}
setBlockBounds(min.x, min.y, min.z, max.x, max.y, max.z);
}
@Override
public void setBlockBoundsForItemRender() {
setBlockBounds(BLOCK_EDGE_MIN, 0.0F, BLOCK_EDGE_MIN, BLOCK_EDGE_MAX, BLOCK_HEIGHT, BLOCK_EDGE_MAX);
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block blockID) {
TileEntity te = world.getTileEntity(x, y, z);
if(te instanceof TileElectricLight) {
((TileElectricLight) te).onNeighborBlockChange(blockID);
}
}
@Override
public void breakBlock(World world, int x, int y, int z, Block par5, int par6) {
TileEntity te = world.getTileEntity(x, y, z);
if(te instanceof TileElectricLight) {
((TileElectricLight) te).onBlockRemoved();
}
}
@Override
protected void processDrop(World world, int x, int y, int z, TileEntityEnder te, ItemStack drop) {
TileElectricLight light = (TileElectricLight) te;
if(light == null) {
return;
}
int meta = light.isInvereted() ? 1 : 0;
if(!light.isRequiresPower()) {
meta += 2;
} else if(light.isWireless()) {
meta += 4;
}
drop.setItemDamage(meta);
}
@Override
public boolean doNormalDrops(World world, int x, int y, int z) {
return false;
}
/* IRedstoneConnectable */
@Override
public boolean shouldRedstoneConduitConnect(World world, int x, int y, int z, ForgeDirection from) {
return true;
}
}