119 lines
4.3 KiB
Java
119 lines
4.3 KiB
Java
package net.minecraft.block;
|
|
|
|
import java.util.Random;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.block.state.IBlockState;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.util.EnumFacing;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.world.World;
|
|
|
|
public class BlockStaticLiquid extends BlockLiquid
|
|
{
|
|
protected BlockStaticLiquid(Material materialIn)
|
|
{
|
|
super(materialIn);
|
|
this.setTickRandomly(false);
|
|
|
|
if (materialIn == Material.LAVA)
|
|
{
|
|
this.setTickRandomly(true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Called when a neighboring block was changed and marks that this state should perform any checks during a neighbor
|
|
* change. Cases may include when redstone power is updated, cactus blocks popping off due to a neighboring solid
|
|
* block, etc.
|
|
*/
|
|
public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos)
|
|
{
|
|
if (!this.checkForMixing(worldIn, pos, state))
|
|
{
|
|
this.updateLiquid(worldIn, pos, state);
|
|
}
|
|
}
|
|
|
|
private void updateLiquid(World worldIn, BlockPos pos, IBlockState state)
|
|
{
|
|
BlockDynamicLiquid blockdynamicliquid = getFlowingBlock(this.blockMaterial);
|
|
worldIn.setBlockState(pos, blockdynamicliquid.getDefaultState().withProperty(LEVEL, state.getValue(LEVEL)), 2);
|
|
worldIn.scheduleUpdate(pos, blockdynamicliquid, this.tickRate(worldIn));
|
|
}
|
|
|
|
public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
|
|
{
|
|
if (this.blockMaterial == Material.LAVA)
|
|
{
|
|
if (worldIn.getGameRules().getBoolean("doFireTick"))
|
|
{
|
|
int i = rand.nextInt(3);
|
|
|
|
if (i > 0)
|
|
{
|
|
BlockPos blockpos = pos;
|
|
|
|
for (int j = 0; j < i; ++j)
|
|
{
|
|
blockpos = blockpos.add(rand.nextInt(3) - 1, 1, rand.nextInt(3) - 1);
|
|
|
|
if (blockpos.getY() >= 0 && blockpos.getY() < worldIn.getHeight() && !worldIn.isBlockLoaded(blockpos))
|
|
{
|
|
return;
|
|
}
|
|
|
|
IBlockState block = worldIn.getBlockState(blockpos);
|
|
|
|
if (block.getBlock().isAir(block, worldIn, blockpos))
|
|
{
|
|
if (this.isSurroundingBlockFlammable(worldIn, blockpos))
|
|
{
|
|
worldIn.setBlockState(blockpos, net.minecraftforge.event.ForgeEventFactory.fireFluidPlaceBlockEvent(worldIn, blockpos, pos, Blocks.FIRE.getDefaultState()));
|
|
return;
|
|
}
|
|
}
|
|
else if (block.getMaterial().blocksMovement())
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (int k = 0; k < 3; ++k)
|
|
{
|
|
BlockPos blockpos1 = pos.add(rand.nextInt(3) - 1, 0, rand.nextInt(3) - 1);
|
|
|
|
if (blockpos1.getY() >= 0 && blockpos1.getY() < 256 && !worldIn.isBlockLoaded(blockpos1))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (worldIn.isAirBlock(blockpos1.up()) && this.getCanBlockBurn(worldIn, blockpos1))
|
|
{
|
|
worldIn.setBlockState(blockpos1.up(), net.minecraftforge.event.ForgeEventFactory.fireFluidPlaceBlockEvent(worldIn, blockpos1.up(), pos, Blocks.FIRE.getDefaultState()));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected boolean isSurroundingBlockFlammable(World worldIn, BlockPos pos)
|
|
{
|
|
for (EnumFacing enumfacing : EnumFacing.values())
|
|
{
|
|
if (this.getCanBlockBurn(worldIn, pos.offset(enumfacing)))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private boolean getCanBlockBurn(World worldIn, BlockPos pos)
|
|
{
|
|
return pos.getY() >= 0 && pos.getY() < 256 && !worldIn.isBlockLoaded(pos) ? false : worldIn.getBlockState(pos).getMaterial().getCanBurn();
|
|
}
|
|
} |