package calclavia.lib.multiblock; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import universalelectricity.core.UniversalElectricity; import universalelectricity.core.vector.Vector3; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockMulti extends BlockContainer { public String textureName = null; public String channel = ""; public BlockMulti(int id) { super(id, UniversalElectricity.machine); this.setHardness(0.8F); this.setUnlocalizedName("multiBlock"); } public BlockMulti setChannel(String channel) { this.channel = channel; return this; } @Override public BlockMulti setTextureName(String name) { this.textureName = name; return this; } public void createMultiBlockStructure(IMultiBlock tile) { TileEntity tileEntity = (TileEntity) tile; Vector3[] positions = tile.getMultiBlockVectors(); for (Vector3 position : positions) { makeFakeBlock(tileEntity.worldObj, new Vector3(tileEntity).translate(position), new Vector3(tileEntity)); } } public void destroyMultiBlockStructure(IMultiBlock tile) { TileEntity tileEntity = (TileEntity) tile; Vector3[] positions = tile.getMultiBlockVectors(); for (Vector3 position : positions) { new Vector3(tileEntity).translate(position).setBlock(tileEntity.worldObj, 0); } new Vector3(tileEntity).setBlock(tileEntity.worldObj, 0); } public void makeFakeBlock(World worldObj, Vector3 position, Vector3 mainBlock) { // Creates a fake block, then sets the relative main block position. worldObj.setBlock(position.intX(), position.intY(), position.intZ(), this.blockID); ((TileEntityMultiBlockPart) worldObj.getBlockTileEntity(position.intX(), position.intY(), position.intZ())).setMainBlock(mainBlock); } @SideOnly(Side.CLIENT) @Override public void registerIcons(IconRegister iconRegister) { if (this.textureName != null) { this.blockIcon = iconRegister.registerIcon(this.textureName); } else { super.registerIcons(iconRegister); } } @Override public void breakBlock(World world, int x, int y, int z, int par5, int par6) { TileEntity tileEntity = world.getBlockTileEntity(x, y, z); if (tileEntity instanceof TileEntityMultiBlockPart) { ((TileEntityMultiBlockPart) tileEntity).onBlockRemoval(this); } super.breakBlock(world, x, y, z, par5, par6); } /** * Called when the block is right clicked by the player. This modified version detects electric * items and wrench actions on your machine block. Do not override this function. Use * machineActivated instead! (It does the same thing) */ @Override public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { TileEntityMultiBlockPart tileEntity = (TileEntityMultiBlockPart) par1World.getBlockTileEntity(x, y, z); return tileEntity.onBlockActivated(par1World, x, y, z, par5EntityPlayer); } /** * Returns the quantity of items to drop on block destruction. */ @Override public int quantityDropped(Random par1Random) { return 0; } @Override public int getRenderType() { return -1; } @Override public boolean isOpaqueCube() { return false; } @Override public boolean renderAsNormalBlock() { return false; } @Override public TileEntity createNewTileEntity(World var1) { return new TileEntityMultiBlockPart(this.channel); } @Override public ItemStack getPickBlock(MovingObjectPosition target, World par1World, int x, int y, int z) { TileEntity tileEntity = par1World.getBlockTileEntity(x, y, z); Vector3 mainBlockPosition = ((TileEntityMultiBlockPart) tileEntity).getMainBlock(); if (mainBlockPosition != null) { int mainBlockID = par1World.getBlockId(mainBlockPosition.intX(), mainBlockPosition.intY(), mainBlockPosition.intZ()); if (mainBlockID > 0) { return Block.blocksList[mainBlockID].getPickBlock(target, par1World, mainBlockPosition.intX(), mainBlockPosition.intY(), mainBlockPosition.intZ()); } } return null; } }