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(); } }