package blusunrize.immersiveengineering.client.fx; import blusunrize.immersiveengineering.client.ClientUtils; import net.minecraft.block.BlockLiquid; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.particle.IParticleFactory; import net.minecraft.client.particle.Particle; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; /** * @author BluSunrize - 21.02.2017 */ @SideOnly(Side.CLIENT) public class ParticleFluidSplash extends Particle { public ParticleFluidSplash(World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn) { super(worldIn, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn); 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.setSize(0.01F, 0.01F); this.particleGravity = 0.06F; this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); this.particleScale = .375f; this.setParticleTexture(ClientUtils.getSprite(FluidRegistry.WATER.getStill())); } @Override public void onUpdate() { this.prevPosX = this.posX; this.prevPosY = this.posY; this.prevPosZ = 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.setExpired(); if (this.isCollided) { if(Math.random() < 0.5D) this.setExpired(); this.motionX *= 0.699999988079071D; this.motionZ *= 0.699999988079071D; } BlockPos blockpos = new BlockPos(this.posX, this.posY, this.posZ); IBlockState iblockstate = this.worldObj.getBlockState(blockpos); Material material = iblockstate.getMaterial(); if(material.isLiquid() || material.isSolid()) { double d0; if(iblockstate.getBlock() instanceof BlockLiquid) d0 = (double)(1.0F - BlockLiquid.getLiquidHeightPercent(iblockstate.getValue(BlockLiquid.LEVEL).intValue())); else d0 = iblockstate.getBoundingBox(this.worldObj, blockpos).maxY; double d1 = (double)MathHelper.floor_double(this.posY) + d0; if(this.posY < d1) this.setExpired(); } } public void setFluidTexture(FluidStack fluid) { this.setParticleTexture(ClientUtils.getSprite(fluid.getFluid().getStill(fluid))); int argb = fluid.getFluid().getColor(fluid); this.particleAlpha = ((argb>>24)&255)/255f; this.particleRed = ((argb>>16)&255)/255f; this.particleRed = ((argb>>8&255))/255f; this.particleRed = (argb&255)/255f; } @Override public int getFXLayer() { return 1; } @SideOnly(Side.CLIENT) public static class Factory implements IParticleFactory { @Override public Particle getEntityFX(int particleID, World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, int... p_178902_15_) { return new ParticleFluidSplash(worldIn, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn); } } }