/** 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--; } }