public static FiringInstructions getNewPredictingFiringInstructions(
      MapBotBase bot, FiringDecision fd, float bulletSpeed) {
    Vector3f playerPos = bot.getBotPosition();
    Vector3f enemyPos = fd.enemyInfo.getBestVisibleEnemyPart(bot);

    // Calculate the time to hit
    double timeToHit = getTimeToHit(bulletSpeed, playerPos, enemyPos, fd.enemyInfo.predictedPos);
    if (timeToHit <= 1.5) {
      timeToHit = 1f;
    }

    // We add to enemy position the movement that the enemy is predicted to do in timeToHit.
    Vector3f hitPoint = CommFun.cloneVector(enemyPos);
    // movement is between bot position, not the visible part of the bot
    Vector3f movement =
        CommFun.getMovementBetweenVectors(
            fd.enemyInfo.getObjectPosition(), fd.enemyInfo.predictedPos);
    movement = CommFun.multiplyVectorByScalar(movement, (float) timeToHit);
    hitPoint.add(movement);

    return new FiringInstructions(CommFun.getNormalizedDirectionVector(playerPos, hitPoint));
  }
 /**
  * * Point the enemy and shoot.
  *
  * @param fd
  * @param playerPos
  * @return
  */
 public static FiringInstructions getFastFiringInstructions(FiringDecision fd, MapBotBase bot) {
   Vector3f to = new Vector3f(fd.enemyInfo.getBestVisibleEnemyPart(bot));
   Vector3f fireDir = CommFun.getNormalizedDirectionVector(bot.getBotPosition(), to);
   //		bot.dtalk.addToLog("Fast firing.");
   return new FiringInstructions(fireDir);
 }