package net.minecraft.block; import java.util.List; import java.util.Random; import javax.annotation.Nullable; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Items; import net.minecraft.init.PotionTypes; import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemBanner; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionUtils; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntityBanner; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockCauldron extends Block { public static final PropertyInteger LEVEL = PropertyInteger.create("level", 0, 3); protected static final AxisAlignedBB AABB_LEGS = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.3125D, 1.0D); protected static final AxisAlignedBB AABB_WALL_NORTH = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.125D); protected static final AxisAlignedBB AABB_WALL_SOUTH = new AxisAlignedBB(0.0D, 0.0D, 0.875D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB AABB_WALL_EAST = new AxisAlignedBB(0.875D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB AABB_WALL_WEST = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.125D, 1.0D, 1.0D); public BlockCauldron() { super(Material.IRON, MapColor.STONE); this.setDefaultState(this.blockState.getBaseState().withProperty(LEVEL, Integer.valueOf(0))); } public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean isActualState) { addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_LEGS); addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_WALL_WEST); addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_WALL_NORTH); addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_WALL_EAST); addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_WALL_SOUTH); } public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return FULL_BLOCK_AABB; } /** * Used to determine ambient occlusion and culling when rebuilding chunks for render */ public boolean isOpaqueCube(IBlockState state) { return false; } public boolean isFullCube(IBlockState state) { return false; } /** * Called When an Entity Collided with the Block */ public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) { int i = ((Integer)state.getValue(LEVEL)).intValue(); float f = (float)pos.getY() + (6.0F + (float)(3 * i)) / 16.0F; if (!worldIn.isRemote && entityIn.isBurning() && i > 0 && entityIn.getEntityBoundingBox().minY <= (double)f) { entityIn.extinguish(); this.setWaterLevel(worldIn, pos, state, i - 1); } } /** * Called when the block is right clicked by a player. */ public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { ItemStack itemstack = playerIn.getHeldItem(hand); if (itemstack.isEmpty()) { return true; } else { int i = ((Integer)state.getValue(LEVEL)).intValue(); Item item = itemstack.getItem(); if (item == Items.WATER_BUCKET) { if (i < 3 && !worldIn.isRemote) { if (!playerIn.capabilities.isCreativeMode) { playerIn.setHeldItem(hand, new ItemStack(Items.BUCKET)); } playerIn.addStat(StatList.CAULDRON_FILLED); this.setWaterLevel(worldIn, pos, state, 3); worldIn.playSound((EntityPlayer)null, pos, SoundEvents.ITEM_BUCKET_EMPTY, SoundCategory.BLOCKS, 1.0F, 1.0F); } return true; } else if (item == Items.BUCKET) { if (i == 3 && !worldIn.isRemote) { if (!playerIn.capabilities.isCreativeMode) { itemstack.shrink(1); if (itemstack.isEmpty()) { playerIn.setHeldItem(hand, new ItemStack(Items.WATER_BUCKET)); } else if (!playerIn.inventory.addItemStackToInventory(new ItemStack(Items.WATER_BUCKET))) { playerIn.dropItem(new ItemStack(Items.WATER_BUCKET), false); } } playerIn.addStat(StatList.CAULDRON_USED); this.setWaterLevel(worldIn, pos, state, 0); worldIn.playSound((EntityPlayer)null, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F); } return true; } else if (item == Items.GLASS_BOTTLE) { if (i > 0 && !worldIn.isRemote) { if (!playerIn.capabilities.isCreativeMode) { ItemStack itemstack3 = PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER); playerIn.addStat(StatList.CAULDRON_USED); itemstack.shrink(1); if (itemstack.isEmpty()) { playerIn.setHeldItem(hand, itemstack3); } else if (!playerIn.inventory.addItemStackToInventory(itemstack3)) { playerIn.dropItem(itemstack3, false); } else if (playerIn instanceof EntityPlayerMP) { ((EntityPlayerMP)playerIn).sendContainerToPlayer(playerIn.inventoryContainer); } } worldIn.playSound((EntityPlayer)null, pos, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F); this.setWaterLevel(worldIn, pos, state, i - 1); } return true; } else if (item == Items.POTIONITEM && PotionUtils.getPotionFromItem(itemstack) == PotionTypes.WATER) { if (i < 3 && !worldIn.isRemote) { if (!playerIn.capabilities.isCreativeMode) { ItemStack itemstack2 = new ItemStack(Items.GLASS_BOTTLE); playerIn.addStat(StatList.CAULDRON_USED); playerIn.setHeldItem(hand, itemstack2); if (playerIn instanceof EntityPlayerMP) { ((EntityPlayerMP)playerIn).sendContainerToPlayer(playerIn.inventoryContainer); } } worldIn.playSound((EntityPlayer)null, pos, SoundEvents.ITEM_BOTTLE_EMPTY, SoundCategory.BLOCKS, 1.0F, 1.0F); this.setWaterLevel(worldIn, pos, state, i + 1); } return true; } else { if (i > 0 && item instanceof ItemArmor) { ItemArmor itemarmor = (ItemArmor)item; if (itemarmor.getArmorMaterial() == ItemArmor.ArmorMaterial.LEATHER && itemarmor.hasColor(itemstack) && !worldIn.isRemote) { itemarmor.removeColor(itemstack); this.setWaterLevel(worldIn, pos, state, i - 1); playerIn.addStat(StatList.ARMOR_CLEANED); return true; } } if (i > 0 && item instanceof ItemBanner) { if (TileEntityBanner.getPatterns(itemstack) > 0 && !worldIn.isRemote) { ItemStack itemstack1 = itemstack.copy(); itemstack1.setCount(1); TileEntityBanner.removeBannerData(itemstack1); playerIn.addStat(StatList.BANNER_CLEANED); if (!playerIn.capabilities.isCreativeMode) { itemstack.shrink(1); this.setWaterLevel(worldIn, pos, state, i - 1); } if (itemstack.isEmpty()) { playerIn.setHeldItem(hand, itemstack1); } else if (!playerIn.inventory.addItemStackToInventory(itemstack1)) { playerIn.dropItem(itemstack1, false); } else if (playerIn instanceof EntityPlayerMP) { ((EntityPlayerMP)playerIn).sendContainerToPlayer(playerIn.inventoryContainer); } } return true; } else { return false; } } } } public void setWaterLevel(World worldIn, BlockPos pos, IBlockState state, int level) { worldIn.setBlockState(pos, state.withProperty(LEVEL, Integer.valueOf(MathHelper.clamp(level, 0, 3))), 2); worldIn.updateComparatorOutputLevel(pos, this); } /** * Called similar to random ticks, but only when it is raining. */ public void fillWithRain(World worldIn, BlockPos pos) { if (worldIn.rand.nextInt(20) == 1) { float f = worldIn.getBiome(pos).getTemperature(pos); if (worldIn.getBiomeProvider().getTemperatureAtHeight(f, pos.getY()) >= 0.15F) { IBlockState iblockstate = worldIn.getBlockState(pos); if (((Integer)iblockstate.getValue(LEVEL)).intValue() < 3) { worldIn.setBlockState(pos, iblockstate.cycleProperty(LEVEL), 2); } } } } /** * Get the Item that this Block should drop when harvested. */ public Item getItemDropped(IBlockState state, Random rand, int fortune) { return Items.CAULDRON; } public ItemStack getItem(World worldIn, BlockPos pos, IBlockState state) { return new ItemStack(Items.CAULDRON); } public boolean hasComparatorInputOverride(IBlockState state) { return true; } public int getComparatorInputOverride(IBlockState blockState, World worldIn, BlockPos pos) { return ((Integer)blockState.getValue(LEVEL)).intValue(); } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(LEVEL, Integer.valueOf(meta)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { return ((Integer)state.getValue(LEVEL)).intValue(); } protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[] {LEVEL}); } /** * Determines if an entity can path through this block */ public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return true; } /** * Get the geometry of the queried face at the given position and state. This is used to decide whether things like * buttons are allowed to be placed on the face, or how glass panes connect to the face, among other things. *

* Common values are {@code SOLID}, which is the default, and {@code UNDEFINED}, which represents something that * does not fit the other descriptions and will generally cause other things not to connect to the face. * * @return an approximation of the form of the given face */ public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) { if (face == EnumFacing.UP) { return BlockFaceShape.BOWL; } else { return face == EnumFacing.DOWN ? BlockFaceShape.UNDEFINED : BlockFaceShape.SOLID; } } }