public static void registerClient(final MapleClient c) {
	if (c.finishLogin() == 0) {
	    c.getSession().write(LoginPacket.getAuthSuccessRequest(c));
	    c.setIdleTask(TimerManager.getInstance().schedule(new Runnable() {

		public void run() {
		    c.getSession().close();
		}
	    }, 10 * 60 * 10000));
	} else {
	    c.getSession().write(LoginPacket.getLoginFailed(7));
	    return;
	}
	final LoginServer LS = LoginServer.getInstance();

	if (System.currentTimeMillis() - lastUpdate > 300000) { // Update once every 5 minutes
            try {
                // Update once every 5 minutes
                lastUpdate = System.currentTimeMillis();
                final Map<Integer, Integer> load = LS.getWorldInterface().getChannelLoad();
                if (load == null) {
                    // In an unfortunate event that client logged in before load
                    lastUpdate = 0;
                    c.getSession().write(LoginPacket.getLoginFailed(7));
                    return;
                }
                final double loadFactor = 1200 / ((double) LS.getUserLimit() / load.size());
                for (Entry<Integer, Integer> entry : load.entrySet()) {
                    load.put(entry.getKey(), Math.min(1200, (int) (entry.getValue() * loadFactor)));
                }
                LS.setLoad(load);
            } catch (RemoteException ex) {
                System.err.println("Login Worker Error : " + ex);
            }
	    
	}

	c.getSession().write(LoginPacket.getServerList(6, LS.getServerName(), LS.getLoad()));
	c.getSession().write(LoginPacket.getEndOfServerList());

	mutex.lock();
	try {
	    IPLog.add(new Pair<Integer, String>(c.getAccID(), c.getSession().getRemoteAddress().toString()));
	} finally {
	    mutex.unlock();
	}
    }