/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.blocks.signals;
import mods.railcraft.api.core.IPostConnection;
import mods.railcraft.api.signals.SignalTools;
import mods.railcraft.common.items.IActivationBlockingItem;
import mods.railcraft.common.plugins.forge.PowerPlugin;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.entity.player.EntityPlayer;
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 org.apache.logging.log4j.Level;
public abstract class BlockSignalBase extends BlockContainer implements IPostConnection {
private final int renderType;
public BlockSignalBase(int renderType) {
super(new MaterialStructure());
this.renderType = renderType;
setStepSound(Block.soundTypeMetal);
setResistance(50);
setCreativeTab(CreativeTabs.tabTransport);
// setHarvestLevel("pickaxe", 2);
setHarvestLevel("crowbar", 0);
}
public abstract ISignalTileDefinition getSignalType(int meta);
@Override
public abstract IIcon getIcon(int side, int meta);
@Override
public int damageDropped(int meta) {
return meta;
}
@Override
public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer player, int side, float u1, float u2, float u3) {
ItemStack current = player.getCurrentEquippedItem();
if (current != null)
if (current.getItem() instanceof IActivationBlockingItem)
return false;
TileEntity tile = world.getTileEntity(i, j, k);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).blockActivated(side, player);
return false;
}
@Override
public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis) {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).rotateBlock(axis);
return false;
}
@Override
public ForgeDirection[] getValidRotations(World world, int x, int y, int z) {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).getValidRotations();
return super.getValidRotations(world, x, y, z);
}
@Override
public void onPostBlockPlaced(World world, int x, int y, int z, int meta) {
super.onPostBlockPlaced(world, x, y, z, meta);
if (SignalTools.printSignalDebug) {
Game.logTrace(Level.INFO, 10, "Signal Block onPostBlockPlaced. [{0}, {1}, {2}]", x, y, y);
}
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileSignalFoundation)
((TileSignalFoundation) tile).onBlockPlaced();
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack stack) {
if (SignalTools.printSignalDebug) {
Game.logTrace(Level.INFO, 10, "Signal Block onBlockPlacedBy. [{0}, {1}, {2}]", x, y, z);
}
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileSignalFoundation)
((TileSignalFoundation) tile).onBlockPlacedBy(entityliving, stack);
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
try {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileSignalFoundation) {
TileSignalFoundation structure = (TileSignalFoundation) tile;
if (structure.getSignalType().needsSupport() && !world.isSideSolid(x, y - 1, z, ForgeDirection.UP))
world.func_147480_a(x, y, z, true);
else
structure.onNeighborBlockChange(block);
}
} catch (StackOverflowError error) {
Game.logThrowable(Level.ERROR, "Error in BlockSignalBase.onNeighborBlockChange()", 10, error);
throw error;
}
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int meta) {
if (SignalTools.printSignalDebug) {
Game.logTrace(Level.INFO, 10, "Signal Block breakBlock. [{0}, {1}, {2}]", x, y, z);
}
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileSignalFoundation)
((TileSignalFoundation) tile).onBlockRemoval();
super.breakBlock(world, x, y, z, block, meta);
}
@Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int i, int j, int k) {
TileEntity tile = world.getTileEntity(i, j, k);
if (tile instanceof TileSignalFoundation)
((TileSignalFoundation) tile).setBlockBoundsBasedOnState(world, i, j, k);
else
setBlockBounds(0, 0, 0, 1, 1, 1);
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k) {
TileEntity tile = world.getTileEntity(i, j, k);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).getCollisionBoundingBoxFromPool(world, i, j, k);
setBlockBounds(0, 0, 0, 1, 1, 1);
return super.getCollisionBoundingBoxFromPool(world, i, j, k);
}
@Override
public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).getSelectedBoundingBoxFromPool(world, x, y, z);
return AxisAlignedBB.getBoundingBox((double) x + minX, (double) y + minY, (double) z + minZ, (double) x + maxX, (double) y + maxY, (double) z + maxZ);
}
@Override
public int getLightValue(IBlockAccess world, int x, int y, int z) {
if (y < 0)
return 0;
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof ISignalTile)
return ((ISignalTile) tile).getLightValue();
return 0;
}
@Override
public float getBlockHardness(World world, int x, int y, int z) {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).getHardness();
return 3;
}
@Override
public boolean isSideSolid(IBlockAccess world, int i, int j, int k, ForgeDirection side) {
TileEntity tile = world.getTileEntity(i, j, k);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).isSideSolid(world, i, j, k, side);
return false;
}
// @Override
// public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side) {
// int md = world.getBlockMetadata(x, y, z);
// EnumSignal type = EnumSignal.fromId(md);
// return super.canPlaceBlockOnSide(world, x, y, z, side) && (!type.needsSupport() || world.isSideSolid(x, y - 1, z, ForgeDirection.UP));
// }
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public int getRenderType() {
return renderType;
}
@Override
public TileEntity createNewTileEntity(World var1, int meta) {
return null;
}
@Override
public abstract TileEntity createTileEntity(World world, int metadata);
@Override
public boolean canProvidePower() {
return true;
}
@Override
public boolean canConnectRedstone(IBlockAccess world, int i, int j, int k, int dir) {
TileEntity tile = world.getTileEntity(i, j, k);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).canConnectRedstone(dir);
return false;
}
@Override
public boolean isBlockNormalCube() {
return false;
}
@Override
public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) {
return true;
}
@Override
public int isProvidingWeakPower(IBlockAccess world, int i, int j, int k, int side) {
TileEntity tile = world.getTileEntity(i, j, k);
if (tile instanceof TileSignalFoundation)
return ((TileSignalFoundation) tile).getPowerOutput(side);
return PowerPlugin.NO_POWER;
}
@Override
public boolean hasTileEntity(int metadata) {
return true;
}
@Override
public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
return false;
}
@Override
public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
return false;
}
@Override
public ConnectStyle connectsToPost(IBlockAccess world, int x, int y, int z, ForgeDirection side) {
TileEntity t = world.getTileEntity(x, y, z);
if (t instanceof ISignalTile)
return ConnectStyle.TWO_THIN;
return ConnectStyle.NONE;
}
}