001    package net.minecraft.client.particle;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import net.minecraft.block.BlockFluid;
006    import net.minecraft.block.material.Material;
007    import net.minecraft.util.MathHelper;
008    import net.minecraft.world.World;
009    
010    @SideOnly(Side.CLIENT)
011    public class EntityDropParticleFX extends EntityFX
012    {
013        /** the material type for dropped items/blocks */
014        private Material materialType;
015    
016        /** The height of the current bob */
017        private int bobTimer;
018    
019        public EntityDropParticleFX(World par1World, double par2, double par4, double par6, Material par8Material)
020        {
021            super(par1World, par2, par4, par6, 0.0D, 0.0D, 0.0D);
022            this.motionX = this.motionY = this.motionZ = 0.0D;
023    
024            if (par8Material == Material.water)
025            {
026                this.particleRed = 0.0F;
027                this.particleGreen = 0.0F;
028                this.particleBlue = 1.0F;
029            }
030            else
031            {
032                this.particleRed = 1.0F;
033                this.particleGreen = 0.0F;
034                this.particleBlue = 0.0F;
035            }
036    
037            this.setParticleTextureIndex(113);
038            this.setSize(0.01F, 0.01F);
039            this.particleGravity = 0.06F;
040            this.materialType = par8Material;
041            this.bobTimer = 40;
042            this.particleMaxAge = (int)(64.0D / (Math.random() * 0.8D + 0.2D));
043            this.motionX = this.motionY = this.motionZ = 0.0D;
044        }
045    
046        public int getBrightnessForRender(float par1)
047        {
048            return this.materialType == Material.water ? super.getBrightnessForRender(par1) : 257;
049        }
050    
051        /**
052         * Gets how bright this entity is.
053         */
054        public float getBrightness(float par1)
055        {
056            return this.materialType == Material.water ? super.getBrightness(par1) : 1.0F;
057        }
058    
059        /**
060         * Called to update the entity's position/logic.
061         */
062        public void onUpdate()
063        {
064            this.prevPosX = this.posX;
065            this.prevPosY = this.posY;
066            this.prevPosZ = this.posZ;
067    
068            if (this.materialType == Material.water)
069            {
070                this.particleRed = 0.2F;
071                this.particleGreen = 0.3F;
072                this.particleBlue = 1.0F;
073            }
074            else
075            {
076                this.particleRed = 1.0F;
077                this.particleGreen = 16.0F / (float)(40 - this.bobTimer + 16);
078                this.particleBlue = 4.0F / (float)(40 - this.bobTimer + 8);
079            }
080    
081            this.motionY -= (double)this.particleGravity;
082    
083            if (this.bobTimer-- > 0)
084            {
085                this.motionX *= 0.02D;
086                this.motionY *= 0.02D;
087                this.motionZ *= 0.02D;
088                this.setParticleTextureIndex(113);
089            }
090            else
091            {
092                this.setParticleTextureIndex(112);
093            }
094    
095            this.moveEntity(this.motionX, this.motionY, this.motionZ);
096            this.motionX *= 0.9800000190734863D;
097            this.motionY *= 0.9800000190734863D;
098            this.motionZ *= 0.9800000190734863D;
099    
100            if (this.particleMaxAge-- <= 0)
101            {
102                this.setDead();
103            }
104    
105            if (this.onGround)
106            {
107                if (this.materialType == Material.water)
108                {
109                    this.setDead();
110                    this.worldObj.spawnParticle("splash", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
111                }
112                else
113                {
114                    this.setParticleTextureIndex(114);
115                }
116    
117                this.motionX *= 0.699999988079071D;
118                this.motionZ *= 0.699999988079071D;
119            }
120    
121            Material var1 = this.worldObj.getBlockMaterial(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ));
122    
123            if (var1.isLiquid() || var1.isSolid())
124            {
125                double var2 = (double)((float)(MathHelper.floor_double(this.posY) + 1) - BlockFluid.getFluidHeightPercent(this.worldObj.getBlockMetadata(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ))));
126    
127                if (this.posY < var2)
128                {
129                    this.setDead();
130                }
131            }
132        }
133    }