Пример #1
0
  public void step(double dt) {
    super.step(dt);

    charge -= dt;

    if (isLocal && charge < 0 && noFriendlyFire()) {
      EntityBullet bullet = (EntityBullet) c.createEntity(w, EI.EntityBullet);
      double xDir = Math.cos(horizontalDir) * Math.cos(verticalDir),
          yDir = Math.sin(horizontalDir) * Math.cos(verticalDir),
          zDir = Math.sin(verticalDir);
      bullet.setPosition(
          x + xDir * shotDistance, y + yDir * shotDistance, z + zDir * shotDistance + shotHeight);
      bullet.setVelocity(shotSpeed * xDir, shotSpeed * yDir, shotSpeed * zDir);
      bullet.setDamage(2, 4);
      bullet.setColor(1, 0.8f, 0.6f);
      bullet.setOwner(this);

      c.getSoundHandler().playSound(0, x, y, z);
      w.create(bullet);

      charge = shotDelay;
    }

    Player player = w.getPlayer();
    double xDiff = player.getX() - x, yDiff = player.getY() - y, zDiff = player.getZ() - z;
    double xyDiff = Math.sqrt(xDiff * xDiff + yDiff * yDiff);

    double playerDir = Math.atan2(yDiff, xDiff);
    double playerVDir = Math.atan2(zDiff, xyDiff);

    double dirDifference = playerDir - horizontalDir;
    double vDirDifference = playerVDir - verticalDir;

    while (dirDifference < -Math.PI) dirDifference += 2 * Math.PI;
    while (dirDifference > Math.PI) dirDifference -= 2 * Math.PI;

    if (dirDifference > 0) horizontalDir += Math.min(dt, dirDifference);
    else horizontalDir -= Math.min(dt, -dirDifference);

    if (vDirDifference > 0) verticalDir += Math.min(dt, vDirDifference);
    else verticalDir -= Math.min(dt, -vDirDifference);

    if (hp <= 0) {
      c.addScore(100);
      delete();
    }
  }