NEWBIE: bug in "who"

zero@baker.cnw.com
Date: 05/16/96


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