001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    
006    public class EntityFallingSand extends Entity
007    {
008        public int blockID;
009        public int field_70285_b;
010    
011        /** How long the block has been falling for. */
012        public int fallTime;
013        public boolean field_70284_d;
014    
015        public EntityFallingSand(World par1World)
016        {
017            super(par1World);
018            this.fallTime = 0;
019            this.field_70284_d = true;
020        }
021    
022        public EntityFallingSand(World par1World, double par2, double par4, double par6, int par8)
023        {
024            this(par1World, par2, par4, par6, par8, 0);
025        }
026    
027        public EntityFallingSand(World par1World, double par2, double par4, double par6, int par8, int par9)
028        {
029            super(par1World);
030            this.fallTime = 0;
031            this.field_70284_d = true;
032            this.blockID = par8;
033            this.field_70285_b = par9;
034            this.preventEntitySpawning = true;
035            this.setSize(0.98F, 0.98F);
036            this.yOffset = this.height / 2.0F;
037            this.setPosition(par2, par4, par6);
038            this.motionX = 0.0D;
039            this.motionY = 0.0D;
040            this.motionZ = 0.0D;
041            this.prevPosX = par2;
042            this.prevPosY = par4;
043            this.prevPosZ = par6;
044        }
045    
046        /**
047         * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to
048         * prevent them from trampling crops
049         */
050        protected boolean canTriggerWalking()
051        {
052            return false;
053        }
054    
055        protected void entityInit() {}
056    
057        /**
058         * Returns true if other Entities should be prevented from moving through this Entity.
059         */
060        public boolean canBeCollidedWith()
061        {
062            return !this.isDead;
063        }
064    
065        /**
066         * Called to update the entity's position/logic.
067         */
068        public void onUpdate()
069        {
070            if (this.blockID == 0)
071            {
072                this.setDead();
073            }
074            else
075            {
076                this.prevPosX = this.posX;
077                this.prevPosY = this.posY;
078                this.prevPosZ = this.posZ;
079                ++this.fallTime;
080                this.motionY -= 0.03999999910593033D;
081                this.moveEntity(this.motionX, this.motionY, this.motionZ);
082                this.motionX *= 0.9800000190734863D;
083                this.motionY *= 0.9800000190734863D;
084                this.motionZ *= 0.9800000190734863D;
085    
086                if (!this.worldObj.isRemote)
087                {
088                    int var1 = MathHelper.floor_double(this.posX);
089                    int var2 = MathHelper.floor_double(this.posY);
090                    int var3 = MathHelper.floor_double(this.posZ);
091    
092                    if (this.fallTime == 1)
093                    {
094                        if (this.fallTime == 1 && this.worldObj.getBlockId(var1, var2, var3) == this.blockID)
095                        {
096                            this.worldObj.setBlockWithNotify(var1, var2, var3, 0);
097                        }
098                        else
099                        {
100                            this.setDead();
101                        }
102                    }
103    
104                    if (this.onGround)
105                    {
106                        this.motionX *= 0.699999988079071D;
107                        this.motionZ *= 0.699999988079071D;
108                        this.motionY *= -0.5D;
109    
110                        if (this.worldObj.getBlockId(var1, var2, var3) != Block.pistonMoving.blockID)
111                        {
112                            this.setDead();
113    
114                            if ((!this.worldObj.canPlaceEntityOnSide(this.blockID, var1, var2, var3, true, 1, (Entity)null) || BlockSand.canFallBelow(this.worldObj, var1, var2 - 1, var3) || !this.worldObj.setBlockAndMetadataWithNotify(var1, var2, var3, this.blockID, this.field_70285_b)) && !this.worldObj.isRemote && this.field_70284_d)
115                            {
116                                this.entityDropItem(new ItemStack(this.blockID, 1, this.field_70285_b), 0.0F);
117                            }
118                        }
119                    }
120                    else if (this.fallTime > 100 && !this.worldObj.isRemote && (var2 < 1 || var2 > 256) || this.fallTime > 600)
121                    {
122                        if (this.field_70284_d)
123                        {
124                            this.dropItem(this.blockID, 1);
125                        }
126    
127                        this.setDead();
128                    }
129                }
130            }
131        }
132    
133        /**
134         * (abstract) Protected helper method to write subclass entity data to NBT.
135         */
136        protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
137        {
138            par1NBTTagCompound.setByte("Tile", (byte)this.blockID);
139            par1NBTTagCompound.setByte("Data", (byte)this.field_70285_b);
140            par1NBTTagCompound.setByte("Time", (byte)this.fallTime);
141            par1NBTTagCompound.setBoolean("DropItem", this.field_70284_d);
142        }
143    
144        /**
145         * (abstract) Protected helper method to read subclass entity data from NBT.
146         */
147        protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
148        {
149            this.blockID = par1NBTTagCompound.getByte("Tile") & 255;
150            this.field_70285_b = par1NBTTagCompound.getByte("Data") & 255;
151            this.fallTime = par1NBTTagCompound.getByte("Time") & 255;
152    
153            if (par1NBTTagCompound.hasKey("DropItem"))
154            {
155                this.field_70284_d = par1NBTTagCompound.getBoolean("DropItem");
156            }
157    
158            if (this.blockID == 0)
159            {
160                this.blockID = Block.sand.blockID;
161            }
162        }
163    
164        @SideOnly(Side.CLIENT)
165        public float getShadowSize()
166        {
167            return 0.0F;
168        }
169    
170        @SideOnly(Side.CLIENT)
171        public World getWorld()
172        {
173            return this.worldObj;
174        }
175    }