package net.minecraft.server;
import java.util.Iterator;
import java.util.Random;
import javax.annotation.Nullable;
public abstract class BlockFluids extends Block {
public static final BlockStateInteger LEVEL = BlockStateInteger.of("level", 0, 15);
protected BlockFluids(Material material) {
super(material);
this.y(this.blockStateList.getBlockData().set(BlockFluids.LEVEL, Integer.valueOf(0)));
this.a(true);
}
public AxisAlignedBB b(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
return BlockFluids.j;
}
@Nullable
public AxisAlignedBB a(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
return BlockFluids.k;
}
public boolean b(IBlockAccess iblockaccess, BlockPosition blockposition) {
return this.material != Material.LAVA;
}
public static float e(int i) {
if (i >= 8) {
i = 0;
}
return (float) (i + 1) / 9.0F;
}
protected int i(IBlockData iblockdata) {
return iblockdata.getMaterial() == this.material ? ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() : -1;
}
protected int z(IBlockData iblockdata) {
int i = this.i(iblockdata);
return i >= 8 ? 0 : i;
}
public boolean c(IBlockData iblockdata) {
return false;
}
public boolean b(IBlockData iblockdata) {
return false;
}
public boolean a(IBlockData iblockdata, boolean flag) {
return flag && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0;
}
public boolean a(IBlockAccess iblockaccess, BlockPosition blockposition, EnumDirection enumdirection) {
Material material = iblockaccess.getType(blockposition).getMaterial();
return material == this.material ? false : (enumdirection == EnumDirection.UP ? true : (material == Material.ICE ? false : super.a(iblockaccess, blockposition, enumdirection)));
}
public EnumRenderType a(IBlockData iblockdata) {
return EnumRenderType.LIQUID;
}
public Item getDropType(IBlockData iblockdata, Random random, int i) {
return Items.a;
}
public int a(Random random) {
return 0;
}
protected Vec3D a(IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata) {
double d0 = 0.0D;
double d1 = 0.0D;
double d2 = 0.0D;
int i = this.z(iblockdata);
BlockPosition.PooledBlockPosition blockposition_pooledblockposition = BlockPosition.PooledBlockPosition.s();
Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();
while (iterator.hasNext()) {
EnumDirection enumdirection = (EnumDirection) iterator.next();
blockposition_pooledblockposition.j(blockposition).d(enumdirection);
int j = this.z(iblockaccess.getType(blockposition_pooledblockposition));
int k;
if (j < 0) {
if (!iblockaccess.getType(blockposition_pooledblockposition).getMaterial().isSolid()) {
j = this.z(iblockaccess.getType(blockposition_pooledblockposition.down()));
if (j >= 0) {
k = j - (i - 8);
d0 += (double) (enumdirection.getAdjacentX() * k);
d1 += (double) (enumdirection.getAdjacentY() * k);
d2 += (double) (enumdirection.getAdjacentZ() * k);
}
}
} else if (j >= 0) {
k = j - i;
d0 += (double) (enumdirection.getAdjacentX() * k);
d1 += (double) (enumdirection.getAdjacentY() * k);
d2 += (double) (enumdirection.getAdjacentZ() * k);
}
}
Vec3D vec3d = new Vec3D(d0, d1, d2);
if (((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() >= 8) {
Iterator iterator1 = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();
while (iterator1.hasNext()) {
EnumDirection enumdirection1 = (EnumDirection) iterator1.next();
blockposition_pooledblockposition.j(blockposition).d(enumdirection1);
if (this.a(iblockaccess, (BlockPosition) blockposition_pooledblockposition, enumdirection1) || this.a(iblockaccess, blockposition_pooledblockposition.up(), enumdirection1)) {
vec3d = vec3d.a().add(0.0D, -6.0D, 0.0D);
break;
}
}
}
blockposition_pooledblockposition.t();
return vec3d.a();
}
public Vec3D a(World world, BlockPosition blockposition, Entity entity, Vec3D vec3d) {
return vec3d.e(this.a((IBlockAccess) world, blockposition, world.getType(blockposition)));
}
public int a(World world) {
return this.material == Material.WATER ? 5 : (this.material == Material.LAVA ? (world.worldProvider.n() ? 10 : 30) : 0);
}
public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) {
this.e(world, blockposition, iblockdata);
}
public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1) {
this.e(world, blockposition, iblockdata);
}
public boolean e(World world, BlockPosition blockposition, IBlockData iblockdata) {
if (this.material == Material.LAVA) {
boolean flag = false;
EnumDirection[] aenumdirection = EnumDirection.values();
int i = aenumdirection.length;
for (int j = 0; j < i; ++j) {
EnumDirection enumdirection = aenumdirection[j];
if (enumdirection != EnumDirection.DOWN && world.getType(blockposition.shift(enumdirection)).getMaterial() == Material.WATER) {
flag = true;
break;
}
}
if (flag) {
Integer integer = (Integer) iblockdata.get(BlockFluids.LEVEL);
if (integer.intValue() == 0) {
// CraftBukkit start
if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, Blocks.OBSIDIAN, null)) {
this.fizz(world, blockposition);
}
// CraftBukkit end
return true;
}
if (integer.intValue() <= 4) {
// CraftBukkit start
if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, Blocks.COBBLESTONE, null)) {
this.fizz(world, blockposition);
}
// CraftBukkit end
return true;
}
}
}
return false;
}
protected void fizz(World world, BlockPosition blockposition) {
double d0 = (double) blockposition.getX();
double d1 = (double) blockposition.getY();
double d2 = (double) blockposition.getZ();
world.a((EntityHuman) null, blockposition, SoundEffects.dr, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F);
for (int i = 0; i < 8; ++i) {
world.addParticle(EnumParticle.SMOKE_LARGE, d0 + Math.random(), d1 + 1.2D, d2 + Math.random(), 0.0D, 0.0D, 0.0D, new int[0]);
}
}
public IBlockData fromLegacyData(int i) {
return this.getBlockData().set(BlockFluids.LEVEL, Integer.valueOf(i));
}
public int toLegacyData(IBlockData iblockdata) {
return ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue();
}
protected BlockStateList getStateList() {
return new BlockStateList(this, new IBlockState[] { BlockFluids.LEVEL});
}
public static BlockFlowing a(Material material) {
if (material == Material.WATER) {
return Blocks.FLOWING_WATER;
} else if (material == Material.LAVA) {
return Blocks.FLOWING_LAVA;
} else {
throw new IllegalArgumentException("Invalid material");
}
}
public static BlockStationary b(Material material) {
if (material == Material.WATER) {
return Blocks.WATER;
} else if (material == Material.LAVA) {
return Blocks.LAVA;
} else {
throw new IllegalArgumentException("Invalid material");
}
}
public static float f(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
int i = ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue();
return (i & 7) == 0 && iblockaccess.getType(blockposition.up()).getMaterial() == Material.WATER ? 1.0F : 1.0F - e(i);
}
public static float g(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
return (float) blockposition.getY() + f(iblockdata, iblockaccess, blockposition);
}
}