package game.renderer.particle; import game.block.Block; import game.block.BlockLiquid; import game.material.Material; import game.util.ExtMath; import game.world.BlockPos; import game.world.State; import game.world.World; public class EntityDownfallFX extends EntityFX { protected EntityDownfallFX(World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, int texture, int numTex) { super(worldIn, xCoordIn, yCoordIn, zCoordIn, 0.0D, 0.0D, 0.0D); this.motionX *= 0.30000001192092896D; this.motionY = Math.random() * 0.20000000298023224D + 0.10000000149011612D; this.motionZ *= 0.30000001192092896D; this.particleRed = 1.0F; this.particleGreen = 1.0F; this.particleBlue = 1.0F; this.setParticleTextureIndex(19 + texture * 4 + this.rand.zrange(numTex)); this.setSize(0.01F, 0.01F); this.particleGravity = 0.06F; this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); } /** * Called to update the entity's position/logic. */ public void onUpdate() { this.prevX = this.posX; this.prevY = this.posY; this.prevZ = this.posZ; this.motionY -= (double)this.particleGravity; this.moveEntity(this.motionX, this.motionY, this.motionZ); this.motionX *= 0.9800000190734863D; this.motionY *= 0.9800000190734863D; this.motionZ *= 0.9800000190734863D; if (this.particleMaxAge-- <= 0) { this.setDead(); } if (this.onGround) { if (Math.random() < 0.5D) { this.setDead(); } this.motionX *= 0.699999988079071D; this.motionZ *= 0.699999988079071D; } BlockPos blockpos = new BlockPos(this); State iblockstate = this.worldObj.getState(blockpos); Block block = iblockstate.getBlock(); block.setBlockBoundsBasedOnState(this.worldObj, blockpos); Material material = iblockstate.getBlock().getMaterial(); if (material.isLiquid() || material.isSolid()) { double d0 = 0.0D; if (iblockstate.getBlock() instanceof BlockLiquid) { d0 = (double)(1.0F - BlockLiquid.getLiquidHeightPercent(((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue())); } else { d0 = block.getBlockBoundsMaxY(); } double d1 = (double)ExtMath.floord(this.posY) + d0; if (this.posY < d1) { this.setDead(); } } } public static class RainFactory implements IParticleFactory { public EntityFX getEntityFX(int particleID, World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, int... p_178902_15_) { return new EntityDownfallFX(worldIn, xCoordIn, yCoordIn, zCoordIn, 0, 4); } } public static class HailFactory implements IParticleFactory { public EntityFX getEntityFX(int particleID, World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, int... p_178902_15_) { return new EntityDownfallFX(worldIn, xCoordIn, yCoordIn, zCoordIn, 1, 4); } } }