base mod created
This commit is contained in:
@@ -0,0 +1,235 @@
|
||||
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<IBlockState> IS_PUMPKIN = new Predicate<IBlockState>()
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user