package assemblyline.common.machine.belt; import java.util.List; import assemblyline.client.render.BlockRenderingHandler; import assemblyline.common.TabAssemblyLine; import assemblyline.common.block.BlockALMachine; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; 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.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import universalelectricity.core.UniversalElectricity; public class BlockConveyorBelt extends BlockALMachine { public BlockConveyorBelt() { super(UniversalElectricity.machine); this.setBlockName("conveyorBelt"); this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.3f, 1.0f); this.setCreativeTab(TabAssemblyLine.INSTANCE); } @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { if (world.getTileEntity(x, y, z) instanceof TileEntityConveyorBelt) { TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt) world.getTileEntity(x, y, z); if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.UP || tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.DOWN) { this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.96f, 1.0f); return; } if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.TOP) { this.setBlockBounds(0.0f, 0.68f, 0.0f, 1.0f, 0.96f, 1.0f); return; } } this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.3f, 1.0f); } @Override public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { TileEntity t = world.getTileEntity(x, y, z); if (t != null && t instanceof TileEntityConveyorBelt) { TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt) t; if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.UP || tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.DOWN) { return AxisAlignedBB.getBoundingBox( (double) x + this.minX, (double) y + this.minY, (double) z + this.minZ, (double) x + 1.0, (double) y + 1.0, (double) z + 1.0 ); } if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.TOP) { return AxisAlignedBB.getBoundingBox( (double) x + this.minX, (double) y + (double) 0.68f, (double) z + this.minZ, (double) x + this.maxX, (double) y + (double) 0.98f, (double) z + this.maxZ ); } } return AxisAlignedBB.getBoundingBox( (double) x + this.minX, (double) y + this.minY, (double) z + this.minZ, (double) x + this.maxX, (double) y + this.maxY, (double) z + this.maxZ ); } @Override public void addCollisionBoxesToList( World world, int x, int y, int z, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity ) { AxisAlignedBB newBounds; TileEntity t = world.getTileEntity(x, y, z); if (t != null && t instanceof TileEntityConveyorBelt) { TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt) t; if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.UP || tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.DOWN) { AxisAlignedBB boundBottom = AxisAlignedBB.getBoundingBox( (double) x, (double) y, (double) z, (double) (x + 1), (double) y + 0.3, (double) (z + 1) ); AxisAlignedBB boundTop = null; ForgeDirection direction = tileEntity.getDirection(); if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.UP) { if (direction.offsetX > 0) { boundTop = AxisAlignedBB.getBoundingBox( (double) ((float) x + (float) direction.offsetX / 2.0f), (double) y, (double) z, (double) (x + 1), (double) y + 0.8, (double) (z + 1) ); } else if (direction.offsetX < 0) { boundTop = AxisAlignedBB.getBoundingBox( (double) x, (double) y, (double) z, (double) ((float) x + (float) direction.offsetX / -2.0f), (double) y + 0.8, (double) (z + 1) ); } else if (direction.offsetZ > 0) { boundTop = AxisAlignedBB.getBoundingBox( (double) x, (double) y, (double) ((float) z + (float) direction.offsetZ / 2.0f), (double) (x + 1), (double) y + 0.8, (double) (z + 1) ); } else if (direction.offsetZ < 0) { boundTop = AxisAlignedBB.getBoundingBox( (double) x, (double) y, (double) z, (double) (x + 1), (double) y + 0.8, (double) ((float) z + (float) direction.offsetZ / -2.0f) ); } } else if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.DOWN) { if (direction.offsetX > 0) { boundTop = AxisAlignedBB.getBoundingBox( (double) x, (double) y, (double) z, (double) ((float) x + (float) direction.offsetX / 2.0f), (double) y + 0.8, (double) (z + 1) ); } else if (direction.offsetX < 0) { boundTop = AxisAlignedBB.getBoundingBox( (double) ((float) x + (float) direction.offsetX / -2.0f), (double) y, (double) z, (double) (x + 1), (double) y + 0.8, (double) (z + 1) ); } else if (direction.offsetZ > 0) { boundTop = AxisAlignedBB.getBoundingBox( (double) x, (double) y, (double) z, (double) (x + 1), (double) y + 0.8, (double) ((float) z + (float) direction.offsetZ / 2.0f) ); } else if (direction.offsetZ < 0) { boundTop = AxisAlignedBB.getBoundingBox( (double) x, (double) y, (double) ((float) z + (float) direction.offsetZ / -2.0f), (double) (x + 1), (double) y + 0.8, (double) (z + 1) ); } } if (par5AxisAlignedBB.intersectsWith(boundBottom)) { par6List.add(boundBottom); } if (boundTop != null && par5AxisAlignedBB.intersectsWith(boundTop)) { par6List.add(boundTop); } return; } if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.TOP) { AxisAlignedBB newBounds2 = AxisAlignedBB.getBoundingBox( (double) x, (double) y + 0.68, (double) z, (double) (x + 1), (double) y + 0.98, (double) (z + 1) ); if (newBounds2 != null && par5AxisAlignedBB.intersectsWith(newBounds2)) { par6List.add(newBounds2); } return; } } if ((newBounds = AxisAlignedBB.getBoundingBox( (double) x, (double) y, (double) z, (double) (x + 1), (double) y + 0.3, (double) (z + 1) )) != null && par5AxisAlignedBB.intersectsWith(newBounds)) { par6List.add(newBounds); } } @Override public void onBlockPlacedBy( World world, int x, int y, int z, EntityLivingBase par5EntityLiving, ItemStack stack ) { int angle = MathHelper.floor_double((double ) ((double) (par5EntityLiving.rotationYaw * 4.0f / 360.0f) + 0.5)) & 3; int change = 2; switch (angle) { case 0: { change = 3; break; } case 1: { change = 4; break; } case 2: { change = 2; break; } case 3: { change = 5; } } world.setBlockMetadataWithNotify(x, y, z, change, 3); } @Override public boolean onUseWrench( World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ ) { int original = world.getBlockMetadata(x, y, z); int change = 2; switch (original) { case 2: { change = 4; break; } case 3: { change = 5; break; } case 4: { change = 3; break; } case 5: { change = 2; } } world.setBlockMetadataWithNotify(x, y, z, change, 3); return true; } @Override public boolean onSneakUseWrench( World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ ) { TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt) world.getTileEntity(x, y, z); int slantOrdinal = tileEntity.getSlant().ordinal() + 1; if (slantOrdinal >= TileEntityConveyorBelt.SlantType.values().length) { slantOrdinal = 0; } tileEntity.setSlant(TileEntityConveyorBelt.SlantType.values()[slantOrdinal]); return true; } @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt) world.getTileEntity(x, y, z); tileEntity.updatePowerTransferRange(); if (tileEntity.IgnoreList.contains((Object) entity)) { return; } if (tileEntity.isRunning() && !world.isBlockIndirectlyGettingPowered(x, y, z)) { tileEntity.getClass(); float acceleration = 0.01f; tileEntity.getClass(); float maxSpeed = 0.1f; TileEntityConveyorBelt.SlantType slantType = tileEntity.getSlant(); ForgeDirection direction = tileEntity.getDirection(); if (entity instanceof EntityLiving) { acceleration *= 5.0f; maxSpeed *= 10.0f; } entity.addVelocity( (double) ((float) direction.offsetX * acceleration), 0.0, (double) ((float) direction.offsetZ * acceleration) ); if (direction.offsetX != 0 && Math.abs(entity.motionX) > (double) maxSpeed) { entity.motionX = (float) direction.offsetX * maxSpeed; entity.motionZ = 0.0; } if (direction.offsetZ != 0 && Math.abs(entity.motionZ) > (double) maxSpeed) { entity.motionZ = (float) direction.offsetZ * maxSpeed; entity.motionX = 0.0; } entity.motionY += (double) 0.0125f; if (entity instanceof EntityItem) { double difference; if (direction.offsetX != 0) { difference = (double) z + 0.5 - entity.posZ; entity.motionZ += difference * 0.1; } else if (direction.offsetZ != 0) { difference = (double) x + 0.5 - entity.posX; entity.motionX += difference * 0.1; } ++((EntityItem) entity).age; boolean foundSneaking = false; for (EntityPlayer player : (List) world.getEntitiesWithinAABB( EntityPlayer.class, AxisAlignedBB.getBoundingBox( (double) (x - 1), (double) (y - 1), (double) (z - 1), (double) (x + 1), (double) (y + 1), (double) (z + 1) ) )) { if (!player.isSneaking()) continue; foundSneaking = true; } ((EntityItem) entity).delayBeforeCanPickup = foundSneaking ? 0 : 20; entity.onGround = false; } if (slantType == TileEntityConveyorBelt.SlantType.UP) { if (entity.motionY < 0.4) { entity.addVelocity(0.0, 0.4, 0.0); } } else if (slantType == TileEntityConveyorBelt.SlantType.DOWN && entity.motionY > -0.1) { entity.addVelocity(0.0, -0.1, 0.0); } } } @Override public TileEntity createNewTileEntity(World var1, int meta) { return new TileEntityConveyorBelt(); } @Override @SideOnly(value = Side.CLIENT) public int getRenderType() { return BlockRenderingHandler.BLOCK_RENDER_ID; } @Override public boolean isOpaqueCube() { return false; } @Override public boolean renderAsNormalBlock() { return false; } @Override public int damageDropped(int par1) { return 0; } }