/** Cleans garbage (Tilecleanup) */
 public synchronized void garbageCollect() {
   long startTime = getTime();
   int curMemory =
       (int) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1000;
   for (int i = 0; i < Instance.getWorld().tiles.length; i++) {
     for (int in = 0; in < Instance.getWorld().tiles[i].length; in++) {
       ActiveTile tile = Instance.getWorld().tiles[i][in];
       if (tile != null) {
         if (!tile.hasGameObject() && !tile.hasItems() && !tile.hasNpcs() && !tile.hasPlayers()) {
           Instance.getWorld().tiles[i][in] = null;
         }
       }
     }
   }
   Runtime.getRuntime().gc();
   int newMemory =
       (int) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1000;
   Logger.println("GARBAGE COLLECT | Executing Memory Cleanup");
   Logger.println(
       "GARBAGE COLLECT | Memory before: "
           + curMemory
           + "kb"
           + " Memory after: "
           + newMemory
           + " (Freed: "
           + (curMemory - newMemory)
           + "kb)");
   Logger.println("GARBAGE COLLECT | Cleanup took " + (updateTime() - startTime) + "ms");
 }
 /** Cleans snapshots of entries over 60 seconds old (executed every second) */
 public void cleanSnapshotDeque() {
   long curTime = GameEngine.getTimestamp(); // We need to compare
   // timestamps
   if (curTime - lastCleanedChatlogs > 1000) { // Every second
     lastCleanedChatlogs = curTime;
     lastCleanedChatlogsOutput++;
     if (lastCleanedChatlogsOutput > 60 * 5) {
       Logger.println("----------------------------------------------");
       Logger.println(world.getSnapshots().size() + " items on deque");
     }
     Iterator<Snapshot> i = world.getSnapshots().descendingIterator();
     Snapshot s = null;
     while (i.hasNext()) {
       s = i.next();
       if (curTime - s.getTimestamp() > 60000) {
         i.remove();
         s = null;
       } else {
         s = null;
       }
     }
     i = null;
     if (lastCleanedChatlogsOutput > 60 * 5) {
       Logger.println(world.getSnapshots().size() + " items on deque AFTER CLEANUP");
       Logger.println("----------------------------------------------");
       lastCleanedChatlogsOutput = 0;
     }
   }
 }
  public void sessionCreated(IoSession session) {
    session
        .getFilterChain()
        .addFirst("protocolFilter", new ProtocolCodecFilter(new RSCCodecFactory()));

    Logger.println(
        "Connection from: "
            + ((InetSocketAddress) session.getRemoteAddress()).getAddress().getHostAddress());
  }
  /** The thread execution process. */
  public void run() {
    Logger.println("GameEngine now running");
    time = System.nanoTime() / 1000000000;

    eventHandler.add(
        new DelayedEvent(null, Config.GARBAGE_COLLECT_INTERVAL) { // Ran
          // every
          // 50*2
          // minutes
          @Override
          public void run() {
            new Thread(
                    new Runnable() {
                      public void run() {
                        garbageCollect();
                      }
                    })
                .start();
          }
        });
    eventHandler.add(
        new DelayedEvent(null, Config.SAVE_INTERVAL) {
          public void run() {
            long now = GameEngine.getTime();
            for (Player p : world.getPlayers()) {
              if (now - p.getLastSaveTime() >= Config.SAVE_INTERVAL) {
                p.save();
                p.setLastSaveTime(now);
              }
            }
            Instance.getServer().getLoginConnector().getActionSender().saveProfiles();
          }
        });
    while (running) {
      try {
        Thread.sleep(50);
      } catch (InterruptedException ie) {
      }
      long deltaTime = updateTime();
      processLoginServer();
      if ((deltaTime = getDeltaTime()) >= 1000)
        Logger.println(
            "processLoginServer is taking longer than it should, exactly " + deltaTime + "ms");
      processIncomingPackets();
      if ((deltaTime = getDeltaTime()) >= 1000)
        Logger.println(
            "processIncomingPackets is taking longer than it should, exactly " + deltaTime + "ms");
      processEvents();
      if ((deltaTime = getDeltaTime()) >= 1000)
        Logger.println(
            "processEvents is taking longer than it should, exactly " + deltaTime + "ms");
      processClients();
      if ((deltaTime = getDeltaTime()) >= 1000)
        Logger.println(
            "processClients is taking longer than it should, exactly " + deltaTime + "ms");
      cleanSnapshotDeque();
      if ((deltaTime = getDeltaTime()) >= 1000)
        Logger.println(
            "processSnapshotDeque is taking longer than it should, exactly " + deltaTime + "ms");
    }
  }
 public void kill() {
   Logger.println("Terminating GameEngine");
   running = false;
 }