package game.block; import game.entity.npc.EntityNPC; import game.init.Blocks; import game.init.Config; import game.init.Items; import game.item.CheatTab; import game.item.Item; import game.item.ItemStack; import game.material.Material; import game.properties.IProperty; import game.properties.PropertyInteger; import game.renderer.blockmodel.ModelBlock; import game.renderer.blockmodel.Transforms; import game.rng.Random; import game.tileentity.TileEntity; import game.world.BlockPos; import game.world.BoundingBox; import game.world.Facing; import game.world.IBlockAccess; import game.world.IWorldAccess; import game.world.LightType; import game.world.State; import game.world.World; import game.world.WorldServer; public class BlockSnow extends Block { public static final PropertyInteger LAYERS = PropertyInteger.create("layers", 1, 8); public BlockSnow() { super(Material.snow); this.setDefaultState(this.getBaseState().withProperty(LAYERS, Integer.valueOf(1))); this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); this.setTickRandomly(); this.setTab(CheatTab.tabDeco); this.setBlockBoundsForItemRender(); } public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return ((Integer)worldIn.getState(pos).getValue(LAYERS)).intValue() < 5; } public BoundingBox getCollisionBoundingBox(World worldIn, BlockPos pos, State state) { int i = ((Integer)state.getValue(LAYERS)).intValue() - 1; float f = 0.125F; return new BoundingBox((double)pos.getX() + this.minX, (double)pos.getY() + this.minY, (double)pos.getZ() + this.minZ, (double)pos.getX() + this.maxX, (double)((float)pos.getY() + (float)i * f), (double)pos.getZ() + this.maxZ); } /** * Used to determine ambient occlusion and culling when rebuilding chunks for render */ public boolean isOpaqueCube() { return false; } public boolean isFullCube() { return false; } /** * Sets the block's bounds for rendering it as an item */ public void setBlockBoundsForItemRender() { this.getBoundsForLayers(0); } public void setBlockBoundsBasedOnState(IWorldAccess worldIn, BlockPos pos) { State iblockstate = worldIn.getState(pos); this.getBoundsForLayers(((Integer)iblockstate.getValue(LAYERS)).intValue()); } protected void getBoundsForLayers(int p_150154_1_) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, (float)p_150154_1_ / 8.0F, 1.0F); } public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { State iblockstate = worldIn.getState(pos.down()); Block block = iblockstate.getBlock(); return block != Blocks.ice && block != Blocks.packed_ice ? (block.getMaterial() == Material.leaves ? true : (block == this && ((Integer)iblockstate.getValue(LAYERS)).intValue() >= 7 ? true : block.isOpaqueCube() && block.material.blocksMovement())) : false; } /** * Called when a neighboring block changes. */ public void onNeighborBlockChange(World worldIn, BlockPos pos, State state, Block neighborBlock) { this.checkAndDropBlock(worldIn, pos, state); } private boolean checkAndDropBlock(World worldIn, BlockPos pos, State state) { if (!this.canPlaceBlockAt(worldIn, pos)) { this.dropBlockAsItem(worldIn, pos, state, 0); worldIn.setBlockToAir(pos); return false; } else { return true; } } public void harvestBlock(World worldIn, EntityNPC player, BlockPos pos, State state, TileEntity te) { spawnAsEntity(worldIn, pos, new ItemStack(Items.snowball, ((Integer)state.getValue(LAYERS)).intValue() + 1, 0)); worldIn.setBlockToAir(pos); // player.triggerAchievement(StatRegistry.mineBlockStatArray[BlockRegistry.getIdFromBlock(this)]); } /** * Get the Item that this Block should drop when harvested. */ public Item getItemDropped(State state, Random rand, int fortune) { return Items.snowball; } /** * Returns the quantity of items to drop on block destruction. */ public int quantityDropped(Random random) { return 0; } public void updateTick(WorldServer worldIn, BlockPos pos, State state, Random rand) { if (Config.snowMelt && ((worldIn.getLightFor(LightType.BLOCK, pos) > 11) || !worldIn.canFreezeAt(pos))) { this.dropBlockAsItem(worldIn, pos, worldIn.getState(pos), 0); worldIn.setBlockToAir(pos); } } public boolean shouldSideBeRendered(IWorldAccess worldIn, BlockPos pos, Facing side) { return side == Facing.UP ? true : super.shouldSideBeRendered(worldIn, pos, side); } /** * Convert the given metadata into a BlockState for this Block */ public State getStateFromMeta(int meta) { return this.getState().withProperty(LAYERS, Integer.valueOf((meta & 7) + 1)); } /** * Whether this Block can be replaced directly by other blocks (true for e.g. tall grass) */ public boolean isReplaceable(World worldIn, BlockPos pos) { return ((Integer)worldIn.getState(pos).getValue(LAYERS)).intValue() == 1; } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(State state) { return ((Integer)state.getValue(LAYERS)).intValue() - 1; } protected IProperty[] getProperties() { return new IProperty[] {LAYERS}; } public Transforms getTransform() { return Transforms.LAYER; } public ModelBlock getModel(String name, State state) { int height = state.getValue(LAYERS) * 2; return height == 16 ? new ModelBlock("snow").add().all() : new ModelBlock("snow").add(0, 0, 0, 16, height, 16).u().noCull().d().nswe().uv(0, 16 - height, 16, 16); } }