Program: 170065
Project: 170065
Buggy source:
/** 
 * Called to update the entity's position/logic.
 */
@Override public void onUpdate(){
  super.onUpdate();
  try {
    if (this.worldObj.isRemote) {
      this.ticksInAir=this.dataWatcher.getWatchableObjectInt(16);
    }
 else {
      this.dataWatcher.updateObject(16,this.ticksInAir);
    }
  }
 catch (  Exception e) {
    e.printStackTrace();
  }
  if (this.ticksInAir >= 0) {
    if (!this.worldObj.isRemote) {
      if (this.isCruise) {
        if (this.ticksInAir == 0) {
          this.motionX=this.xDifference / (flightTime * 0.5);
          this.motionY=this.yDifference / (flightTime * 0.5);
          this.motionZ=this.zDifference / (flightTime * 0.5);
        }
        this.rotationPitch=(float)(Math.atan(this.motionY / (Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ))) * 180 / Math.PI);
        this.rotationYaw=(float)(Math.atan2(this.motionX,this.motionZ) * 180 / Math.PI);
        Missile.list[this.missileID].onTickFlight(this);
        this.noClip=true;
        this.moveEntity(this.motionX,this.motionY,this.motionZ);
        Vector3 position=Vector3.get(this);
        this.isCollided=this.worldObj.getBlockId(MathHelper.floor_double(this.posX),MathHelper.floor_double(this.posY),MathHelper.floor_double(this.posZ)) != 0;
        if ((this.isCollided && this.ticksInAir >= 20) || this.ticksInAir > 20 * 600) {
          this.explode();
        }
      }
 else {
        if (this.ticksInAir < 20) {
          this.motionY=this.launchAcceleration * this.ticksInAir * (this.ticksInAir / 2);
          this.moveEntity(this.motionX,this.motionY,this.motionZ);
        }
 else         if (this.ticksInAir == 20) {
          this.motionY=this.acceleration * (this.flightTime / 2);
          this.motionX=this.xDifference / flightTime;
          this.motionZ=this.zDifference / flightTime;
        }
 else {
          if (this.ticksInAir > 20 * 60) {
            this.explode();
          }
          Vector3 currentPosition=new Vector3(this.posX,this.posY,this.posZ);
          double currentDistance=Vector2.distance(currentPosition.toVector2(),this.targetPosition.toVector2());
          this.motionY-=this.acceleration;
          this.rotationPitch=(float)(Math.atan(this.motionY / (Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ))) * 180 / Math.PI);
          this.rotationYaw=(float)(Math.atan2(this.motionX,this.motionZ) * 180 / Math.PI);
          Missile.list[this.missileID].onTickFlight(this);
          this.moveEntity(this.motionX,this.motionY,this.motionZ);
          this.lastTickPosX=this.posX;
          this.lastTickPosY=this.posY;
          this.lastTickPosZ=this.posZ;
          if (this.isCollided) {
            this.explode();
          }
          if (heightBeforeHit > 0 && this.motionY < 0) {
            int blockBelowID=this.worldObj.getBlockId((int)this.posX,(int)this.posY - heightBeforeHit,(int)this.posZ);
            if (blockBelowID > 0) {
              heightBeforeHit=0;
              this.explode();
            }
          }
        }
      }
    }
    this.spawnMissileSmoke();
    this.protectionTime--;
    this.ticksInAir++;
  }
 else {
    if (this.missileLauncherPosition == null) {
      this.setDead();
      return;
    }
    TileEntity tileEntity=this.worldObj.getBlockTileEntity((int)missileLauncherPosition.x,(int)missileLauncherPosition.y,(int)missileLauncherPosition.z);
    if (tileEntity == null) {
      this.setDead();
      return;
    }
    if (tileEntity.isInvalid()) {
      this.setDead();
      return;
    }
    if (tileEntity instanceof TileEntityLauncherBase) {
      if (((TileEntityLauncherBase)tileEntity).containingMissile == null) {
        ((TileEntityLauncherBase)tileEntity).containingMissile=this;
      }
      this.setSize(0.8F,2.5F);
    }
 else     if (tileEntity instanceof TileEntityCruiseLauncher) {
      if (((TileEntityCruiseLauncher)tileEntity).containingMissile == null) {
        ((TileEntityCruiseLauncher)tileEntity).containingMissile=this;
      }
      this.isCruise=true;
      this.xDifference=((TileEntityCruiseLauncher)tileEntity).target.x - this.startingPosition.x;
      this.yDifference=((TileEntityCruiseLauncher)tileEntity).target.y - this.startingPosition.y;
      this.zDifference=((TileEntityCruiseLauncher)tileEntity).target.z - this.startingPosition.z;
      this.flatDistance=Vector2.distance(this.startingPosition.toVector2(),((TileEntityCruiseLauncher)tileEntity).target.toVector2());
      this.skyLimit=150 + (int)(this.flatDistance * 1.8);
      this.flightTime=(float)Math.max(100,2.4 * flatDistance);
      this.acceleration=(float)skyLimit * 2 / (flightTime * flightTime);
      this.motionX=this.xDifference / (flightTime * 0.6);
      this.motionY=this.yDifference / (flightTime * 0.6);
      this.motionZ=this.zDifference / (flightTime * 0.6);
      float newRotationPitch=(float)(Math.atan(this.motionY / (Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ))) * 180 / Math.PI);
      float newRotationYaw=(float)(Math.atan2(this.motionX,this.motionZ) * 180 / Math.PI);
      if (newRotationYaw - this.rotationYaw != 0) {
        this.rotationYaw+=(newRotationYaw - this.rotationYaw) * 0.1;
      }
      if (newRotationPitch - this.rotationPitch != 0) {
        this.rotationPitch+=(newRotationPitch - this.rotationPitch) * 0.1;
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Called to update the entity's position/logic.
 */
@Override public void onUpdate(){
  super.onUpdate();
  try {
    if (this.worldObj.isRemote) {
      this.ticksInAir=this.dataWatcher.getWatchableObjectInt(16);
    }
 else {
      this.dataWatcher.updateObject(16,this.ticksInAir);
    }
  }
 catch (  Exception e) {
    e.printStackTrace();
  }
  if (this.ticksInAir >= 0) {
    if (!this.worldObj.isRemote) {
      if (this.isCruise) {
        if (this.ticksInAir == 0) {
          this.motionX=this.xDifference / (flightTime * 0.5);
          this.motionY=this.yDifference / (flightTime * 0.5);
          this.motionZ=this.zDifference / (flightTime * 0.5);
        }
        this.rotationPitch=(float)(Math.atan(this.motionY / (Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ))) * 180 / Math.PI);
        this.rotationYaw=(float)(Math.atan2(this.motionX,this.motionZ) * 180 / Math.PI);
        Missile.list[this.missileID].onTickFlight(this);
        this.moveEntity(this.motionX,this.motionY,this.motionZ);
        Vector3 position=Vector3.get(this);
        this.isCollided=this.worldObj.getBlockId(MathHelper.floor_double(this.posX),MathHelper.floor_double(this.posY),MathHelper.floor_double(this.posZ)) != 0;
        if ((this.isCollided && this.ticksInAir >= 20) || this.ticksInAir > 20 * 600) {
          this.explode();
        }
      }
 else {
        if (this.ticksInAir < 20) {
          this.motionY=this.launchAcceleration * this.ticksInAir * (this.ticksInAir / 2);
          this.moveEntity(this.motionX,this.motionY,this.motionZ);
        }
 else         if (this.ticksInAir == 20) {
          this.motionY=this.acceleration * (this.flightTime / 2);
          this.motionX=this.xDifference / flightTime;
          this.motionZ=this.zDifference / flightTime;
        }
 else {
          if (this.ticksInAir > 20 * 60) {
            this.explode();
          }
          Vector3 currentPosition=new Vector3(this.posX,this.posY,this.posZ);
          double currentDistance=Vector2.distance(currentPosition.toVector2(),this.targetPosition.toVector2());
          this.motionY-=this.acceleration;
          this.rotationPitch=(float)(Math.atan(this.motionY / (Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ))) * 180 / Math.PI);
          this.rotationYaw=(float)(Math.atan2(this.motionX,this.motionZ) * 180 / Math.PI);
          Missile.list[this.missileID].onTickFlight(this);
          this.moveEntity(this.motionX,this.motionY,this.motionZ);
          this.lastTickPosX=this.posX;
          this.lastTickPosY=this.posY;
          this.lastTickPosZ=this.posZ;
          if (this.isCollided) {
            this.explode();
          }
          if (heightBeforeHit > 0 && this.motionY < 0) {
            int blockBelowID=this.worldObj.getBlockId((int)this.posX,(int)this.posY - heightBeforeHit,(int)this.posZ);
            if (blockBelowID > 0) {
              heightBeforeHit=0;
              this.explode();
            }
          }
        }
      }
    }
    this.spawnMissileSmoke();
    this.protectionTime--;
    this.ticksInAir++;
  }
 else {
    if (this.missileLauncherPosition == null) {
      this.setDead();
      return;
    }
    TileEntity tileEntity=this.worldObj.getBlockTileEntity((int)missileLauncherPosition.x,(int)missileLauncherPosition.y,(int)missileLauncherPosition.z);
    if (tileEntity == null) {
      this.setDead();
      return;
    }
    if (tileEntity.isInvalid()) {
      this.setDead();
      return;
    }
    if (tileEntity instanceof TileEntityLauncherBase) {
      if (((TileEntityLauncherBase)tileEntity).containingMissile == null) {
        ((TileEntityLauncherBase)tileEntity).containingMissile=this;
      }
    }
 else     if (tileEntity instanceof TileEntityCruiseLauncher) {
      if (((TileEntityCruiseLauncher)tileEntity).containingMissile == null) {
        ((TileEntityCruiseLauncher)tileEntity).containingMissile=this;
      }
      this.isCruise=true;
      this.noClip=true;
      this.xDifference=((TileEntityCruiseLauncher)tileEntity).target.x - this.startingPosition.x;
      this.yDifference=((TileEntityCruiseLauncher)tileEntity).target.y - this.startingPosition.y;
      this.zDifference=((TileEntityCruiseLauncher)tileEntity).target.z - this.startingPosition.z;
      this.flatDistance=Vector2.distance(this.startingPosition.toVector2(),((TileEntityCruiseLauncher)tileEntity).target.toVector2());
      this.skyLimit=150 + (int)(this.flatDistance * 1.8);
      this.flightTime=(float)Math.max(100,2.4 * flatDistance);
      this.acceleration=(float)skyLimit * 2 / (flightTime * flightTime);
      this.motionX=this.xDifference / (flightTime * 0.6);
      this.motionY=this.yDifference / (flightTime * 0.6);
      this.motionZ=this.zDifference / (flightTime * 0.6);
      float newRotationPitch=(float)(Math.atan(this.motionY / (Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ))) * 180 / Math.PI);
      float newRotationYaw=(float)(Math.atan2(this.motionX,this.motionZ) * 180 / Math.PI);
      if (newRotationYaw - this.rotationYaw != 0) {
        this.rotationYaw+=(newRotationYaw - this.rotationYaw) * 0.1;
      }
      if (newRotationPitch - this.rotationPitch != 0) {
        this.rotationPitch+=(newRotationPitch - this.rotationPitch) * 0.1;
      }
    }
  }
}