package com.hbm.blocks.gas; import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.lib.ModDamageSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class BlockVacuum extends Block { public BlockVacuum() { super(ModBlocks.materialGas); this.setHardness(0.0F); this.setResistance(0.0F); } @Override public boolean isOpaqueCube() { return false; } @Override public int getRenderType() { return -1; } @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) { return null; } @Override public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { return null; } @Override public boolean renderAsNormalBlock() { return false; } @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { return false; } @Override public boolean canCollideCheck(int p_149678_1_, boolean p_149678_2_) { return false; } @Override public boolean isReplaceable(IBlockAccess world, int x, int y, int z) { return false; } @Override public void onBlockAdded(World world, int x, int y, int z) { if(!world.isRemote) world.scheduleBlockUpdate(x, y, z, this, 1); } @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { if(!world.isRemote) world.scheduleBlockUpdate(x, y, z, this, 1); } @Override public void updateTick(World world, int x, int y, int z, Random rand) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); if(b == this) continue; if(isAirBlock(b)) { if(b.isReplaceable(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ)) { if(getAirCount(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) == 0) { world.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, ModBlocks.vacuum); return; } } world.setBlockToAir(x, y, z); return; } } } private boolean isAirBlock(Block b) { if(b == this) return false; return b.getMaterial() == Material.air || b.getBlockBoundsMinX() > 0 || b.getBlockBoundsMinY() > 0 || b.getBlockBoundsMinZ() > 0 || b.getBlockBoundsMaxX() < 1 || b.getBlockBoundsMaxY() < 1 || b.getBlockBoundsMaxZ() < 1; } private int getAirCount(World world, int x, int y, int z) { int air = 0; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); if(isAirBlock(b)) air++; } return air; } @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { if(!(entity instanceof EntityLivingBase)) return; entity.attackEntityFrom(ModDamageSource.vacuum, 1F); } }