Program: 3737
Project: 3737
Buggy source:
@Override public void perform(Actor a){
  ParticleActor actor=(ParticleActor)a;
  if (actor.getViewElements().particleEmitter == null) {
    createEmitter(actor);
  }
  ModelActor ma=actor.getParentModelActor();
  if (ma.getViewElements().spatial == null) {
    LogUtil.logger.info(actor + "String_Node_Str" + ma);
  }
  Vector3f emissionPoint;
  Vector3f direction;
  if (actor.emissionBone != null) {
    if (!ma.hasBone(actor.emissionBone)) {
      LogUtil.logger.info(actor + "String_Node_Str" + actor.emissionBone+ "String_Node_Str"+ ma);
      return;
    }
    emissionPoint=Translator.toVector3f(ma.getBoneCoord(actor.emissionBone));
    if (actor.directionBone != null) {
      direction=Translator.toVector3f(ma.getBoneCoord(actor.directionBone));
    }
 else {
      direction=new Vector3f(emissionPoint);
    }
  }
 else {
    emissionPoint=Translator.toVector3f(ma.getPos());
    direction=Translator.toVector3f(ma.getPos().get2D().getTranslation(ma.getYaw(),1).get3D(emissionPoint.z));
  }
  direction=direction.subtract(emissionPoint).normalize();
  Vector3f velocity=direction.mult((float)actor.velocity);
  ParticleEmitter pe=actor.getViewElements().particleEmitter;
  pe.getParticleInfluencer().setInitialVelocity(velocity);
  pe.getParticleInfluencer().setVelocityVariation((float)actor.fanning);
  if (actor.facing == ParticleActor.Facing.Velocity) {
    pe.setFaceNormal(direction);
  }
  if (pe.getParticlesPerSec() == 0) {
    pe.setParticlesPerSec(actor.perSecond);
  }
  Vector3f pos=pe.getWorldTranslation();
  pe.setLocalTranslation(emissionPoint);
  if (actor.duration == 0) {
    pe.emitAllParticles();
  }
  actor.updateDuration();
  if (pe.getUserData("String_Node_Str") != null && !pe.getUserData("String_Node_Str").equals(emissionPoint)) {
    double elapsedTime=System.currentTimeMillis() - (Long)pe.getUserData("String_Node_Str");
    for (    Particle p : getParticles(pe)) {
      double age=(p.startlife - p.life) * 1000;
      if (age < elapsedTime) {
        p.position.interpolate((Vector3f)pe.getUserData("String_Node_Str"),(float)(age / elapsedTime));
      }
    }
  }
  pe.setUserData("String_Node_Str",pos.clone());
  pe.setUserData("String_Node_Str",System.currentTimeMillis());
}

Fixed version (ground truth):
@Override public void perform(Actor a){
  ParticleActor actor=(ParticleActor)a;
  if (actor.getViewElements().particleEmitter == null) {
    createEmitter(actor);
  }
  ModelActor ma=actor.getParentModelActor();
  if (ma.getViewElements().spatial == null) {
    LogUtil.logger.info(actor + "String_Node_Str" + ma);
  }
  Vector3f emissionPoint;
  Vector3f direction;
  if (actor.emissionBone != null) {
    if (!ma.hasBone(actor.emissionBone)) {
      LogUtil.logger.info(actor + "String_Node_Str" + actor.emissionBone+ "String_Node_Str"+ ma);
      return;
    }
    emissionPoint=Translator.toVector3f(ma.getBoneCoord(actor.emissionBone));
    if (actor.directionBone != null) {
      direction=Translator.toVector3f(ma.getBoneCoord(actor.directionBone));
    }
 else {
      direction=new Vector3f(emissionPoint);
    }
  }
 else {
    emissionPoint=Translator.toVector3f(ma.getPos());
    direction=Translator.toVector3f(ma.getPos().get2D().getTranslation(ma.getYaw(),1).get3D(emissionPoint.z));
  }
  direction=direction.subtract(emissionPoint).normalize();
  Vector3f velocity=direction.mult((float)actor.velocity);
  ParticleEmitter pe=actor.getViewElements().particleEmitter;
  pe.getParticleInfluencer().setInitialVelocity(velocity);
  pe.getParticleInfluencer().setVelocityVariation((float)actor.fanning);
  if (actor.facing == ParticleActor.Facing.Velocity) {
    pe.setFaceNormal(direction);
  }
  if (pe.getParticlesPerSec() == 0) {
    pe.setParticlesPerSec(actor.perSecond);
  }
  Vector3f pos=pe.getWorldTranslation();
  pe.setLocalTranslation(emissionPoint);
  if (actor.duration == 0) {
    pe.emitAllParticles();
  }
  actor.updateDuration();
  if (pe.getUserData("String_Node_Str") != null && !pe.getUserData("String_Node_Str").equals(Vector3f.ZERO) && !pe.getUserData("String_Node_Str").equals(emissionPoint)) {
    double elapsedTime=System.currentTimeMillis() - (Long)pe.getUserData("String_Node_Str");
    for (    Particle p : getParticles(pe)) {
      double age=(p.startlife - p.life) * 1000;
      if (age < elapsedTime) {
        p.position.interpolate((Vector3f)pe.getUserData("String_Node_Str"),(float)(age / elapsedTime));
      }
    }
  }
  pe.setUserData("String_Node_Str",pos.clone());
  pe.setUserData("String_Node_Str",System.currentTimeMillis());
}