99 lines
2.9 KiB
Java
99 lines
2.9 KiB
Java
package com.gildedgames.the_aether.blocks.util;
|
|
|
|
import java.util.Random;
|
|
|
|
import com.gildedgames.the_aether.blocks.BlocksAether;
|
|
import com.gildedgames.the_aether.entities.block.EntityFloatingBlock;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockSand;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.World;
|
|
|
|
public class BlockFloating extends Block {
|
|
private boolean leveled;
|
|
|
|
public BlockFloating(Material material, boolean leveled) {
|
|
super(material);
|
|
|
|
this.leveled = leveled;
|
|
|
|
this.setTickRandomly(true);
|
|
this.setHarvestLevel("pickaxe", 2);
|
|
}
|
|
|
|
@Override
|
|
public boolean isBeaconBase(
|
|
IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ
|
|
) {
|
|
return this == BlocksAether.enchanted_gravitite;
|
|
}
|
|
|
|
@Override
|
|
public void onBlockAdded(World world, int x, int y, int z) {
|
|
world.scheduleBlockUpdate(x, y, z, this, 3);
|
|
}
|
|
|
|
@Override
|
|
public void
|
|
onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighborBlock) {
|
|
worldIn.scheduleBlockUpdate(x, y, z, this, 3);
|
|
}
|
|
|
|
@Override
|
|
public void updateTick(World world, int x, int y, int z, Random rand) {
|
|
if (!this.leveled
|
|
|| this.leveled && world.isBlockIndirectlyGettingPowered(x, y, z)) {
|
|
this.floatBlock(world, x, y, z);
|
|
}
|
|
}
|
|
|
|
private void floatBlock(World world, int x, int y, int z) {
|
|
boolean floatInstantly = BlockSand.fallInstantly;
|
|
|
|
if (canContinue(world, x, y + 1, z) && y >= 0) {
|
|
if (!floatInstantly) {
|
|
if (!world.isRemote) {
|
|
EntityFloatingBlock entity = new EntityFloatingBlock(
|
|
world,
|
|
x,
|
|
y,
|
|
z,
|
|
world.getBlock(x, y, z),
|
|
world.getBlockMetadata(x, y, z)
|
|
);
|
|
world.setBlockToAir(x, y, z);
|
|
world.spawnEntityInWorld(entity);
|
|
}
|
|
} else {
|
|
world.setBlockToAir(x, y, z);
|
|
|
|
int bottomPos = y - 1;
|
|
|
|
while (canContinue(world, x, bottomPos, z) && bottomPos > 0) {
|
|
bottomPos = bottomPos - 1;
|
|
}
|
|
|
|
if (bottomPos > 0) {
|
|
world.setBlock(x, bottomPos + 1, z, this);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static boolean canContinue(World world, int x, int y, int z) {
|
|
Block block = world.getBlock(x, y, z);
|
|
Material material = block.getMaterial();
|
|
|
|
if (block == Blocks.air || block == Blocks.fire) {
|
|
return true;
|
|
}
|
|
|
|
if (material == Material.water || material == Material.lava) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
} |