private void cmd_who(final String arg, final Client client) {
		// TODO Is there any reason for the WHO command to care whether you know someone's name?
		if (!arg.equals("") ) {

			if (loginCheck(client) && checkAccess(getPlayer(client), Constants.ADMIN)) {
				final Player player = getPlayer(arg);

				String name = player.getName(); // need to limit name to 10 characters
				String cname = player.getCName();

				if (player != null) {
					if (player.getNames().contains(name) || getPlayer(client).getName().equals(name)) {
						send(player.getName() + " Located: " + player.getLocation(), client);
					}
					else {
						send(cname + " Located: " + player.getLocation(),client);
					}
				}
			}
		}
		else {
			int n = 0;

			for (final Player player : players) {
				try {
					String name = player.getName();   // limit name to 10 characters?
					String cname = player.getCName();
					String title = player.getTitle(); // limit title to 8 characters
					String race = player.getRace().toString();

					StringBuilder sb = new StringBuilder();

					// [ level class ] name - specialty/prestige class - group/guild
					// (race)
					sb.append(colors("[", "blue"));
					sb.append(player.getLevel() + "");
					sb.append(' ');
					sb.append(colors(player.getPClass().getAbrv(), player.getPClass().getColor()));
					sb.append(colors("]", "blue"));
					sb.append(' ');

					// name
					if (loginCheck(client)) {
						if (player.getNames().contains(name) || getPlayer(client).getName().equals(name)) {
							sb.append(name);
						}
						else {
							if( use_cnames )  sb.append(cname);
							else              sb.append( Utils.padRight("", '?', 3) );
						}
					}
					else {
						if( use_cnames )  sb.append(cname);
						else              sb.append( Utils.padRight("", '?', 3) );
					}

					// title
					if (!title.equals("")) { // if title isn't empty
						sb.append(' ');
						sb.append("\'" + title + "\'");
					}

					// race
					sb.append(' ');
					sb.append("(" + race + ")");
					sb.append("\r");
					sb.append('\n');

					client.write(sb.toString());

					// count players
					n++;
				}
				catch (final NullPointerException npe) {
					debug("cmd_who(): some piece of player information is null (null pointer exception)");
					System.out.println("--- Stack Trace ---");
					npe.printStackTrace();
				}
			}

			send(n + " players currently online.", client);
		}
	}