It seems that i have messed up my "who" command and im not sure exactly
what i did. If one character is logged on its fine but if two people are
logged in it looks like this:
-=[ Players ]=-
-Ma-Cl-Th-Wa-Ba-
[ 0 55 0 0 0] Kyran one~
[ 0 55 0 0 0] Kyran one~
[57 57 57 57 57] Shaft the Thief
2 characters displayed.
If another logs in after that without either of these quiting it looks
like this:
-=[ Players ]=-
-Ma-Cl-Th-Wa-Ba-
[ 0 0 27 0 0] Ween the Thief
[ 0 0 27 0 0] Ween the Thief
[ 0 55 0 0 0] Kyran one~
[ 0 0 27 0 0] Ween the Thief
[ 0 55 0 0 0] Kyran one~
[57 57 57 57 57] Shaft the Thief
3 characters displayed.
And is after this Kyran logs off its looks like this:
-=[ Players ]=-
-Ma-Cl-Th-Wa-Ba-
[ 0 0 27 0 0] Ween the Thief
[ 0 0 27 0 0] Ween the Thief
[57 57 57 57 57] Shaft the Thief
I thought the mud may be logging a character in more than once for some
reason but users shows the characters fine. I now assume it is something
wrong with the loop that lists characters in do_who but i didnt change
the loop directly (i did change it so it would list the levels for all a
characters classes). Here is my do_who, can some please tell me what i
messed up?
ACMD(do_who)
{
struct descriptor_data *d;
struct char_data *tch;
char name_search[MAX_INPUT_LENGTH];
char mode;
size_t i;
int low = 0, high = LVL_IMPL, localwho = 0, questwho = 0;
int showclass = 0, short_list = 0, outlaws = 0, num_can_see = 0;
int who_room = 0;
skip_spaces(&argument);
strcpy(buf, argument);
name_search[0] = '\0';
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 'o':
case 'k':
outlaws = 1;
strcpy(buf, buf1);
break;
case 'z':
localwho = 1;
strcpy(buf, buf1);
break;
case 's':
short_list = 1;
strcpy(buf, buf1);
break;
case 'q':
questwho = 1;
strcpy(buf, buf1);
break;
case 'l':
half_chop(buf1, arg, buf);
sscanf(arg, "%d-%d", &low, &high);
break;
case 'n':
half_chop(buf1, name_search, buf);
break;
case 'r':
who_room = 1;
strcpy(buf, buf1);
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(WHO_FORMAT, ch);
return;
break;
} /* end of switch */
} else { /* endif */
send_to_char(WHO_FORMAT, ch);
return;
}
} /* end while (parser) */
send_to_char("-=[ Players ]=-\r\n\r\n-Ma-Cl-Th-Wa-Ba-\r\n", ch);
for (d = descriptor_list; d; d = d->next) {
if (d->connected)
continue;
if (d->original)
tch = d->original;
else if (!(tch = d->character))
continue;
if (*name_search && str_cmp(GET_NAME(tch), name_search) &&
!strstr(GET_TITLE(tch), name_search))
continue;
if (!CAN_SEE(ch, tch) || GET_LEVEL(tch) < low || GET_LEVEL(tch) > high)
continue;
if (outlaws && !PLR_FLAGGED(tch, PLR_KILLER) &&
!PLR_FLAGGED(tch, PLR_THIEF))
continue;
if (questwho && !PRF_FLAGGED(tch, PRF_QUEST))
continue;
if (localwho && world[ch->in_room].zone != world[tch->in_room].zone)
continue;
if (who_room && (tch->in_room != ch->in_room))
continue;
if (showclass && !(showclass & (1 << GET_CLASS(tch))))
continue;
if (short_list) {
sprintf(buf, "%s[%2d %2d %2d %2d %2d] %-12.12s%s%s",
IC),
GET_LEVELX(tch, CLASS_THIEF), GET_LEVELX(tch, CLASS_WARRIOR),
GET_LEVELX(tch, CLASS_BARD), GET_NAME(tch),
(GET_LEVEL(tch) >= LVL_IMMORT ? CCNRM(ch, C_SPR) : ""),
((!(++num_can_see % 4)) ? "\r\n" : ""));
send_to_char(buf, ch);
} else {
num_can_see++;
sprintf(buf, "%s[%2d %2d %2d %2d %2d] %s %s", buf,
GET_LEVELX(tch, CLASS_MAGIC_USER), GET_LEVELX(tch, CLASS_CLERIC),
GET_LEVELX(tch, CLASS_THIEF), GET_LEVELX(tch, CLASS_WARRIOR),
GET_LEVELX(tch, CLASS_BARD), GET_NAME(tch),
GET_TITLE(tch));
if (GET_INVIS_LEV(tch))
sprintf(buf, "%s (i%d)", buf, GET_INVIS_LEV(tch));
else if (IS_AFFECTED(tch, AFF_INVISIBLE))
strcat(buf, " (invis)");
if (PLR_FLAGGED(tch, PLR_MAILING))
strcat(buf, " (mailing)");
else if (PLR_FLAGGED(tch, PLR_WRITING))
strcat(buf, " (writing)");
if (PRF_FLAGGED(tch, PRF_DEAF))
strcat(buf, " (deaf)");
if (PRF_FLAGGED(tch, PRF_NOTELL))
strcat(buf, " (notell)");
if (PRF_FLAGGED(tch, PRF_QUEST))
strcat(buf, " (quest)");
if (PLR_FLAGGED(tch, PLR_THIEF))
strcat(buf, " (THIEF)");
if (PLR_FLAGGED(tch, PLR_KILLER))
strcat(buf, " (KILLER)");
if (GET_LEVEL(tch) >= LVL_IMMORT)
strcat(buf, CCNRM(ch, C_SPR));
strcat(buf, "\r\n");
send_to_char(buf, ch);
} /* endif shortlist */
} /* end of for */
if (short_list && (num_can_see % 4))
send_to_char("\r\n", ch);
if (num_can_see == 0)
sprintf(buf, "\r\nNo-one at all!\r\n");
else if (num_can_see == 1)
sprintf(buf, "\r\nOne lonely character displayed.\r\n");
else
sprintf(buf, "\r\n%d characters displayed.\r\n", num_can_see);
send_to_char(buf, ch);
}
Thanks,
Chris
This archive was generated by hypermail 2b30 : 12/18/00 PST