Program: 81836
Project: 81836
Buggy source:
public void tickParticlePrecipitation(){
  if (ConfigParticle.Particle_RainSnow) {
    EntityPlayer entP=FMLClientHandler.instance().getClient().player;
    if (entP.posY >= StormObject.static_YPos_layer0)     return;
    WeatherManagerClient weatherMan=ClientTickHandler.weatherManager;
    if (weatherMan == null)     return;
    WindManager windMan=weatherMan.getWindManager();
    if (windMan == null)     return;
    float curPrecipVal=getRainStrengthAndControlVisuals(entP);
    float maxPrecip=0.5F;
    int precipitationHeight=entP.world.getPrecipitationHeight(new BlockPos(MathHelper.floor(entP.posX),0,MathHelper.floor(entP.posZ))).getY();
    Biome biomegenbase=entP.world.getBiome(new BlockPos(MathHelper.floor(entP.posX),0,MathHelper.floor(entP.posZ)));
    World world=entP.world;
    Random rand=entP.world.rand;
    boolean particleTest=false;
    if (particleTest) {
      if (testParticle == null) {
        BlockPos pos=new BlockPos(entP);
        if (canPrecipitateAt(world,pos)) {
          ParticleTexExtraRender rain=new ParticleTexExtraRender(entP.world,pos.getX() + rand.nextFloat(),pos.getY() - 1 + 0.01D,pos.getZ() + rand.nextFloat(),0D,0D,0D,ParticleRegistry.test_texture);
          rain.setSlantParticleToWind(false);
          rain.setExtraParticlesBaseAmount(2);
          rain.setSeverityOfRainRate(0);
          rain.setDontRenderUnderTopmostBlock(true);
          boolean upward=rand.nextBoolean();
          rain.windWeight=8F;
          rain.setFacePlayer(false);
          rain.setScale(90F + (rand.nextFloat() * 3F));
          rain.setScale(5F);
          rain.setMaxAge(60);
          rain.setGravity(0.0F);
          rain.setTicksFadeInMax(20);
          rain.setAlphaF(0);
          rain.setTicksFadeOutMax(20);
          rain.rotationYaw=0;
          rain.rotationPitch=90;
          rain.setMotionY(-0D);
          rain.setMotionX((rand.nextFloat() - 0.5F) * 0.01F);
          rain.setMotionZ((rand.nextFloat() - 0.5F) * 0.01F);
          rain.spawnAsWeatherEffect();
          testParticle=rain;
        }
      }
      if (testParticle != null) {
        testParticle.setPosition(entP.posX + 1,entP.posY,entP.posZ - 4);
        testParticle.rotationPitch=45;
        testParticle.rotationYaw=45;
      }
    }
    if (biomegenbase != null && (biomegenbase.canRain() || biomegenbase.getEnableSnow())) {
      float temperature=biomegenbase.getFloatTemperature(new BlockPos(MathHelper.floor(entP.posX),MathHelper.floor(entP.posY),MathHelper.floor(entP.posZ)));
      double d3;
      float f10;
      curPrecipVal=Math.min(maxPrecip,Math.abs(curPrecipVal));
      curPrecipVal*=1F;
      if (curPrecipVal > 0) {
        int spawnCount;
        int spawnNeed=(int)(curPrecipVal * 40F * ConfigParticle.Precipitation_Particle_effect_rate);
        int safetyCutout=100;
        if (entP.world.getBiomeProvider().getTemperatureAtHeight(temperature,precipitationHeight) >= 0.15F) {
          spawnCount=0;
          int spawnAreaSize=20;
          if (spawnNeed > 0) {
            for (int i=0; i < safetyCutout; i++) {
              BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY - 5 + rand.nextInt(25),entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
              if (canPrecipitateAt(world,pos)) {
                ParticleTexExtraRender rain=new ParticleTexExtraRender(entP.world,pos.getX(),pos.getY(),pos.getZ(),0D,0D,0D,ParticleRegistry.rain_white);
                rain.setKillWhenUnderTopmostBlock(true);
                rain.killWhenUnderCameraAtLeast=5;
                rain.setTicksFadeOutMaxOnDeath(5);
                rain.setDontRenderUnderTopmostBlock(true);
                rain.setExtraParticlesBaseAmount(15);
                rain.fastLight=true;
                rain.setSlantParticleToWind(true);
                rain.windWeight=1F;
                if (!RotatingParticleManager.useShaders) {
                  rain.setFacePlayer(true);
                  rain.setSlantParticleToWind(true);
                }
 else {
                  rain.setFacePlayer(false);
                  rain.extraYRotation=rain.getWorld().rand.nextInt(360) - 180F;
                }
                rain.setScale(2F);
                rain.isTransparent=true;
                rain.setGravity(2.5F);
                rain.setMaxAge(50);
                rain.setTicksFadeInMax(5);
                rain.setAlphaF(0);
                rain.rotationYaw=rain.getWorld().rand.nextInt(360) - 180F;
                rain.setMotionY(-0.5D);
                rain.spawnAsWeatherEffect();
                ClientTickHandler.weatherManager.addWeatheredParticle(rain);
                spawnCount++;
                if (spawnCount >= spawnNeed) {
                  break;
                }
              }
            }
          }
          if (world.getTotalWorldTime() % 60 == 0) {
          }
          boolean groundSplash=true;
          boolean downfall=true;
          spawnAreaSize=20;
          for (int i=0; groundSplash == true && i < 30F * curPrecipVal * ConfigParticle.Precipitation_Particle_effect_rate; i++) {
            BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY - 5 + rand.nextInt(15),entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
            pos=world.getPrecipitationHeight(pos).add(0,1,0);
            if (canPrecipitateAt(world,pos)) {
              ParticleTexFX rain=new ParticleTexFX(entP.world,pos.getX() + rand.nextFloat(),pos.getY() - 1 + 0.01D,pos.getZ() + rand.nextFloat(),0D,0D,0D,ParticleRegistry.cloud256_6);
              rain.setCanCollide(true);
              boolean upward=rand.nextBoolean();
              rain.windWeight=20F;
              rain.setFacePlayer(upward);
              rain.setScale(3F + (rand.nextFloat() * 3F));
              rain.setMaxAge(15);
              rain.setGravity(-0.0F);
              rain.setTicksFadeInMax(0);
              rain.setAlphaF(0);
              rain.setTicksFadeOutMax(4);
              rain.renderOrder=2;
              rain.rotationYaw=rain.getWorld().rand.nextInt(360) - 180F;
              rain.rotationPitch=90;
              rain.setMotionY(0D);
              rain.setMotionX((rand.nextFloat() - 0.5F) * 0.01F);
              rain.setMotionZ((rand.nextFloat() - 0.5F) * 0.01F);
              rain.spawnAsWeatherEffect();
              ClientTickHandler.weatherManager.addWeatheredParticle(rain);
            }
          }
          spawnAreaSize=20;
          for (int i=0; downfall == true && i < 2F * curPrecipVal * ConfigParticle.Precipitation_Particle_effect_rate; i++) {
            BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY - 5 + rand.nextInt(25),entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
            if (entP.getDistanceSq(pos) < 10D * 10D)             continue;
            if (canPrecipitateAt(world,pos)) {
              ParticleTexExtraRender rain=new ParticleTexExtraRender(entP.world,pos.getX() + rand.nextFloat(),pos.getY() - 1 + 0.01D,pos.getZ() + rand.nextFloat(),0D,0D,0D,ParticleRegistry.downfall3);
              rain.setKillWhenUnderTopmostBlock(true);
              rain.setTicksFadeOutMaxOnDeath(5);
              rain.noExtraParticles=true;
              boolean upward=rand.nextBoolean();
              rain.windWeight=8F;
              rain.setFacePlayer(true);
              rain.setFacePlayer(false);
              rain.facePlayerYaw=true;
              rain.setScale(90F + (rand.nextFloat() * 3F));
              rain.setMaxAge(60);
              rain.setGravity(0.35F);
              rain.setTicksFadeInMax(20);
              rain.setAlphaF(0);
              rain.setTicksFadeOutMax(20);
              rain.rotationYaw=rain.getWorld().rand.nextInt(360) - 180F;
              rain.rotationPitch=90;
              rain.rotationPitch=0;
              rain.setMotionY(-0.3D);
              rain.setMotionX((rand.nextFloat() - 0.5F) * 0.01F);
              rain.setMotionZ((rand.nextFloat() - 0.5F) * 0.01F);
              rain.spawnAsWeatherEffect();
              ClientTickHandler.weatherManager.addWeatheredParticle(rain);
            }
          }
        }
 else {
          spawnCount=0;
          spawnNeed=(int)(curPrecipVal * 40F * ConfigParticle.Precipitation_Particle_effect_rate);
          int spawnAreaSize=50;
          if (spawnNeed > 0) {
            for (int i=0; i < safetyCutout; i++) {
              BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY - 5 + rand.nextInt(25),entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
              if (canPrecipitateAt(world,pos)) {
                ParticleTexExtraRender snow=new ParticleTexExtraRender(entP.world,pos.getX(),pos.getY(),pos.getZ(),0D,0D,0D,ParticleRegistry.snow);
                snow.setKillWhenUnderTopmostBlock(true);
                snow.setTicksFadeOutMaxOnDeath(5);
                snow.setDontRenderUnderTopmostBlock(true);
                snow.setExtraParticlesBaseAmount(10);
                snow.setMotionY(-0.1D);
                snow.setScale(1.3F);
                snow.setGravity(0.1F);
                snow.windWeight=0.2F;
                snow.setMaxAge(40);
                snow.setFacePlayer(false);
                snow.setTicksFadeInMax(5);
                snow.setAlphaF(0);
                snow.setTicksFadeOutMax(5);
                snow.rotationYaw=snow.getWorld().rand.nextInt(360) - 180F;
                snow.spawnAsWeatherEffect();
                ClientTickHandler.weatherManager.addWeatheredParticle(snow);
                spawnCount++;
                if (spawnCount >= spawnNeed) {
                  break;
                }
              }
            }
          }
        }
      }
    }
  }
}

