Hello, I'm writing this as a last resort, I've spent a day trying to figure it out, and also let some other people see my code to try and figure it out. Nobody can find a thing. Heres the scenario: I've made changes to the who screen similar to the patch that is at the circle ftp site. I just found this problem yesterday. It seems that whenever there are more than 2 gods on, like 3, and somebody types who, the mud just crashes with a segmentation fault. I can't imagine what would be causing the problem. I am including my do_who function although i do not thing the problem lies here. If anybody thinks they have an idea of what could be causing the crash, I'd really appreciate it. Here is code... #define WHO_FORMAT \ "format: who [minlev[-maxlev]] [-n name] [-c classes] [-rzqimo]\r\n" ACMD(do_who) { struct descriptor_data *d; struct char_data *wch; char wiz_buf[MAX_INPUT_LENGTH]; char player_buf[MAX_INPUT_LENGTH]; char name_search[MAX_INPUT_LENGTH+1]; char mode; size_t i; int low = 0, high = LVL_IMPL, showclass = 0; bool who_room = FALSE, who_zone = FALSE, who_quest = 0; int num_wiz = 0, num_players = 0; bool outlaws = FALSE, noimm = FALSE, nomort = FALSE; const char *WizAbbr[LVL_IMPL - (LVL_IMMORT-2)] = { "\\c02QuESToR\\c00", "\\c02BuILDeR\\c00", "\\c02 CoDeR \\c00", "\\c02HeaDImP\\c00", "\null" }; 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 = TRUE; strcpy(buf, buf1); break; case 'z': who_zone = TRUE; strcpy(buf, buf1); break; case 'q': who_quest = TRUE; 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 = TRUE; 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; case 'i': nomort = TRUE; strcpy(buf, buf1); break; case 'm': noimm = TRUE; strcpy(buf, buf1); 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) */ strcpy(wiz_buf, "\\c04W\\c06i\\c04z\\c06a\\c04r\\c06d\\c04s\\c00\r\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r\n"); strcpy(player_buf, "\\c04P\\c06l\\c04a\\c06y\\c04e\\c06r\\c04s\\c00\r\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r\n"); for (d = descriptor_list; d; d = d->next) { if (d->connected) continue; if (d->original) wch = d->original; else if (!(wch = d->character)) continue; if (!CAN_SEE(ch, wch)) continue; if (GET_LEVEL(wch) < low || GET_LEVEL(wch) > high) continue; if ((noimm && GET_LEVEL(wch) >= LVL_IMMORT) || (nomort && GET_LEVEL(wch) < LVL_IMMORT)) continue; if (*name_search && str_cmp(GET_NAME(wch), name_search) && !strstr(GET_TITLE(wch), name_search)) continue; if (outlaws && !PLR_FLAGGED(wch, PLR_KILLER) && !PLR_FLAGGED(wch, PLR_THIEF)) continue; if (who_quest && !PRF_FLAGGED(wch, PRF_QUEST)) continue; if (who_zone && world[ch->in_room].zone != world[wch->in_room].zone) continue; if (who_room && (wch->in_room != ch->in_room)) continue; if (showclass && !(showclass & (1 << GET_CLASS(wch)))) continue; if (GET_LEVEL(wch) >= LVL_IMMORT) { sprintf(wiz_buf, "%s%s[%s] \\c11%s\\c14 %s\\c00", wiz_buf, CCWHT(ch, C_SPR), WizAbbr[GET_LEVEL(wch) - LVL_IMMORT],GET_NAME(wch), GET_TITLE(wch)); num_wiz++; } else { sprintf(player_buf, "%s%s[%d %s %s] \\c11%s\\c14 %s\\c00", player_buf, CCWHT(ch, C_SPR), GET_LEVEL(wch), CLASS_ABBR(wch), RACE_ABBR(wch), GET_NAME(wch), GET_TITLE(wch)); num_players++; } *buf = '\0'; if (GET_INVIS_LEV(wch)) sprintf(buf, "%s (i%d)", buf, GET_INVIS_LEV(wch)); else if (IS_AFFECTED(wch, AFF_INVISIBLE)) strcat(buf, " (invis)"); if (PLR_FLAGGED(wch, PLR_MAILING)) strcat(buf, " (mailing)"); else if (PLR_FLAGGED(wch, PLR_WRITING)) strcat(buf, " (writing)"); if (PRF_FLAGGED(wch, PRF_DEAF)) strcat(buf, " (deaf)"); if (PRF_FLAGGED(wch, PRF_NOTELL)) strcat(buf, " (notell)"); if (PRF_FLAGGED(wch, PRF_QUEST)) strcat(buf, " (quest)"); if (PLR_FLAGGED(wch, PLR_THIEF)) strcat(buf, " (THIEF)"); if (PLR_FLAGGED(wch, PLR_KILLER)) strcat(buf, " (KILLER)"); if (GET_LEVEL(wch) >= LVL_IMMORT) strcat(buf, CCNRM(ch, C_SPR)); strcat(buf, "\r\n"); if (GET_LEVEL(wch) >= LVL_IMMORT) strcat(wiz_buf, buf); else strcat(player_buf, buf); } /* end of for */ if (num_wiz) { page_string(ch->desc, wiz_buf, 0); send_to_char("\r\n", ch); } if (num_players) { page_string(ch->desc, player_buf, 0); send_to_char("\r\n", ch); } if ((num_wiz+num_players) == 0) strcpy(buf, "There are currently no Wizards, or Players visible to you.\r\n"); if (num_wiz) sprintf(buf, "There %s %d Wizard%s%s", (num_wiz == 1 ? "is" : "are"), num_wiz, (num_wiz == 1 ? "" : "s"), (num_players ? " and there" : ".")); if (num_players) sprintf(buf, "%s %s %d visible player%s.", (num_wiz ? buf : "There"), (num_players == 1 ? "is" : "are"), num_players, (num_players == 1 ? "" : "s")); strcat(buf, "\r\n"); send_to_char(buf, ch); } +-----------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://cspo.queensu.ca/~fletcher/Circle/list_faq.html | | Or send 'info circle' to majordomo@cspo.queensu.ca | +-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST