You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
360 lines
10 KiB
Java
360 lines
10 KiB
Java
package net.minecraft.block;
|
|
|
|
import java.util.Random;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.world.World;
|
|
|
|
public class BlockDynamicLiquid extends BlockLiquid
|
|
{
|
|
int field_149815_a;
|
|
boolean[] field_149814_b = new boolean[4];
|
|
int[] field_149816_M = new int[4];
|
|
private static final String __OBFID = "CL_00000234";
|
|
|
|
protected BlockDynamicLiquid(Material p_i45403_1_)
|
|
{
|
|
super(p_i45403_1_);
|
|
}
|
|
|
|
private void func_149811_n(World p_149811_1_, int p_149811_2_, int p_149811_3_, int p_149811_4_)
|
|
{
|
|
int l = p_149811_1_.getBlockMetadata(p_149811_2_, p_149811_3_, p_149811_4_);
|
|
p_149811_1_.setBlock(p_149811_2_, p_149811_3_, p_149811_4_, Block.getBlockById(Block.getIdFromBlock(this) + 1), l, 2);
|
|
}
|
|
|
|
/**
|
|
* Ticks the block if it's been scheduled
|
|
*/
|
|
public void updateTick(World worldIn, int x, int y, int z, Random random)
|
|
{
|
|
int l = this.func_149804_e(worldIn, x, y, z);
|
|
byte b0 = 1;
|
|
|
|
if (this.blockMaterial == Material.lava && !worldIn.provider.isHellWorld)
|
|
{
|
|
b0 = 2;
|
|
}
|
|
|
|
boolean flag = true;
|
|
int i1 = this.tickRate(worldIn);
|
|
int j1;
|
|
|
|
if (l > 0)
|
|
{
|
|
byte b1 = -100;
|
|
this.field_149815_a = 0;
|
|
int l1 = this.func_149810_a(worldIn, x - 1, y, z, b1);
|
|
l1 = this.func_149810_a(worldIn, x + 1, y, z, l1);
|
|
l1 = this.func_149810_a(worldIn, x, y, z - 1, l1);
|
|
l1 = this.func_149810_a(worldIn, x, y, z + 1, l1);
|
|
j1 = l1 + b0;
|
|
|
|
if (j1 >= 8 || l1 < 0)
|
|
{
|
|
j1 = -1;
|
|
}
|
|
|
|
if (this.func_149804_e(worldIn, x, y + 1, z) >= 0)
|
|
{
|
|
int k1 = this.func_149804_e(worldIn, x, y + 1, z);
|
|
|
|
if (k1 >= 8)
|
|
{
|
|
j1 = k1;
|
|
}
|
|
else
|
|
{
|
|
j1 = k1 + 8;
|
|
}
|
|
}
|
|
|
|
if (this.field_149815_a >= 2 && this.blockMaterial == Material.water)
|
|
{
|
|
if (worldIn.getBlock(x, y - 1, z).getMaterial().isSolid())
|
|
{
|
|
j1 = 0;
|
|
}
|
|
else if (worldIn.getBlock(x, y - 1, z).getMaterial() == this.blockMaterial && worldIn.getBlockMetadata(x, y - 1, z) == 0)
|
|
{
|
|
j1 = 0;
|
|
}
|
|
}
|
|
|
|
if (this.blockMaterial == Material.lava && l < 8 && j1 < 8 && j1 > l && random.nextInt(4) != 0)
|
|
{
|
|
i1 *= 4;
|
|
}
|
|
|
|
if (j1 == l)
|
|
{
|
|
if (flag)
|
|
{
|
|
this.func_149811_n(worldIn, x, y, z);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
l = j1;
|
|
|
|
if (j1 < 0)
|
|
{
|
|
worldIn.setBlockToAir(x, y, z);
|
|
}
|
|
else
|
|
{
|
|
worldIn.setBlockMetadataWithNotify(x, y, z, j1, 2);
|
|
worldIn.scheduleBlockUpdate(x, y, z, this, i1);
|
|
worldIn.notifyBlocksOfNeighborChange(x, y, z, this);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.func_149811_n(worldIn, x, y, z);
|
|
}
|
|
|
|
if (this.func_149809_q(worldIn, x, y - 1, z))
|
|
{
|
|
if (this.blockMaterial == Material.lava && worldIn.getBlock(x, y - 1, z).getMaterial() == Material.water)
|
|
{
|
|
worldIn.setBlock(x, y - 1, z, Blocks.stone);
|
|
this.func_149799_m(worldIn, x, y - 1, z);
|
|
return;
|
|
}
|
|
|
|
if (l >= 8)
|
|
{
|
|
this.func_149813_h(worldIn, x, y - 1, z, l);
|
|
}
|
|
else
|
|
{
|
|
this.func_149813_h(worldIn, x, y - 1, z, l + 8);
|
|
}
|
|
}
|
|
else if (l >= 0 && (l == 0 || this.func_149807_p(worldIn, x, y - 1, z)))
|
|
{
|
|
boolean[] aboolean = this.func_149808_o(worldIn, x, y, z);
|
|
j1 = l + b0;
|
|
|
|
if (l >= 8)
|
|
{
|
|
j1 = 1;
|
|
}
|
|
|
|
if (j1 >= 8)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (aboolean[0])
|
|
{
|
|
this.func_149813_h(worldIn, x - 1, y, z, j1);
|
|
}
|
|
|
|
if (aboolean[1])
|
|
{
|
|
this.func_149813_h(worldIn, x + 1, y, z, j1);
|
|
}
|
|
|
|
if (aboolean[2])
|
|
{
|
|
this.func_149813_h(worldIn, x, y, z - 1, j1);
|
|
}
|
|
|
|
if (aboolean[3])
|
|
{
|
|
this.func_149813_h(worldIn, x, y, z + 1, j1);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void func_149813_h(World p_149813_1_, int p_149813_2_, int p_149813_3_, int p_149813_4_, int p_149813_5_)
|
|
{
|
|
if (this.func_149809_q(p_149813_1_, p_149813_2_, p_149813_3_, p_149813_4_))
|
|
{
|
|
Block block = p_149813_1_.getBlock(p_149813_2_, p_149813_3_, p_149813_4_);
|
|
|
|
if (this.blockMaterial == Material.lava)
|
|
{
|
|
this.func_149799_m(p_149813_1_, p_149813_2_, p_149813_3_, p_149813_4_);
|
|
}
|
|
else
|
|
{
|
|
block.dropBlockAsItem(p_149813_1_, p_149813_2_, p_149813_3_, p_149813_4_, p_149813_1_.getBlockMetadata(p_149813_2_, p_149813_3_, p_149813_4_), 0);
|
|
}
|
|
|
|
p_149813_1_.setBlock(p_149813_2_, p_149813_3_, p_149813_4_, this, p_149813_5_, 3);
|
|
}
|
|
}
|
|
|
|
private int func_149812_c(World p_149812_1_, int p_149812_2_, int p_149812_3_, int p_149812_4_, int p_149812_5_, int p_149812_6_)
|
|
{
|
|
int j1 = 1000;
|
|
|
|
for (int k1 = 0; k1 < 4; ++k1)
|
|
{
|
|
if ((k1 != 0 || p_149812_6_ != 1) && (k1 != 1 || p_149812_6_ != 0) && (k1 != 2 || p_149812_6_ != 3) && (k1 != 3 || p_149812_6_ != 2))
|
|
{
|
|
int l1 = p_149812_2_;
|
|
int i2 = p_149812_4_;
|
|
|
|
if (k1 == 0)
|
|
{
|
|
l1 = p_149812_2_ - 1;
|
|
}
|
|
|
|
if (k1 == 1)
|
|
{
|
|
++l1;
|
|
}
|
|
|
|
if (k1 == 2)
|
|
{
|
|
i2 = p_149812_4_ - 1;
|
|
}
|
|
|
|
if (k1 == 3)
|
|
{
|
|
++i2;
|
|
}
|
|
|
|
if (!this.func_149807_p(p_149812_1_, l1, p_149812_3_, i2) && (p_149812_1_.getBlock(l1, p_149812_3_, i2).getMaterial() != this.blockMaterial || p_149812_1_.getBlockMetadata(l1, p_149812_3_, i2) != 0))
|
|
{
|
|
if (!this.func_149807_p(p_149812_1_, l1, p_149812_3_ - 1, i2))
|
|
{
|
|
return p_149812_5_;
|
|
}
|
|
|
|
if (p_149812_5_ < 4)
|
|
{
|
|
int j2 = this.func_149812_c(p_149812_1_, l1, p_149812_3_, i2, p_149812_5_ + 1, k1);
|
|
|
|
if (j2 < j1)
|
|
{
|
|
j1 = j2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return j1;
|
|
}
|
|
|
|
private boolean[] func_149808_o(World p_149808_1_, int p_149808_2_, int p_149808_3_, int p_149808_4_)
|
|
{
|
|
int l;
|
|
int i1;
|
|
|
|
for (l = 0; l < 4; ++l)
|
|
{
|
|
this.field_149816_M[l] = 1000;
|
|
i1 = p_149808_2_;
|
|
int j1 = p_149808_4_;
|
|
|
|
if (l == 0)
|
|
{
|
|
i1 = p_149808_2_ - 1;
|
|
}
|
|
|
|
if (l == 1)
|
|
{
|
|
++i1;
|
|
}
|
|
|
|
if (l == 2)
|
|
{
|
|
j1 = p_149808_4_ - 1;
|
|
}
|
|
|
|
if (l == 3)
|
|
{
|
|
++j1;
|
|
}
|
|
|
|
if (!this.func_149807_p(p_149808_1_, i1, p_149808_3_, j1) && (p_149808_1_.getBlock(i1, p_149808_3_, j1).getMaterial() != this.blockMaterial || p_149808_1_.getBlockMetadata(i1, p_149808_3_, j1) != 0))
|
|
{
|
|
if (this.func_149807_p(p_149808_1_, i1, p_149808_3_ - 1, j1))
|
|
{
|
|
this.field_149816_M[l] = this.func_149812_c(p_149808_1_, i1, p_149808_3_, j1, 1, l);
|
|
}
|
|
else
|
|
{
|
|
this.field_149816_M[l] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
l = this.field_149816_M[0];
|
|
|
|
for (i1 = 1; i1 < 4; ++i1)
|
|
{
|
|
if (this.field_149816_M[i1] < l)
|
|
{
|
|
l = this.field_149816_M[i1];
|
|
}
|
|
}
|
|
|
|
for (i1 = 0; i1 < 4; ++i1)
|
|
{
|
|
this.field_149814_b[i1] = this.field_149816_M[i1] == l;
|
|
}
|
|
|
|
return this.field_149814_b;
|
|
}
|
|
|
|
private boolean func_149807_p(World p_149807_1_, int p_149807_2_, int p_149807_3_, int p_149807_4_)
|
|
{
|
|
Block block = p_149807_1_.getBlock(p_149807_2_, p_149807_3_, p_149807_4_);
|
|
return block != Blocks.wooden_door && block != Blocks.iron_door && block != Blocks.standing_sign && block != Blocks.ladder && block != Blocks.reeds ? (block.blockMaterial == Material.portal ? true : block.blockMaterial.blocksMovement()) : true;
|
|
}
|
|
|
|
protected int func_149810_a(World p_149810_1_, int p_149810_2_, int p_149810_3_, int p_149810_4_, int p_149810_5_)
|
|
{
|
|
int i1 = this.func_149804_e(p_149810_1_, p_149810_2_, p_149810_3_, p_149810_4_);
|
|
|
|
if (i1 < 0)
|
|
{
|
|
return p_149810_5_;
|
|
}
|
|
else
|
|
{
|
|
if (i1 == 0)
|
|
{
|
|
++this.field_149815_a;
|
|
}
|
|
|
|
if (i1 >= 8)
|
|
{
|
|
i1 = 0;
|
|
}
|
|
|
|
return p_149810_5_ >= 0 && i1 >= p_149810_5_ ? p_149810_5_ : i1;
|
|
}
|
|
}
|
|
|
|
private boolean func_149809_q(World p_149809_1_, int p_149809_2_, int p_149809_3_, int p_149809_4_)
|
|
{
|
|
Material material = p_149809_1_.getBlock(p_149809_2_, p_149809_3_, p_149809_4_).getMaterial();
|
|
return material == this.blockMaterial ? false : (material == Material.lava ? false : !this.func_149807_p(p_149809_1_, p_149809_2_, p_149809_3_, p_149809_4_));
|
|
}
|
|
|
|
/**
|
|
* Called whenever the block is added into the world. Args: world, x, y, z
|
|
*/
|
|
public void onBlockAdded(World worldIn, int x, int y, int z)
|
|
{
|
|
super.onBlockAdded(worldIn, x, y, z);
|
|
|
|
if (worldIn.getBlock(x, y, z) == this)
|
|
{
|
|
worldIn.scheduleBlockUpdate(x, y, z, this, this.tickRate(worldIn));
|
|
}
|
|
}
|
|
|
|
public boolean func_149698_L()
|
|
{
|
|
return true;
|
|
}
|
|
} |