コード例 #1
0
ファイル: Server.java プロジェクト: Ventuz/vscape
  /** Performs a server cycle. */
  private void cycle() {
    int loggedIn = 0;
    Benchmark b = Benchmarks.getBenchmark("loginQueue");
    b.start();
    while (!loginQueue.isEmpty() && loggedIn++ < 50) {
      Player player = loginQueue.poll();
      try {
        player.finishLogin();
        player.setLoginStage(LoginStages.LOGGED_IN);
      } catch (Exception ex) {
        // ex.printStackTrace();
        System.out.println("Error, infinite DC loop for this player");
        player.disconnect();
      }
    }
    b.stop();

    b = Benchmarks.getBenchmark("handleNetworkPackets");
    b.start();
    // Handle all network events.
    try {
      selector.selectNow();
      for (SelectionKey selectionKey : selector.selectedKeys()) {
        if (selectionKey.isValid()) {
          if (selectionKey.isReadable()) {
            // Tell the client to handle the packet.
            PacketManager.handleIncomingData((Player) selectionKey.attachment());
          }
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    b.stop();

    // Next, perform game processing.
    try {
      PluginManager.tick();
      World.process();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    b = Benchmarks.getBenchmark("disconnectingPlayers");
    b.start();
    synchronized (disconnectedPlayers) {
      for (Iterator<Player> players = disconnectedPlayers.iterator(); players.hasNext(); ) {
        Player player = players.next();
        if (player.logoutDisabled()) continue;
        player.logout();
        players.remove();
      }
    }
    b.stop();
    if (infoDisplayCounter == 0) {
      System.out.println(
          "[ENGINE]: Server load: " + cycle + "% with " + World.playerAmount() + " players");
      infoDisplayCounter = 300;
    } else {
      infoDisplayCounter--;
    }
  }