001 package net.minecraft.block; 002 003 import java.util.Random; 004 import net.minecraft.block.material.Material; 005 import net.minecraft.world.IBlockAccess; 006 import net.minecraft.world.World; 007 008 public class BlockStationary extends BlockFluid 009 { 010 protected BlockStationary(int par1, Material par2Material) 011 { 012 super(par1, par2Material); 013 this.setTickRandomly(false); 014 015 if (par2Material == Material.lava) 016 { 017 this.setTickRandomly(true); 018 } 019 } 020 021 public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 022 { 023 return this.blockMaterial != Material.lava; 024 } 025 026 /** 027 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are 028 * their own) Args: x, y, z, neighbor blockID 029 */ 030 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) 031 { 032 super.onNeighborBlockChange(par1World, par2, par3, par4, par5); 033 034 if (par1World.getBlockId(par2, par3, par4) == this.blockID) 035 { 036 this.setNotStationary(par1World, par2, par3, par4); 037 } 038 } 039 040 /** 041 * Changes the block ID to that of an updating fluid. 042 */ 043 private void setNotStationary(World par1World, int par2, int par3, int par4) 044 { 045 int var5 = par1World.getBlockMetadata(par2, par3, par4); 046 par1World.editingBlocks = true; 047 par1World.setBlockAndMetadata(par2, par3, par4, this.blockID - 1, var5); 048 par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); 049 par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID - 1, this.tickRate()); 050 par1World.editingBlocks = false; 051 } 052 053 /** 054 * Ticks the block if it's been scheduled 055 */ 056 public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) 057 { 058 if (this.blockMaterial == Material.lava) 059 { 060 int var6 = par5Random.nextInt(3); 061 int var7; 062 int var8; 063 064 for (var7 = 0; var7 < var6; ++var7) 065 { 066 par2 += par5Random.nextInt(3) - 1; 067 ++par3; 068 par4 += par5Random.nextInt(3) - 1; 069 var8 = par1World.getBlockId(par2, par3, par4); 070 071 if (var8 == 0) 072 { 073 if (this.isFlammable(par1World, par2 - 1, par3, par4) || this.isFlammable(par1World, par2 + 1, par3, par4) || this.isFlammable(par1World, par2, par3, par4 - 1) || this.isFlammable(par1World, par2, par3, par4 + 1) || this.isFlammable(par1World, par2, par3 - 1, par4) || this.isFlammable(par1World, par2, par3 + 1, par4)) 074 { 075 par1World.setBlockWithNotify(par2, par3, par4, Block.fire.blockID); 076 return; 077 } 078 } 079 else if (Block.blocksList[var8].blockMaterial.blocksMovement()) 080 { 081 return; 082 } 083 } 084 085 if (var6 == 0) 086 { 087 var7 = par2; 088 var8 = par4; 089 090 for (int var9 = 0; var9 < 3; ++var9) 091 { 092 par2 = var7 + par5Random.nextInt(3) - 1; 093 par4 = var8 + par5Random.nextInt(3) - 1; 094 095 if (par1World.isAirBlock(par2, par3 + 1, par4) && this.isFlammable(par1World, par2, par3, par4)) 096 { 097 par1World.setBlockWithNotify(par2, par3 + 1, par4, Block.fire.blockID); 098 } 099 } 100 } 101 } 102 } 103 104 /** 105 * Checks to see if the block is flammable. 106 */ 107 private boolean isFlammable(World par1World, int par2, int par3, int par4) 108 { 109 return par1World.getBlockMaterial(par2, par3, par4).getCanBurn(); 110 } 111 }