protected void printShipRoster(int whoListing) {
        int playerCount = 0;
        int humanPlyrCnt = 0;
        String output = "";
        sendText("\r\n\r\n");
        for (int x = 0; x < TrekServer.players.size(); x++) {
            TrekPlayer activePlayer = (TrekPlayer) TrekServer.players.elementAt(x);
            if (activePlayer == null)
                continue;
            if (activePlayer.state != TrekPlayer.WAIT_PLAYING)
                continue;
            if (activePlayer == this && activePlayer.ship == null)
                continue;
            switch (whoListing) {
                case WHO_NORMAL:
                    TrekHighScoreListing scoreListing = new TrekHighScoreListing(activePlayer, true);
                    output += scoreListing.listing + "\r\n";
                    break;
                case WHO_ADDRESS:
                    output += TrekUtilities.format(activePlayer.shipName, "", 17);
                    if (!activePlayer.playerHostName.equals(""))
                        if (TrekServer.isAnonymousPlayEnabled() && activePlayer.isAnonymous) {
                            output += "xxx.xxx.      xxxxxx";
                        } else {
                            output += activePlayer.playerHostName.substring(0, 8);
                            output += "      " + dbInt.getPlayerName(activePlayer.dbPlayerID);
                        }
                    else if (!(activePlayer instanceof TrekBot)) {
                        output += activePlayer.playerIP.substring(0, 8);
                        output += "      " + dbInt.getPlayerName(activePlayer.dbPlayerID);
                    } else {
                        if (activePlayer instanceof BotPlayer)
                            output += "xxx.xxx.      xxxxxx";  //make 'botplayers' appear like normal human players
                    }
                    output += "\r\n";
                    break;
                case WHO_INGAME:
                    output += "[" + activePlayer.ship.scanLetter + "] " + (new TrekHighScoreListing(activePlayer, true).listing) + "\r\n";
                    break;
                default:
                    output += "Unknown.";
                    break;
            }
            playerCount++;
            if (!(activePlayer instanceof TrekBot) || (activePlayer instanceof BotPlayer)) {  // want botplayers counted as humans again
                humanPlyrCnt++;
            }
        }
        if (playerCount != 0) {
            switch (whoListing) {
                case WHO_NORMAL:
                    sendText("Ship Name        Class      Gold DmgGiven Bonus DmgRcvd Cfl Brk Quadrant\r\n");
                    break;
                case WHO_INGAME:
                    sendText("Ltr Ship Name        Class      Gold DmgGiven Bonus DmgRcvd Cfl Brk Quadrant\r\n");
                    break;
                case WHO_ADDRESS:
                    sendText("Ship Name        Hostname      Player\r\n");
                    break;
                default:
                    sendText("Ship Name        Class      Gold DmgGiven Bonus DmgRcvd Cfl Brk Quadrant\r\n");
                    break;
            }
            sendText(output);
            sendText("\r\nActive Players: " + playerCount + " (" + humanPlyrCnt + ")\r\n\r\n");
            if (whoListing == WHO_INGAME) {
                sendText("\r\nPress a key to return to the game.\r\n* YOUR SHIP IS ACTIVE AND COULD BE UNDER ATTACK. *\r\n");
            }
        } else {
            sendText("There are no active players.\r\n\r\n");
        }
    }