Program: 30566
Project: 30566
Buggy source:
@Override public void renderParticle(Tessellator tess,float l,float rX,float rY,float rZ,float rYZ,float rXY){
  float j=1.0f;
  tess.setColorRGBA_F(this.particleRed * j * 0.9f,this.particleGreen * j * 0.95f,this.particleBlue * j,this.particleAlpha);
  if (particleAge == 3) {
    regen();
  }
  double f6=this.particleTextureIndexX / 16.0;
  double f7=f6 + 0.0324375F;
  double f8=this.particleTextureIndexY / 16.0;
  double f9=f8 + 0.0324375F;
  f6=f7;
  f8=f9;
  double scale=0.02;
  double a[]=new double[3];
  double b[]=new double[3];
  double ox=0;
  double oy=0;
  double oz=0;
  EntityPlayer p=Minecraft.getMinecraft().thePlayer;
  double offX=-rZ;
  double offY=MathHelper.cos((float)(Math.PI / 2.0f + p.rotationPitch * 0.017453292F));
  double offZ=rX;
  for (int layer=0; layer < 2; layer++) {
    if (layer == 0) {
      scale=0.04;
      offX*=0.001;
      offY*=0.001;
      offZ*=0.001;
      tess.setColorRGBA_F(this.particleRed * j * 0.4f,this.particleGreen * j * 0.25f,this.particleBlue * j * 0.45f,this.particleAlpha);
    }
 else {
      offX=0;
      offY=0;
      offZ=0;
      scale=0.02;
      tess.setColorRGBA_F(this.particleRed * j * 0.9f,this.particleGreen * j * 0.65f,this.particleBlue * j * 0.85f,this.particleAlpha);
    }
    for (int cycle=0; cycle < 3; cycle++) {
      clear();
      double x=(this.prevPosX + (this.posX - this.prevPosX) * (double)l - interpPosX) - offX;
      double y=(this.prevPosY + (this.posY - this.prevPosY) * (double)l - interpPosY) - offY;
      double z=(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)l - interpPosZ) - offZ;
      for (int s=0; s < steps; s++) {
        double xN=x + Steps[s][0];
        double yN=y + Steps[s][1];
        double zN=z + Steps[s][2];
        double xD=xN - x;
        double yD=yN - y;
        double zD=zN - z;
        if (cycle == 0) {
          ox=(yD * 0) - (1 * zD);
          oy=(zD * 0) - (0 * xD);
          oz=(xD * 1) - (0 * yD);
        }
        if (cycle == 1) {
          ox=(yD * 1) - (0 * zD);
          oy=(zD * 0) - (1 * xD);
          oz=(xD * 0) - (0 * yD);
        }
        if (cycle == 2) {
          ox=(yD * 0) - (0 * zD);
          oy=(zD * 1) - (0 * xD);
          oz=(xD * 0) - (1 * yD);
        }
        double ss=Math.sqrt(ox * ox + oy * oy + oz * oz) / ((((double)steps - (double)s) / (double)steps) * scale);
        ox/=ss;
        oy/=ss;
        oz/=ss;
        a[0]=x + ox;
        a[1]=y + oy;
        a[2]=z + oz;
        b[0]=x;
        b[1]=y;
        b[2]=z;
        draw(tess,a,b,f6,f8);
        x=xN;
        y=yN;
        z=zN;
      }
    }
  }
  GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
  GL11.glDisable(GL11.GL_CULL_FACE);
  tess.draw();
  GL11.glPopAttrib();
  tess.startDrawingQuads();
}

Fixed version (ground truth):
@Override public void renderParticle(Tessellator tess,float l,float rX,float rY,float rZ,float rYZ,float rXY){
  float j=1.0f;
  tess.setColorRGBA_F(this.particleRed * j * 0.9f,this.particleGreen * j * 0.95f,this.particleBlue * j,this.particleAlpha);
  if (particleAge == 3) {
    regen();
  }
  double f6=this.particleTextureIndexX / 16.0;
  double f7=f6 + 0.0324375F;
  double f8=this.particleTextureIndexY / 16.0;
  double f9=f8 + 0.0324375F;
  f6=f7;
  f8=f9;
  double scale=0.02;
  double a[]=new double[3];
  double b[]=new double[3];
  double ox=0;
  double oy=0;
  double oz=0;
  EntityPlayer p=Minecraft.getMinecraft().thePlayer;
  double offX=-rZ;
  double offY=MathHelper.cos((float)(Math.PI / 2.0f + p.rotationPitch * 0.017453292F));
  double offZ=rX;
  for (int layer=0; layer < 2; layer++) {
    if (layer == 0) {
      scale=0.04;
      offX*=0.001;
      offY*=0.001;
      offZ*=0.001;
      tess.setColorRGBA_F(this.particleRed * j * 0.4f,this.particleGreen * j * 0.25f,this.particleBlue * j * 0.45f,this.particleAlpha);
    }
 else {
      offX=0;
      offY=0;
      offZ=0;
      scale=0.02;
      tess.setColorRGBA_F(this.particleRed * j * 0.9f,this.particleGreen * j * 0.65f,this.particleBlue * j * 0.85f,this.particleAlpha);
    }
    for (int cycle=0; cycle < 3; cycle++) {
      clear();
      double x=(this.prevPosX + (this.posX - this.prevPosX) * (double)l - interpPosX) - offX;
      double y=(this.prevPosY + (this.posY - this.prevPosY) * (double)l - interpPosY) - offY;
      double z=(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)l - interpPosZ) - offZ;
      for (int s=0; s < steps; s++) {
        double xN=x + Steps[s][0];
        double yN=y + Steps[s][1];
        double zN=z + Steps[s][2];
        double xD=xN - x;
        double yD=yN - y;
        double zD=zN - z;
        if (cycle == 0) {
          ox=(yD * 0) - (1 * zD);
          oy=(zD * 0) - (0 * xD);
          oz=(xD * 1) - (0 * yD);
        }
        if (cycle == 1) {
          ox=(yD * 1) - (0 * zD);
          oy=(zD * 0) - (1 * xD);
          oz=(xD * 0) - (0 * yD);
        }
        if (cycle == 2) {
          ox=(yD * 0) - (0 * zD);
          oy=(zD * 1) - (0 * xD);
          oz=(xD * 0) - (1 * yD);
        }
        double ss=Math.sqrt(ox * ox + oy * oy + oz * oz) / ((((double)steps - (double)s) / (double)steps) * scale);
        ox/=ss;
        oy/=ss;
        oz/=ss;
        a[0]=x + ox;
        a[1]=y + oy;
        a[2]=z + oz;
        b[0]=x;
        b[1]=y;
        b[2]=z;
        draw(tess,a,b,f6,f8);
        x=xN;
        y=yN;
        z=zN;
      }
    }
  }
}