I've got a lot of complaints from players about items disappearing after crashes. This was caused by two bugs, the one I described earlier (about an month ago) and this one: Here's how to reproduce it (I included a fix too): === [ Krys entering game with no equipment. ] > goto krys The Temple Of Midgaard [...] Krys the Apprentice of Magic is standing here. > vnum obj bread 1. [ 10] a waybread [...] > load obj 3010 You create a bread. > Krys gets a bread. > show rent krys krys has no rent file. > show rent krys krys has no rent file. > show rent krys [ 3010] ( 10au) a bread > stat file krys MALE PC 'Krys' IDNum: [ 2], In room [ 0] [...] AFF: NOBITS > show rent krys krys has no rent file. > say doh You say, 'doh' > === There are two ways to fix it, this one seems to be the most clear one: *** Apply this only after applying my previous linkdead-death bugfix! *** === handler.c === -void extract_char(struct char_data *ch) +void extract_char(struct char_data *ch, bool del_crashfile) [...] if (!IS_NPC(ch)) { save_char(ch, NOWHERE); + if (del_crashfile) Crash_delete_crashfile(ch); === handler.h === -void extract_char(struct char_data *ch); +void extract_char(struct char_data *ch, bool del_crashfile); === act.movement.c === if (ROOM_FLAGGED(ch->in_room, ROOM_DEATH) && GET_LEVEL(ch) < LVL_IMMORT) { log_death_trap(ch); death_cry(ch); - extract_char(ch); + extract_char(ch, TRUE); /* Wipe obj file too */ === act.other.c === if (free_rent) Crash_rentsave(ch, 0); -extract_char(ch); +extract_char(ch, TRUE); /* Its safe to call del_crashfile here - if rent was free, player's objfile will remain, otherwise it will be deleted */ === act.wizard.c === ACMD(do_stat) [...] else do_stat_character(ch, victim); - extract_char(victim); + extract_char(victim, FALSE); /* Don't touch obj files */ [...] ACMD(do_vstat) [...] do_stat_character(ch, mob); - extract_char(mob); + extract_char(mob, FALSE); [...] if (!IS_NPC(vict)) { sprintf(buf, "(GC) %s has purged %s.", GET_NAME(ch), GET_NAME(vict)); mudlog(buf, BRF, LVL_GOD, TRUE); } /* Zmey: fixed do_purge+extract_char bug: */ if (!IS_NPC(vict) && vict->desc) { STATE(vict->desc) = CON_CLOSE; vict->desc->character = NULL; vict->desc = NULL; - extract_char(vict); + extract_char(vict, TRUE); /* Extract items and wipe rent file */ free_char(vict); } else extract_char(vict, FALSE); /* Doesn't matter for mobiles */ [...] for (vict = world[ch->in_room].people; vict; vict = next_v) { next_v = vict->next_in_room; if (IS_NPC(vict)) - extract_char(vict); + extract_char(vict, FALSE); === fight.c === void raw_kill(struct char_data * ch) [...] make_corpse(ch); - extract_char(ch); + extract_char(ch, TRUE); /* Purge obj file if exists */ === interpreter.c === /* we've found a duplicate - blow him away, dumping his eq in limbo. */ if (ch->in_room != NOWHERE) char_from_room(ch); char_to_room(ch, 1); - extract_char(ch); + extract_char(ch, TRUE); /* Shall it be FALSE? Imho not */ === limits.c === else Crash_idlesave(ch); sprintf(buf, "%s force-rented and extracted (idle).", GET_NAME(ch)); mudlog(buf, CMP, LVL_GOD, TRUE); - extract_char(ch); + extract_char(ch, FALSE); /* Doesn't matter anyways */ === objsave.c === act("$n helps $N into $S private chamber.", FALSE, recep, 0, ch, TO_N save_room = ch->in_room; - extract_char(ch); + extract_char(ch, FALSE); === Thats all. I copied both messages to bugs@circlemud.org. Zmey // 3MoonsWorld (rmud.net.ru:4000) +------------------------------------------------------------+ | 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