Hi all, I have whipped up a player list command which is based on mostly on
do_who and Brian Helms' show immortals snippet. It takes an argument
similar to do_users or do_who. I am pretty new to Circle coding in general
and while the code works fine, it includes deleted players. Any ideas on
how to screen for deleted players? I get compile errors when I do a simple
if "(PLR_FLAGGED(player, PLR_DELETED)) continue;". The command is pretty
useful other than that.... (I have races on my mud, if you don't you
should remove those portions before using this.)
Thanks a ton!
Melissa Jadwinski
meer@meersan.net
/* Player Search command shamelessly twisted from do_who, idea
inspired by Brian Helms <bhelms1@gl.umbc.edu>'s show immortals
snippet, and by Primacy <jmrobins@wired.uvm.edu>'s do_players.
meer@meersan.net, 18 Jan 99
*/
#define PLAYER_FORMAT \
"format: players [minlev[-maxlev]] [-s] [-c classlist] [-r racelist]\r\n"
ACMD(do_players)
{
FILE *fl;
struct char_file_u player;
size_t i;
char mode;
int low = 0, high = LVL_IMPL;
int showclass = 0, short_list = 0, showrace = 0, num_found = 0, done = 0;
char tmp[64];
skip_spaces(&argument);
strcpy(buf, argument);
if (!(fl = fopen(PLAYER_FILE, "r+"))) {
send_to_char("Can't open player file.", ch);
return;
}
while (*buf) {
half_chop(buf, arg, buf1);
if (isdigit(*arg)) {
sscanf(arg, "%d-%d", &low, &high);
strcpy(buf, buf1);
} else if (*arg == '-') {
mode = *(arg + 1); /* just in case; we destroy arg in the
switch */
switch (mode) {
case 's':
short_list = 1;
strcpy(buf, buf1);
break;
case 'l':
half_chop(buf1, arg, buf);
sscanf(arg, "%d-%d", &low, &high);
break;
case 'r':
half_chop(buf1, arg, buf);
for (i = 0; i < strlen(arg); i++)
showrace |= find_race_bitvector(arg[i]);
break;
case 'c':
half_chop(buf1, arg, buf);
for (i = 0; i < strlen(arg); i++)
showclass |= find_class_bitvector(arg[i]);
break;
default:
send_to_char(PLAYER_FORMAT, ch);
return;
} /* end of switch */
} else { /* endif */
send_to_char(PLAYER_FORMAT, ch);
return;
}
} /* end while (parser) */
send_to_char("\r\nPlayer Search: ", ch);
while (!done) { /* begin while statement */
fread(&player, sizeof(struct char_file_u), 1, fl);
if (feof(fl)) {
fclose(fl);
done=TRUE;
}
/* if (PLR_FLAGGED(?player, PLR_DELETED)) <----- Arrggh
continue;
*/
if (player.level < low || player.level > high)
continue;
if (showclass && !(showclass & (1 << player.chclass)))
continue;
if (showrace && !(showrace & (1 << player.race)))
continue;
if (short_list) {
sprintf(tmp, "%-12.12s%s",
player.name,
((!(++num_found % 4)) ? "\r\n" : ""));
strcat(buf, tmp);
} else {
num_found++;
sprintf(tmp, "%s", player.name);
strcat(buf, tmp);
strcat(buf, "\r\n");
} /* endif shortlist */
}
} /* end of while */
strcat(buf, "\r\n");
if (num_found == 0)
sprintf(tmp, "No players found.\r\n");
else if (num_found == 1)
sprintf(tmp, "One player found.\r\n");
else
sprintf(tmp, "%d players found.\r\n", num_found);
send_to_char(tmp, ch);
page_string(ch->desc, buf, 1);
}
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST