/* * 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.machine; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.List; import java.util.Random; import mods.railcraft.api.core.IPostConnection; import org.apache.logging.log4j.Level; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EnumCreatureType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import mods.railcraft.common.blocks.machine.beta.MachineProxyBeta; import mods.railcraft.common.plugins.forge.CreativePlugin; import mods.railcraft.common.plugins.forge.PowerPlugin; import mods.railcraft.common.plugins.forge.WorldPlugin; import mods.railcraft.common.util.misc.Game; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; public class BlockMachine extends BlockContainer implements IPostConnection { private final IMachineProxy proxy; private final int renderId; private final int[] metaOpacity; public BlockMachine(int renderId, IMachineProxy proxy, boolean opaque, int[] metaOpacity) { super(Material.rock); setResistance(4.5F); setHardness(2.0F); setStepSound(soundTypeStone); setTickRandomly(true); this.proxy = proxy; this.opaque = opaque; this.renderId = renderId; this.metaOpacity = metaOpacity; setCreativeTab(CreativePlugin.RAILCRAFT_TAB); lightOpacity = opaque ? 255 : 0; } @Override public int getRenderType() { return renderId; } /** * Returns the default ambient occlusion value based on block opacity * @return */ @SideOnly(Side.CLIENT) @Override public float getAmbientOcclusionLightValue() { return 1; } public IMachineProxy getMachineProxy() { return proxy; } public IEnumMachine getMachineType(World world, int x, int y, int z) { int meta = WorldPlugin.getBlockMetadata(world, x, y, z); return proxy.getMachine(meta); } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { proxy.registerIcons(iconRegister); } @Override public IIcon getIcon(IBlockAccess world, int i, int j, int k, int side) { TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).getIcon(side); int meta = world.getBlockMetadata(i, j, k); return getIcon(side, meta); } @Override public IIcon getIcon(int side, int meta) { return proxy.getMachine(meta).getTexture(side); } @Override public int colorMultiplier(IBlockAccess world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).colorMultiplier(); return super.colorMultiplier(world, x, y, z); } @Override public boolean recolourBlock(World world, int x, int y, int z, ForgeDirection side, int colour) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).recolourBlock(colour); return false; } @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) { TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).blockActivated(player, side); 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 TileMachineBase) return ((TileMachineBase) 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 TileMachineBase) return ((TileMachineBase) tile).getValidRotations(); return super.getValidRotations(world, x, y, z); } @SideOnly(Side.CLIENT) @Override public void randomDisplayTick(World world, int i, int j, int k, Random random) { TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileMachineBase) ((TileMachineBase) tile).randomDisplayTick(random); } @Override public boolean isBlockNormalCube() { return false; } @Override public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).isSideSolid(side); return true; } @Override public void harvestBlock(World world, EntityPlayer entityplayer, int i, int j, int k, int l) { } @Override public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); if (Game.isHost(world) && !player.capabilities.isCreativeMode) if (canSilkHarvest(world, player, x, y, z, 0) && EnchantmentHelper.getSilkTouchModifier(player)) { List<ItemStack> drops = getBlockDroppedSilkTouch(world, x, y, z, 0, 0); for (ItemStack stack : drops) { dropBlockAsItem(world, x, y, z, stack); } } else dropBlockAsItem(world, x, y, z, 0, 0); return world.setBlockToAir(x, y, z); } @Override public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).getDrops(fortune); return super.getDrops(world, x, y, z, metadata, fortune); } public ArrayList<ItemStack> getBlockDroppedSilkTouch(World world, int x, int y, int z, int metadata, int fortune) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).getBlockDroppedSilkTouch(fortune); return super.getDrops(world, x, y, z, metadata, fortune); } @Override public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).canSilkHarvest(player); return false; } @Override public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { List<ItemStack> drops = getBlockDroppedSilkTouch(world, x, y, z, 0, 0); return drops.get(0); } @Override public boolean canProvidePower() { 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 TileMachineBase) return ((TileMachineBase) tile).isPoweringTo(side) ? PowerPlugin.FULL_POWER : PowerPlugin.NO_POWER; return PowerPlugin.NO_POWER; } @Override public boolean canConnectRedstone(IBlockAccess world, int i, int j, int k, int dir) { TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileMachineBase) ((TileMachineBase) tile).canConnectRedstone(dir); return false; } public void initFromItem(World world, int i, int j, int k, ItemStack stack) { TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileMachineBase) ((TileMachineBase) tile).initFromItem(stack); } @Override public void onBlockPlacedBy(World world, int i, int j, int k, EntityLivingBase entityliving, ItemStack stack) { TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileMachineBase) ((TileMachineBase) tile).onBlockPlacedBy(entityliving, stack); } @Override public void onNeighborBlockChange(World world, int i, int j, int k, Block block) { try { TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileMachineBase) ((TileMachineBase) tile).onNeighborBlockChange(block); } catch (StackOverflowError error) { Game.logThrowable(Level.ERROR, "Stack Overflow Error in BlockMachine.onNeighborBlockChange()", 10, error); if (Game.IS_DEBUG) throw error; } } @Override public void onBlockAdded(World world, int i, int j, int k) { TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileMachineBase) ((TileMachineBase) tile).onBlockAdded(); } @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) ((TileMachineBase) tile).onBlockRemoval(); // world.notifyBlocksOfNeighborChange(x + 1, y, z, blockID); // world.notifyBlocksOfNeighborChange(x - 1, y, z, blockID); // world.notifyBlocksOfNeighborChange(x, y, z + 1, blockID); // world.notifyBlocksOfNeighborChange(x, y, z - 1, blockID); // world.notifyBlocksOfNeighborChange(x, y - 1, z, blockID); // world.notifyBlocksOfNeighborChange(x, y + 1, z, blockID); super.breakBlock(world, x, y, z, block, meta); } @Override public TileEntity createTileEntity(World world, int meta) { return proxy.getMachine(meta).getTileEntity(); } @Override public TileEntity createNewTileEntity(World var1, int meta) { return null; } @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 TileMachineBase) return ((TileMachineBase) tile).getLightValue(); return 0; } @Override public boolean hasTileEntity(int metadata) { return true; } @Override public void getSubBlocks(Item item, CreativeTabs tab, List list) { for (IEnumMachine type : proxy.getCreativeList()) { if (type.isAvaliable()) list.add(type.getItem()); } } @Override public final boolean isOpaqueCube() { return opaque; } @Override public int getLightOpacity(IBlockAccess world, int x, int y, int z) { int meta = world.getBlockMetadata(x, y, z); return metaOpacity[meta]; } @Override public float getExplosionResistance(Entity exploder, World world, int x, int y, int z, double srcX, double srcY, double srcZ) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).getResistance(exploder) * 3f / 5f; return super.getExplosionResistance(exploder, world, x, y, z, minX, minY, minZ); } @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) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).canCreatureSpawn(type); return super.canCreatureSpawn(type, world, x, y, z); } @Override public float getBlockHardness(World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).getHardness(); return super.getBlockHardness(world, x, y, z); } @Override public boolean hasComparatorInputOverride() { if (proxy instanceof IComparatorOverride) return true; return false; } /** * Value is provided by the tile entity */ @Override public int getComparatorInputOverride(World world, int x, int y, int z, int side) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof IComparatorValueProvider) return ((IComparatorValueProvider) tile).getComparatorInputOverride(world, x, y, z, side); return 0; } @Override public ConnectStyle connectsToPost(IBlockAccess world, int x, int y, int z, ForgeDirection side) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileMachineBase) return ((TileMachineBase) tile).connectsToPost(side); return ConnectStyle.NONE; } @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { return BoundingBoxManager.getCollisionBox(world, x, y, z, getMachineType(world, x, y, z)); } @Override public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { return BoundingBoxManager.getSelectionBox(world, x, y, z, getMachineType(world, x, y, z)); } }