001 package net.minecraft.block;
002
003 import net.minecraft.block.material.Material;
004 import net.minecraft.creativetab.CreativeTabs;
005 import net.minecraft.entity.EntityLiving;
006 import net.minecraft.entity.monster.EntityIronGolem;
007 import net.minecraft.entity.monster.EntitySnowman;
008 import net.minecraft.util.MathHelper;
009 import net.minecraft.world.World;
010
011 public class BlockPumpkin extends BlockDirectional
012 {
013 /** Boolean used to seperate different states of blocks */
014 private boolean blockType;
015
016 protected BlockPumpkin(int par1, int par2, boolean par3)
017 {
018 super(par1, Material.pumpkin);
019 this.blockIndexInTexture = par2;
020 this.setTickRandomly(true);
021 this.blockType = par3;
022 this.setCreativeTab(CreativeTabs.tabBlock);
023 }
024
025 /**
026 * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
027 */
028 public int getBlockTextureFromSideAndMetadata(int par1, int par2)
029 {
030 if (par1 == 1)
031 {
032 return this.blockIndexInTexture;
033 }
034 else if (par1 == 0)
035 {
036 return this.blockIndexInTexture;
037 }
038 else
039 {
040 int var3 = this.blockIndexInTexture + 1 + 16;
041
042 if (this.blockType)
043 {
044 ++var3;
045 }
046
047 return par2 == 2 && par1 == 2 ? var3 : (par2 == 3 && par1 == 5 ? var3 : (par2 == 0 && par1 == 3 ? var3 : (par2 == 1 && par1 == 4 ? var3 : this.blockIndexInTexture + 16)));
048 }
049 }
050
051 /**
052 * Returns the block texture based on the side being looked at. Args: side
053 */
054 public int getBlockTextureFromSide(int par1)
055 {
056 return par1 == 1 ? this.blockIndexInTexture : (par1 == 0 ? this.blockIndexInTexture : (par1 == 3 ? this.blockIndexInTexture + 1 + 16 : this.blockIndexInTexture + 16));
057 }
058
059 /**
060 * Called whenever the block is added into the world. Args: world, x, y, z
061 */
062 public void onBlockAdded(World par1World, int par2, int par3, int par4)
063 {
064 super.onBlockAdded(par1World, par2, par3, par4);
065
066 if (par1World.getBlockId(par2, par3 - 1, par4) == Block.blockSnow.blockID && par1World.getBlockId(par2, par3 - 2, par4) == Block.blockSnow.blockID)
067 {
068 if (!par1World.isRemote)
069 {
070 par1World.setBlock(par2, par3, par4, 0);
071 par1World.setBlock(par2, par3 - 1, par4, 0);
072 par1World.setBlock(par2, par3 - 2, par4, 0);
073 EntitySnowman var9 = new EntitySnowman(par1World);
074 var9.setLocationAndAngles((double)par2 + 0.5D, (double)par3 - 1.95D, (double)par4 + 0.5D, 0.0F, 0.0F);
075 par1World.spawnEntityInWorld(var9);
076 par1World.notifyBlockChange(par2, par3, par4, 0);
077 par1World.notifyBlockChange(par2, par3 - 1, par4, 0);
078 par1World.notifyBlockChange(par2, par3 - 2, par4, 0);
079 }
080
081 for (int var10 = 0; var10 < 120; ++var10)
082 {
083 par1World.spawnParticle("snowshovel", (double)par2 + par1World.rand.nextDouble(), (double)(par3 - 2) + par1World.rand.nextDouble() * 2.5D, (double)par4 + par1World.rand.nextDouble(), 0.0D, 0.0D, 0.0D);
084 }
085 }
086 else if (par1World.getBlockId(par2, par3 - 1, par4) == Block.blockSteel.blockID && par1World.getBlockId(par2, par3 - 2, par4) == Block.blockSteel.blockID)
087 {
088 boolean var5 = par1World.getBlockId(par2 - 1, par3 - 1, par4) == Block.blockSteel.blockID && par1World.getBlockId(par2 + 1, par3 - 1, par4) == Block.blockSteel.blockID;
089 boolean var6 = par1World.getBlockId(par2, par3 - 1, par4 - 1) == Block.blockSteel.blockID && par1World.getBlockId(par2, par3 - 1, par4 + 1) == Block.blockSteel.blockID;
090
091 if (var5 || var6)
092 {
093 par1World.setBlock(par2, par3, par4, 0);
094 par1World.setBlock(par2, par3 - 1, par4, 0);
095 par1World.setBlock(par2, par3 - 2, par4, 0);
096
097 if (var5)
098 {
099 par1World.setBlock(par2 - 1, par3 - 1, par4, 0);
100 par1World.setBlock(par2 + 1, par3 - 1, par4, 0);
101 }
102 else
103 {
104 par1World.setBlock(par2, par3 - 1, par4 - 1, 0);
105 par1World.setBlock(par2, par3 - 1, par4 + 1, 0);
106 }
107
108 EntityIronGolem var7 = new EntityIronGolem(par1World);
109 var7.setPlayerCreated(true);
110 var7.setLocationAndAngles((double)par2 + 0.5D, (double)par3 - 1.95D, (double)par4 + 0.5D, 0.0F, 0.0F);
111 par1World.spawnEntityInWorld(var7);
112
113 for (int var8 = 0; var8 < 120; ++var8)
114 {
115 par1World.spawnParticle("snowballpoof", (double)par2 + par1World.rand.nextDouble(), (double)(par3 - 2) + par1World.rand.nextDouble() * 3.9D, (double)par4 + par1World.rand.nextDouble(), 0.0D, 0.0D, 0.0D);
116 }
117
118 par1World.notifyBlockChange(par2, par3, par4, 0);
119 par1World.notifyBlockChange(par2, par3 - 1, par4, 0);
120 par1World.notifyBlockChange(par2, par3 - 2, par4, 0);
121
122 if (var5)
123 {
124 par1World.notifyBlockChange(par2 - 1, par3 - 1, par4, 0);
125 par1World.notifyBlockChange(par2 + 1, par3 - 1, par4, 0);
126 }
127 else
128 {
129 par1World.notifyBlockChange(par2, par3 - 1, par4 - 1, 0);
130 par1World.notifyBlockChange(par2, par3 - 1, par4 + 1, 0);
131 }
132 }
133 }
134 }
135
136 /**
137 * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
138 */
139 public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
140 {
141 int var5 = par1World.getBlockId(par2, par3, par4);
142 return (var5 == 0 || Block.blocksList[var5].blockMaterial.isReplaceable()) && par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4);
143 }
144
145 /**
146 * Called when the block is placed in the world.
147 */
148 public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLiving par5EntityLiving)
149 {
150 int var6 = MathHelper.floor_double((double)(par5EntityLiving.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
151 par1World.setBlockMetadataWithNotify(par2, par3, par4, var6);
152 }
153 }