package net.minecraft.block; import com.google.common.base.Predicate; import javax.annotation.Nullable; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockWorldState; import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.pattern.BlockMaterialMatcher; import net.minecraft.block.state.pattern.BlockPattern; import net.minecraft.block.state.pattern.BlockStateMatcher; import net.minecraft.block.state.pattern.FactoryBlockPattern; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntityIronGolem; import net.minecraft.entity.monster.EntitySnowman; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class BlockPumpkin extends BlockHorizontal { private BlockPattern snowmanBasePattern; private BlockPattern snowmanPattern; private BlockPattern golemBasePattern; private BlockPattern golemPattern; private static final Predicate IS_PUMPKIN = new Predicate() { public boolean apply(@Nullable IBlockState p_apply_1_) { return p_apply_1_ != null && (p_apply_1_.getBlock() == Blocks.PUMPKIN || p_apply_1_.getBlock() == Blocks.LIT_PUMPKIN); } }; protected BlockPumpkin() { super(Material.GOURD, MapColor.ADOBE); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); this.setTickRandomly(true); this.setCreativeTab(CreativeTabs.BUILDING_BLOCKS); } /** * Called after the block is set in the Chunk data, but before the Tile Entity is set */ public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) { super.onBlockAdded(worldIn, pos, state); this.trySpawnGolem(worldIn, pos); } public boolean canDispenserPlace(World worldIn, BlockPos pos) { return this.getSnowmanBasePattern().match(worldIn, pos) != null || this.getGolemBasePattern().match(worldIn, pos) != null; } private void trySpawnGolem(World worldIn, BlockPos pos) { BlockPattern.PatternHelper blockpattern$patternhelper = this.getSnowmanPattern().match(worldIn, pos); if (blockpattern$patternhelper != null) { for (int i = 0; i < this.getSnowmanPattern().getThumbLength(); ++i) { BlockWorldState blockworldstate = blockpattern$patternhelper.translateOffset(0, i, 0); worldIn.setBlockState(blockworldstate.getPos(), Blocks.AIR.getDefaultState(), 2); } EntitySnowman entitysnowman = new EntitySnowman(worldIn); BlockPos blockpos1 = blockpattern$patternhelper.translateOffset(0, 2, 0).getPos(); entitysnowman.setLocationAndAngles((double)blockpos1.getX() + 0.5D, (double)blockpos1.getY() + 0.05D, (double)blockpos1.getZ() + 0.5D, 0.0F, 0.0F); worldIn.spawnEntity(entitysnowman); for (EntityPlayerMP entityplayermp : worldIn.getEntitiesWithinAABB(EntityPlayerMP.class, entitysnowman.getEntityBoundingBox().grow(5.0D))) { CriteriaTriggers.SUMMONED_ENTITY.trigger(entityplayermp, entitysnowman); } for (int l = 0; l < 120; ++l) { worldIn.spawnParticle(EnumParticleTypes.SNOW_SHOVEL, (double)blockpos1.getX() + worldIn.rand.nextDouble(), (double)blockpos1.getY() + worldIn.rand.nextDouble() * 2.5D, (double)blockpos1.getZ() + worldIn.rand.nextDouble(), 0.0D, 0.0D, 0.0D); } for (int i1 = 0; i1 < this.getSnowmanPattern().getThumbLength(); ++i1) { BlockWorldState blockworldstate2 = blockpattern$patternhelper.translateOffset(0, i1, 0); worldIn.notifyNeighborsRespectDebug(blockworldstate2.getPos(), Blocks.AIR, false); } } else { blockpattern$patternhelper = this.getGolemPattern().match(worldIn, pos); if (blockpattern$patternhelper != null) { for (int j = 0; j < this.getGolemPattern().getPalmLength(); ++j) { for (int k = 0; k < this.getGolemPattern().getThumbLength(); ++k) { worldIn.setBlockState(blockpattern$patternhelper.translateOffset(j, k, 0).getPos(), Blocks.AIR.getDefaultState(), 2); } } BlockPos blockpos = blockpattern$patternhelper.translateOffset(1, 2, 0).getPos(); EntityIronGolem entityirongolem = new EntityIronGolem(worldIn); entityirongolem.setPlayerCreated(true); entityirongolem.setLocationAndAngles((double)blockpos.getX() + 0.5D, (double)blockpos.getY() + 0.05D, (double)blockpos.getZ() + 0.5D, 0.0F, 0.0F); worldIn.spawnEntity(entityirongolem); for (EntityPlayerMP entityplayermp1 : worldIn.getEntitiesWithinAABB(EntityPlayerMP.class, entityirongolem.getEntityBoundingBox().grow(5.0D))) { CriteriaTriggers.SUMMONED_ENTITY.trigger(entityplayermp1, entityirongolem); } for (int j1 = 0; j1 < 120; ++j1) { worldIn.spawnParticle(EnumParticleTypes.SNOWBALL, (double)blockpos.getX() + worldIn.rand.nextDouble(), (double)blockpos.getY() + worldIn.rand.nextDouble() * 3.9D, (double)blockpos.getZ() + worldIn.rand.nextDouble(), 0.0D, 0.0D, 0.0D); } for (int k1 = 0; k1 < this.getGolemPattern().getPalmLength(); ++k1) { for (int l1 = 0; l1 < this.getGolemPattern().getThumbLength(); ++l1) { BlockWorldState blockworldstate1 = blockpattern$patternhelper.translateOffset(k1, l1, 0); worldIn.notifyNeighborsRespectDebug(blockworldstate1.getPos(), Blocks.AIR, false); } } } } } /** * Checks if this block can be placed exactly at the given position. */ public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { return worldIn.getBlockState(pos).getBlock().isReplaceable(worldIn, pos) && worldIn.isSideSolid(pos.down(), EnumFacing.UP); } /** * Returns the blockstate with the given rotation from the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withRotation(IBlockState state, Rotation rot) { return state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING))); } /** * Returns the blockstate with the given mirror of the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { return state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING))); } /** * Called by ItemBlocks just before a block is actually set in the world, to allow for adjustments to the * IBlockstate */ public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()); } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { return ((EnumFacing)state.getValue(FACING)).getHorizontalIndex(); } protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[] {FACING}); } protected BlockPattern getSnowmanBasePattern() { if (this.snowmanBasePattern == null) { this.snowmanBasePattern = FactoryBlockPattern.start().aisle(" ", "#", "#").where('#', BlockWorldState.hasState(BlockStateMatcher.forBlock(Blocks.SNOW))).build(); } return this.snowmanBasePattern; } protected BlockPattern getSnowmanPattern() { if (this.snowmanPattern == null) { this.snowmanPattern = FactoryBlockPattern.start().aisle("^", "#", "#").where('^', BlockWorldState.hasState(IS_PUMPKIN)).where('#', BlockWorldState.hasState(BlockStateMatcher.forBlock(Blocks.SNOW))).build(); } return this.snowmanPattern; } protected BlockPattern getGolemBasePattern() { if (this.golemBasePattern == null) { this.golemBasePattern = FactoryBlockPattern.start().aisle("~ ~", "###", "~#~").where('#', BlockWorldState.hasState(BlockStateMatcher.forBlock(Blocks.IRON_BLOCK))).where('~', BlockWorldState.hasState(BlockMaterialMatcher.forMaterial(Material.AIR))).build(); } return this.golemBasePattern; } protected BlockPattern getGolemPattern() { if (this.golemPattern == null) { this.golemPattern = FactoryBlockPattern.start().aisle("~^~", "###", "~#~").where('^', BlockWorldState.hasState(IS_PUMPKIN)).where('#', BlockWorldState.hasState(BlockStateMatcher.forBlock(Blocks.IRON_BLOCK))).where('~', BlockWorldState.hasState(BlockMaterialMatcher.forMaterial(Material.AIR))).build(); } return this.golemPattern; } }