Fixed version (ground truth):
public void tickParticlePrecipitation(){
  if (ConfigParticle.Particle_RainSnow) {
    EntityPlayer entP=FMLClientHandler.instance().getClient().player;
    if (entP.posY >= StormObject.static_YPos_layer0)     return;
    WeatherManagerClient weatherMan=ClientTickHandler.weatherManager;
    if (weatherMan == null)     return;
    WindManager windMan=weatherMan.getWindManager();
    if (windMan == null)     return;
    float curPrecipVal=getRainStrengthAndControlVisuals(entP);
    float maxPrecip=0.5F;
    int precipitationHeight=entP.world.getPrecipitationHeight(new BlockPos(MathHelper.floor(entP.posX),0,MathHelper.floor(entP.posZ))).getY();
    Biome biomegenbase=entP.world.getBiome(new BlockPos(MathHelper.floor(entP.posX),0,MathHelper.floor(entP.posZ)));
    World world=entP.world;
    Random rand=entP.world.rand;
    boolean particleTest=false;
    if (particleTest) {
      if (testParticle == null) {
        BlockPos pos=new BlockPos(entP);
        if (canPrecipitateAt(world,pos)) {
          ParticleTexExtraRender rain=new ParticleTexExtraRender(entP.world,pos.getX() + rand.nextFloat(),pos.getY() - 1 + 0.01D,pos.getZ() + rand.nextFloat(),0D,0D,0D,ParticleRegistry.test_texture);
          rain.setSlantParticleToWind(false);
          rain.setExtraParticlesBaseAmount(2);
          rain.setSeverityOfRainRate(0);
          rain.setDontRenderUnderTopmostBlock(true);
          boolean upward=rand.nextBoolean();
          rain.windWeight=8F;
          rain.setFacePlayer(false);
          rain.setScale(90F + (rand.nextFloat() * 3F));
          rain.setScale(5F);
          rain.setMaxAge(60);
          rain.setGravity(0.0F);
          rain.setTicksFadeInMax(20);
          rain.setAlphaF(0);
          rain.setTicksFadeOutMax(20);
          rain.rotationYaw=0;
          rain.rotationPitch=90;
          rain.setMotionY(-0D);
          rain.setMotionX((rand.nextFloat() - 0.5F) * 0.01F);
          rain.setMotionZ((rand.nextFloat() - 0.5F) * 0.01F);
          rain.spawnAsWeatherEffect();
          testParticle=rain;
        }
      }
      if (testParticle != null) {
        testParticle.setPosition(entP.posX + 1,entP.posY,entP.posZ - 4);
        testParticle.rotationPitch=45;
        testParticle.rotationYaw=45;
      }
    }
    boolean doFish=false;
    if (doFish) {
      int spawnTryCur=0;
      int spawnTryMax=200;
      int range=60;
      for (; spawnTryCur < spawnTryMax; spawnTryCur++) {
        BlockPos pos=new BlockPos(entP.getPosition().add(rand.nextInt(range) - rand.nextInt(range),rand.nextInt(range) - rand.nextInt(range),rand.nextInt(range) - rand.nextInt(range)));
        IBlockState state=world.getBlockState(pos);
        if (state.getMaterial() == Material.WATER) {
          ParticleFish fish=new ParticleFish(entP.world,pos.getX() + 0.5F,pos.getY() + 0.5F,pos.getZ() + 0.5F,0D,0D,0D,ParticleRegistry.listFish.get(rand.nextInt(8) + 1));
          fish.setTicksFadeInMax(20);
          fish.setAlphaF(0);
          fish.setTicksFadeOutMax(20);
          fish.setMaxAge(20 * 10);
          fish.setScale(6F);
          fish.setDontRenderUnderTopmostBlock(false);
          fish.setGravity(0);
          fish.isTransparent=false;
          fish.motionY=0;
          fish.rotationYaw=rand.nextInt(360);
          fish.rotationPitch=rand.nextInt(45);
          fish.setRBGColorF(0.6F,0.6F,1F);
          ExtendedRenderer.rotEffRenderer.addEffect(fish);
        }
      }
    }
    boolean doGrass=true;
    if (doGrass) {
      int spawnAreaSize=80;
      int spawnAmount=1;
      for (int i=0; i < spawnAmount; i++) {
        BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY,entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
        pos=world.getPrecipitationHeight(pos);
        IBlockState state=world.getBlockState(pos.add(0,-1,0));
        if (state.getMaterial() == Material.GRASS) {
          for (int ii=0; ii < 8; ii++) {
            ParticleTallGrass rain=new ParticleTallGrass(entP.world,pos.getX(),pos.getY() + 0.5D - 0.2D + ii,pos.getZ(),0D,0D,0D,ParticleRegistry.tallgrass);
            rain.setCanCollide(true);
            int color=8763015;
            color=9551193;
            rain.particleRed=(float)(color >> 16 & 255) / 255.0F;
            rain.particleGreen=(float)(color >> 8 & 255) / 255.0F;
            rain.particleBlue=(float)(color & 255) / 255.0F;
            rain.isTransparent=false;
            rain.windWeight=99999F;
            rain.setFacePlayer(false);
            rain.setScale(3F + (rand.nextFloat() * 3F));
            rain.setScale(10F);
            rain.setMaxAge(240);
            rain.setGravity(0.0F);
            rain.setTicksFadeInMax(4);
            rain.setAlphaF(0);
            rain.setTicksFadeOutMax(4);
            rain.renderOrder=2;
            rain.rotationYaw=rain.getWorld().rand.nextInt(360) - 180F;
            rain.rotationPitch=0;
            rain.setMotionY(0D);
            rain.setMotionX(0);
            rain.setMotionZ(0);
            ExtendedRenderer.rotEffRenderer.addEffect(rain);
            ClientTickHandler.weatherManager.addWeatheredParticle(rain);
          }
        }
      }
    }
    if (biomegenbase != null && (biomegenbase.canRain() || biomegenbase.getEnableSnow())) {
      float temperature=biomegenbase.getFloatTemperature(new BlockPos(MathHelper.floor(entP.posX),MathHelper.floor(entP.posY),MathHelper.floor(entP.posZ)));
      double d3;
      float f10;
      curPrecipVal=Math.min(maxPrecip,Math.abs(curPrecipVal));
      curPrecipVal*=1F;
      if (curPrecipVal > 0) {
        int spawnCount;
        int spawnNeed=(int)(curPrecipVal * 40F * ConfigParticle.Precipitation_Particle_effect_rate);
        int safetyCutout=100;
        if (entP.world.getBiomeProvider().getTemperatureAtHeight(temperature,precipitationHeight) >= 0.15F) {
          spawnCount=0;
          int spawnAreaSize=20;
          if (spawnNeed > 0) {
            for (int i=0; i < safetyCutout; i++) {
              BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY - 5 + rand.nextInt(25),entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
              if (canPrecipitateAt(world,pos)) {
                ParticleTexExtraRender rain=new ParticleTexExtraRender(entP.world,pos.getX(),pos.getY(),pos.getZ(),0D,0D,0D,ParticleRegistry.rain_white);
                rain.setKillWhenUnderTopmostBlock(true);
                rain.killWhenUnderCameraAtLeast=5;
                rain.setTicksFadeOutMaxOnDeath(5);
                rain.setDontRenderUnderTopmostBlock(true);
                rain.setExtraParticlesBaseAmount(15);
                rain.fastLight=true;
                rain.setSlantParticleToWind(true);
                rain.windWeight=1F;
                if (!RotatingParticleManager.useShaders) {
                  rain.setFacePlayer(true);
                  rain.setSlantParticleToWind(true);
                }
 else {
                  rain.setFacePlayer(false);
                  rain.extraYRotation=rain.getWorld().rand.nextInt(360) - 180F;
                }
                rain.setScale(2F);
                rain.isTransparent=true;
                rain.setGravity(2.5F);
                rain.setMaxAge(50);
                rain.setTicksFadeInMax(5);
                rain.setAlphaF(0);
                rain.rotationYaw=rain.getWorld().rand.nextInt(360) - 180F;
                rain.setMotionY(-0.5D);
                rain.spawnAsWeatherEffect();
                ClientTickHandler.weatherManager.addWeatheredParticle(rain);
                spawnCount++;
                if (spawnCount >= spawnNeed) {
                  break;
                }
              }
            }
          }
          if (world.getTotalWorldTime() % 60 == 0) {
          }
          boolean groundSplash=true;
          boolean downfall=true;
          spawnAreaSize=20;
          for (int i=0; groundSplash == true && i < 30F * curPrecipVal * ConfigParticle.Precipitation_Particle_effect_rate; i++) {
            BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY - 5 + rand.nextInt(15),entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
            pos=world.getPrecipitationHeight(pos).add(0,1,0);
            if (canPrecipitateAt(world,pos)) {
              ParticleTexFX rain=new ParticleTexFX(entP.world,pos.getX() + rand.nextFloat(),pos.getY() - 1 + 0.01D,pos.getZ() + rand.nextFloat(),0D,0D,0D,ParticleRegistry.cloud256_6);
              rain.setCanCollide(true);
              boolean upward=rand.nextBoolean();
              rain.windWeight=20F;
              rain.setFacePlayer(upward);
              rain.setScale(3F + (rand.nextFloat() * 3F));
              rain.setMaxAge(15);
              rain.setGravity(-0.0F);
              rain.setTicksFadeInMax(0);
              rain.setAlphaF(0);
              rain.setTicksFadeOutMax(4);
              rain.renderOrder=2;
              rain.rotationYaw=rain.getWorld().rand.nextInt(360) - 180F;
              rain.rotationPitch=90;
              rain.setMotionY(0D);
              rain.setMotionX((rand.nextFloat() - 0.5F) * 0.01F);
              rain.setMotionZ((rand.nextFloat() - 0.5F) * 0.01F);
              rain.spawnAsWeatherEffect();
              ClientTickHandler.weatherManager.addWeatheredParticle(rain);
            }
          }
          spawnAreaSize=20;
          for (int i=0; downfall == true && i < 2F * curPrecipVal * ConfigParticle.Precipitation_Particle_effect_rate; i++) {
            BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY - 5 + rand.nextInt(25),entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
            if (entP.getDistanceSq(pos) < 10D * 10D)             continue;
            if (canPrecipitateAt(world,pos)) {
              ParticleTexExtraRender rain=new ParticleTexExtraRender(entP.world,pos.getX() + rand.nextFloat(),pos.getY() - 1 + 0.01D,pos.getZ() + rand.nextFloat(),0D,0D,0D,ParticleRegistry.downfall3);
              rain.setKillWhenUnderTopmostBlock(true);
              rain.setTicksFadeOutMaxOnDeath(5);
              rain.noExtraParticles=true;
              boolean upward=rand.nextBoolean();
              rain.windWeight=8F;
              rain.setFacePlayer(true);
              rain.setFacePlayer(false);
              rain.facePlayerYaw=true;
              rain.setScale(90F + (rand.nextFloat() * 3F));
              rain.setMaxAge(60);
              rain.setGravity(0.35F);
              rain.setTicksFadeInMax(20);
              rain.setAlphaF(0);
              rain.setTicksFadeOutMax(20);
              rain.rotationYaw=rain.getWorld().rand.nextInt(360) - 180F;
              rain.rotationPitch=90;
              rain.rotationPitch=0;
              rain.setMotionY(-0.3D);
              rain.setMotionX((rand.nextFloat() - 0.5F) * 0.01F);
              rain.setMotionZ((rand.nextFloat() - 0.5F) * 0.01F);
              rain.spawnAsWeatherEffect();
              ClientTickHandler.weatherManager.addWeatheredParticle(rain);
            }
          }
        }
 else {
          spawnCount=0;
          spawnNeed=(int)(curPrecipVal * 40F * ConfigParticle.Precipitation_Particle_effect_rate);
          int spawnAreaSize=50;
          if (spawnNeed > 0) {
            for (int i=0; i < safetyCutout; i++) {
              BlockPos pos=new BlockPos(entP.posX + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2),entP.posY - 5 + rand.nextInt(25),entP.posZ + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2));
              if (canPrecipitateAt(world,pos)) {
                ParticleTexExtraRender snow=new ParticleTexExtraRender(entP.world,pos.getX(),pos.getY(),pos.getZ(),0D,0D,0D,ParticleRegistry.snow);
                snow.setKillWhenUnderTopmostBlock(true);
                snow.setTicksFadeOutMaxOnDeath(5);
                snow.setDontRenderUnderTopmostBlock(true);
                snow.setExtraParticlesBaseAmount(10);
                snow.setMotionY(-0.1D);
                snow.setScale(1.3F);
                snow.setGravity(0.1F);
                snow.windWeight=0.2F;
                snow.setMaxAge(40);
                snow.setFacePlayer(false);
                snow.setTicksFadeInMax(5);
                snow.setAlphaF(0);
                snow.setTicksFadeOutMax(5);
                snow.rotationYaw=snow.getWorld().rand.nextInt(360) - 180F;
                snow.spawnAsWeatherEffect();
                ClientTickHandler.weatherManager.addWeatheredParticle(snow);
                spawnCount++;
                if (spawnCount >= spawnNeed) {
                  break;
                }
              }
            }
          }
        }
      }
    }
  }
}