package mcjty.rftools.blocks.logic;
import mcjty.lib.varia.BlockTools;
import mcjty.rftools.blocks.GenericRFToolsBlock;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.Direction;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
/**
* The superclass for all logic slabs in RFTools.
*/
public abstract class LogicSlabBlock extends GenericRFToolsBlock {
public static int RENDERID_LOGICSLAB;
public LogicSlabBlock(Material material, String name, Class<? extends TileEntity> tileEntityClass) {
super(material, tileEntityClass, false);
setBlockName(name);
setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.3F, 1.0F);
setHorizRotation(true);
}
/**
* Returns the signal strength at one input of the block. Args: world, X, Y, Z, side
*/
private int getInputStrength(World world, int x, int y, int z, int side) {
int dir = Direction.facingToDirection[side];
int xoffset = x + Direction.offsetX[dir];
int zoffset = z + Direction.offsetZ[dir];
int power = world.getIndirectPowerLevelTo(xoffset, y, zoffset, side);
int wirePower = world.getBlock(xoffset, y, zoffset) == Blocks.redstone_wire ? world.getBlockMetadata(xoffset, y, zoffset) : 0;
return power >= 15 ? power : Math.max(power, wirePower);
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
int meta = world.getBlockMetadata(x, y, z);
ForgeDirection k = BlockTools.getOrientationHoriz(meta);
int power = getInputStrength(world, x, y, z, k.ordinal());
meta = BlockTools.setRedstoneSignalIn(meta, power > 0);
world.setBlockMetadataWithNotify(x, y, z, meta, 2);
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public int getRenderType() {
return RENDERID_LOGICSLAB;
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
return null;
}
@Override
public boolean isOpaqueCube() {
return false;
}
/*
* -1: UP
* 0: NORTH
* 1: EAST
* 2: SOUTH
* 3: WEST
*/
@Override
public boolean canConnectRedstone(IBlockAccess world, int x, int y, int z, int side) {
int meta = world.getBlockMetadata(x, y, z);
ForgeDirection k = BlockTools.getOrientationHoriz(meta);
switch (k) {
case NORTH:
case SOUTH:
return side == 0 || side == 2; // Can connect for north and south.
case WEST:
case EAST:
return side == 1 || side == 3; // Can connect for east and west.
default:
return false;
}
}
@Override
public boolean canProvidePower() {
return true;
}
@Override
public int isProvidingWeakPower(IBlockAccess blockAccess, int x, int y, int z, int side) {
int meta = blockAccess.getBlockMetadata(x, y, z);
ForgeDirection k = BlockTools.getOrientationHoriz(meta);
if (side == k.ordinal()) {
return BlockTools.getRedstoneSignalOut(meta) ? 15 : 0;
} else {
return 0;
}
}
@Override
public int isProvidingStrongPower(IBlockAccess blockAccess, int x, int y, int z, int side) {
int meta = blockAccess.getBlockMetadata(x, y, z);
ForgeDirection k = BlockTools.getOrientationHoriz(meta);
if (side == k.ordinal()) {
return BlockTools.getRedstoneSignalOut(meta) ? 15 : 0;
} else {
return 0;
}
}
@Override
public IIcon getIcon(IBlockAccess blockAccess, int x, int y, int z, int side) {
if (side == ForgeDirection.UP.ordinal()) {
return iconInd;
} else if (side == ForgeDirection.DOWN.ordinal()) {
return iconBottom;
} else {
return iconSide;
}
}
@Override
public IIcon getIcon(int side, int meta) {
if (side == ForgeDirection.UP.ordinal()) {
return iconInd;
} else if (side == ForgeDirection.DOWN.ordinal()) {
return iconBottom;
} else {
return iconSide;
}
}
}