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.
194 lines
6.3 KiB
Java
194 lines
6.3 KiB
Java
package net.minecraft.block;
|
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import java.util.Random;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.client.renderer.texture.IIconRegister;
|
|
import net.minecraft.creativetab.CreativeTabs;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.init.Items;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.stats.StatList;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.world.EnumSkyBlock;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.World;
|
|
|
|
public class BlockSnow extends Block
|
|
{
|
|
private static final String __OBFID = "CL_00000309";
|
|
|
|
protected BlockSnow()
|
|
{
|
|
super(Material.snow);
|
|
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
|
|
this.setTickRandomly(true);
|
|
this.setCreativeTab(CreativeTabs.tabDecorations);
|
|
this.func_150154_b(0);
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public void registerBlockIcons(IIconRegister reg)
|
|
{
|
|
this.blockIcon = reg.registerIcon("snow");
|
|
}
|
|
|
|
/**
|
|
* Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
|
|
* cleared to be reused)
|
|
*/
|
|
public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldIn, int x, int y, int z)
|
|
{
|
|
int l = worldIn.getBlockMetadata(x, y, z) & 7;
|
|
float f = 0.125F;
|
|
return AxisAlignedBB.getBoundingBox((double)x + this.minX, (double)y + this.minY, (double)z + this.minZ, (double)x + this.maxX, (double)((float)y + (float)l * f), (double)z + this.maxZ);
|
|
}
|
|
|
|
/**
|
|
* Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two
|
|
* adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
|
|
*/
|
|
public boolean isOpaqueCube()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
|
|
*/
|
|
public boolean renderAsNormalBlock()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Sets the block's bounds for rendering it as an item
|
|
*/
|
|
public void setBlockBoundsForItemRender()
|
|
{
|
|
this.func_150154_b(0);
|
|
}
|
|
|
|
/**
|
|
* Updates the blocks bounds based on its current state. Args: world, x, y, z
|
|
*/
|
|
public void setBlockBoundsBasedOnState(IBlockAccess worldIn, int x, int y, int z)
|
|
{
|
|
this.func_150154_b(worldIn.getBlockMetadata(x, y, z));
|
|
}
|
|
|
|
protected void func_150154_b(int p_150154_1_)
|
|
{
|
|
int j = p_150154_1_ & 7;
|
|
float f = (float)(2 * (1 + j)) / 16.0F;
|
|
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F);
|
|
}
|
|
|
|
/**
|
|
* Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
|
|
*/
|
|
public boolean canPlaceBlockAt(World worldIn, int x, int y, int z)
|
|
{
|
|
Block block = worldIn.getBlock(x, y - 1, z);
|
|
return block != Blocks.ice && block != Blocks.packed_ice ? (block.isLeaves(worldIn, x, y - 1, z) ? true : (block == this && (worldIn.getBlockMetadata(x, y - 1, z) & 7) == 7 ? true : block.isOpaqueCube() && block.blockMaterial.blocksMovement())) : false;
|
|
}
|
|
|
|
/**
|
|
* Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
|
|
* their own) Args: x, y, z, neighbor Block
|
|
*/
|
|
public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor)
|
|
{
|
|
this.func_150155_m(worldIn, x, y, z);
|
|
}
|
|
|
|
private boolean func_150155_m(World p_150155_1_, int p_150155_2_, int p_150155_3_, int p_150155_4_)
|
|
{
|
|
if (!this.canPlaceBlockAt(p_150155_1_, p_150155_2_, p_150155_3_, p_150155_4_))
|
|
{
|
|
p_150155_1_.setBlockToAir(p_150155_2_, p_150155_3_, p_150155_4_);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Called when the player destroys a block with an item that can harvest it. (i, j, k) are the coordinates of the
|
|
* block and l is the block's subtype/damage.
|
|
*/
|
|
public void harvestBlock(World worldIn, EntityPlayer player, int x, int y, int z, int meta)
|
|
{
|
|
super.harvestBlock(worldIn, player, x, y, z, meta);
|
|
worldIn.setBlockToAir(x, y, z);
|
|
}
|
|
|
|
public Item getItemDropped(int meta, Random random, int fortune)
|
|
{
|
|
return Items.snowball;
|
|
}
|
|
|
|
/**
|
|
* Returns the quantity of items to drop on block destruction.
|
|
*/
|
|
public int quantityDropped(Random random)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Ticks the block if it's been scheduled
|
|
*/
|
|
public void updateTick(World worldIn, int x, int y, int z, Random random)
|
|
{
|
|
if (worldIn.getSavedLightValue(EnumSkyBlock.Block, x, y, z) > 11)
|
|
{
|
|
worldIn.setBlockToAir(x, y, z);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
|
|
* coordinates. Args: blockAccess, x, y, z, side
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side)
|
|
{
|
|
return side == 1 ? true : super.shouldSideBeRendered(worldIn, x, y, z, side);
|
|
}
|
|
|
|
/**
|
|
* Metadata and fortune sensitive version, this replaces the old (int meta, Random rand)
|
|
* version in 1.1.
|
|
*
|
|
* @param meta Blocks Metadata
|
|
* @param fortune Current item fortune level
|
|
* @param random Random number generator
|
|
* @return The number of items to drop
|
|
*/
|
|
public int quantityDropped(int meta, int fortune, Random random)
|
|
{
|
|
return (meta & 7) + 1;
|
|
}
|
|
|
|
/**
|
|
* Determines if a new block can be replace the space occupied by this one,
|
|
* Used in the player's placement code to make the block act like water, and lava.
|
|
*
|
|
* @param world The current world
|
|
* @param x X Position
|
|
* @param y Y position
|
|
* @param z Z position
|
|
* @return True if the block is replaceable by another block
|
|
*/
|
|
public boolean isReplaceable(IBlockAccess world, int x, int y, int z)
|
|
{
|
|
int meta = world.getBlockMetadata(x, y, z);
|
|
return meta >= 7 ? false : blockMaterial.isReplaceable();
|
|
}
|
|
} |