    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    }