package com.pixelutilitys.blocks; import com.pixelutilitys.creativetabs.PixelUtilitysCreativeTabs; import com.pixelutilitys.tileentitys.TileEntityConveyor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityTNTPrimed; import net.minecraft.entity.item.EntityXPOrb; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.Random; public class BlockConveyor extends BlockContainer { @SideOnly(Side.CLIENT) private IIcon base, overlay, overlayFast, overlayStopped; private int renderPass; public BlockConveyor() { super(Material.circuits); setHardness(0.5F); setBlockBounds(0.0F, 0.0F, 0.0F, 0.1F, 0.01F, 0.1F); setBlockName("conveyor"); setCreativeTab(PixelUtilitysCreativeTabs.tabPixelmonBlocks); } @Override public boolean canRenderInPass(int pass) { renderPass = pass; return true; } @Override public int getRenderBlockPass() { return 1; } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister ir) { base = ir.registerIcon("pixelutilitys:" + getUnlocalizedName() + ".base"); overlay = ir.registerIcon("pixelutilitys:" + getUnlocalizedName() + ".overlay"); overlayFast = ir.registerIcon("pixelutilitys:" + getUnlocalizedName() + ".overlay.fast"); overlayStopped = ir.registerIcon("pixelutilitys:" + getUnlocalizedName() + ".overlay.stopped"); } @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 TileEntityConveyor) { int dye = ((TileEntityConveyor) tile).getDyeColor(); ((TileEntityConveyor) tile).setDyeColor(colour); return dye != ((TileEntityConveyor) tile).getDyeColor(); } return false; } @Override public int getRenderColor(int meta) { return 0xFFFFFF; } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { if (renderPass == 1) switch (meta) { case 0: return overlayStopped; case 1: return overlay; case 2: return overlayFast; } return base; } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { int meta = 0; if (renderPass == 1) { TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileEntityConveyor) { TileEntityConveyor tec = (TileEntityConveyor) tile; meta = tec.isFast() ? 2 : 1; } } return getIcon(side, meta); } @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) { if (entity == null) { return; } int facing = MathHelper.floor_double((entity.rotationYaw * 4F) / 360F + 0.5D) & 3; if (facing == 0) { world.setBlockMetadataWithNotify(x, y, z, 1, 2); } if (facing == 1) { world.setBlockMetadataWithNotify(x, y, z, 2, 2); } if (facing == 2) { world.setBlockMetadataWithNotify(x, y, z, 3, 2); } if (facing == 3) { world.setBlockMetadataWithNotify(x, y, z, 0, 2); } TileEntity te = world.getTileEntity(x, y, z); if (te instanceof TileEntityConveyor) { ((TileEntityConveyor) te).setDyeColor(stack.getItemDamage() == 16 ? -1 : stack.getItemDamage()); } } @Override public boolean isOpaqueCube() { return false; } @Override public MovingObjectPosition collisionRayTrace(World world, int i, int j, int k, Vec3 vec3d, Vec3 vec3d1) { setBlockBoundsBasedOnState(world, i, j, k); return super.collisionRayTrace(world, i, j, k, vec3d, vec3d1); } @Override public void setBlockBoundsBasedOnState(IBlockAccess iblockaccess, int i, int j, int k) { int l = iblockaccess.getBlockMetadata(i, j, k); if (l >= 4 && l <= 11) { setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); } else { setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); } } @Override public boolean renderAsNormalBlock() { return false; } @Override public int getRenderType() { return 500;//TODO BAD BAD BAD BAD BAD //return MineFactoryReloadedCore.renderIdConveyor; } @Override public int quantityDropped(Random random) { return 1; } @Override public boolean canPlaceBlockAt(World world, int x, int y, int z) { return canBlockStay(world, x, y, z); } @Override public boolean canBlockStay(World world, int x, int y, int z) { return world.isSideSolid(x, y - 1, z, ForgeDirection.UP); } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float xOffset, float yOffset, float zOffset) { ItemStack item = player.getHeldItem(); if (item != null && item.getItem().equals(Items.glowstone_dust)) { TileEntity te = world.getTileEntity(x, y, z); if (te instanceof TileEntityConveyor && !((TileEntityConveyor) te).isFast()) { ((TileEntityConveyor) te).setFast(true); world.markBlockForUpdate(x, y, z); if (!player.capabilities.isCreativeMode) item.stackSize--; return true; } } return false; } @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block neighborId) { if (!canBlockStay(world, x, y, z)) { world.setBlockToAir(x, y, z); dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); return; } TileEntity tec = world.getTileEntity(x, y, z); if (tec instanceof TileEntityConveyor) { ((TileEntityConveyor) tec).updateConveyorActive(); } } @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { double playerx = entity.posX; double playerz = entity.posZ; if (!((playerz > z + 0.40) && (playerz < z + 0.60))) if (!((playerx > x + 0.40) && (playerx < x + 0.60))) return; boolean isItem = entity instanceof EntityItem || entity instanceof EntityXPOrb; if (!(isItem || entity instanceof EntityLivingBase || entity instanceof EntityTNTPrimed)) return; TileEntity conveyor = world.getTileEntity(x, y, z); if (!(conveyor instanceof TileEntityConveyor)) return; if (entity instanceof EntityLivingBase) l:{ ItemStack item = ((EntityLivingBase) entity).getEquipmentInSlot(1); if (item == null) break l; } double mult = ((TileEntityConveyor) conveyor).isFast() ? 500.1 : 10.15; double xVelocity = 0; double yVelocity = 0; double zVelocity = 0; int md = world.getBlockMetadata(x, y, z); int horizDirection = md & 0x03; boolean isUphill = (md & 0x04) != 0; boolean isDownhill = (md & 0x08) != 0; if (isUphill) { yVelocity = 0.17D * mult; } else if (entity.posY - y < 0.1 & entity.posY - y > 0) { entity.posY = y + 0.1; } else if (isDownhill) { yVelocity = -0.07 * mult; } if (isUphill | isDownhill) { entity.onGround = false; } switch (horizDirection) { case 0: zVelocity = 0; xVelocity = 0.1D * mult; break; case 1: xVelocity = 0; zVelocity = 0.1D * mult; break; case 2: zVelocity = 0; xVelocity = -0.1D * mult; break; case 3: xVelocity = 0; zVelocity = -0.1D * mult; break; } entity.setPosition(x + 0.5, entity.posY + 0.1, z + 0.5); setEntityVelocity(entity, xVelocity, yVelocity, zVelocity); entity.fallDistance *= 0.9; if (entity instanceof EntityItem) { ((EntityItem) entity).delayBeforeCanPickup = 40; } } private void setEntityVelocity(Entity e, double x, double y, double z) { e.motionX = x; e.motionY = y; e.motionZ = z; } @Override public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntityConveyor(); } @Override @SideOnly(Side.CLIENT) public int colorMultiplier(IBlockAccess world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); int dyeColor = 16; if (te instanceof TileEntityConveyor) { dyeColor = ((TileEntityConveyor) te).getDyeColor(); if (dyeColor == -1) dyeColor = 16; } return getRenderColor(dyeColor); } @Override public int getDamageValue(World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); int dyeColor = 16; if (te instanceof TileEntityConveyor) { dyeColor = ((TileEntityConveyor) te).getDyeColor(); if (dyeColor == -1) dyeColor = 16; } return dyeColor; } @Override public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) { ArrayList<ItemStack> ret = new ArrayList<>(); if (world.getBlock(x, y, z).equals(this)) { ret.add(new ItemStack(this, 1, getDamageValue(world, x, y, z))); if (((TileEntityConveyor) world.getTileEntity(x, y, z)).isFast()) ret.add(new ItemStack(Items.glowstone_dust, 1)); } return ret; } @Override public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { } @Override public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { // HACK: called before block is destroyed by the player prior to the player getting the drops. destroy block here. if (!player.capabilities.isCreativeMode) { world.func_147480_a(x, y, z, true); } } @Override public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) { return false; } @Override public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int meta) { return false; } @Override public boolean canProvidePower() { return false; } }