Ok. Awhile back I posted a problem with raw_kill... That wasn't the
problem...
My muds been crashing when someone slays, kills, saves, quits, and some
other times. I've looked into it and what they all have in common is
save_char_obj...
Well heres the function save_char_obj and the function that follows it
(fwrite_char):
[EMAIL PROTECTED]&*([EMAIL PROTECTED]&[EMAIL PROTECTED] CODE BEGINS [EMAIL
PROTECTED]@#$%^&[EMAIL PROTECTED]
/*
* Save a character and inventory.
* Would be cool to save NPC's too for quest purposes,
* some of the infrastructure is provided.
*/
void save_char_obj (CHAR_DATA * ch)
{
char strsave[MAX_INPUT_LENGTH];
FILE *fp;
if (IS_NPC (ch))
return;
/*
* Fix by Edwin. JR -- 10/15/00
*
* Don't save if the character is invalidated.
* This might happen during the auto-logoff of players.
* (or other places not yet found out)
*/
if ( !IS_VALID(ch)) {
bug("save_char_obj: Trying to save an invalidated character.\n",0);
return;
}
if (ch->desc != NULL && ch->desc->original != NULL)
ch = ch->desc->original;
#if defined(unix)
/* create god log */
if (IS_IMMORTAL (ch) || ch->level >= LEVEL_IMMORTAL)
{
fclose (fpReserve);
sprintf (strsave, "%s%c/%s", GOD_DIR, tolower(ch->name[0]),
capitalize (ch->name));
if ((fp = fopen (strsave, "w")) == NULL)
{
bug ("Save_char_obj: fopen", 0);
perror (strsave);
}
fprintf (fp, "Lev %2d Trust %2d %s%s\n",
ch->level, get_trust (ch), ch->name, ch->pcdata->title);
fclose (fp);
fpReserve = fopen (NULL_FILE, "r");
}
#endif
fclose (fpReserve);
sprintf (strsave, "%s%c/%s", PLAYER_DIR, tolower(ch->name[0]),
capitalize (ch->name));
if ((fp = fopen (TEMP_FILE, "w")) == NULL)
{
bug ("Save_char_obj: fopen", 0);
perror (strsave);
}
else
{
fwrite_char (ch, fp);
if (ch->carrying != NULL)
fwrite_obj (ch, ch->carrying, fp, 0);
/* save the pets */
if (ch->pet != NULL && ch->pet->in_room == ch->in_room)
fwrite_pet (ch->pet, fp);
fprintf (fp, "#END\n");
}
fclose (fp);
rename (TEMP_FILE, strsave);
fpReserve = fopen (NULL_FILE, "r");
return;
}
/*
* Write the char.
*/
void fwrite_char (CHAR_DATA * ch, FILE * fp)
{
AFFECT_DATA *paf;
int sn, gn, pos, i;
fprintf (fp, "#%s\n", IS_NPC (ch) ? "MOB" : "PLAYER");
fprintf (fp, "Name %s~\n", ch->name);
fprintf (fp, "Id %ld\n", ch->id);
fprintf (fp, "LogO %ld\n", current_time);
fprintf (fp, "Vers %d\n", 5);
if (ch->email[0] != '\0')
fprintf( fp, "EmA %s~\n", ch->email );
if (ch->short_descr[0] != '\0')
fprintf (fp, "ShD %s~\n", ch->short_descr);
if (ch->long_descr[0] != '\0')
fprintf (fp, "LnD %s~\n", ch->long_descr);
if (ch->description[0] != '\0')
fprintf (fp, "Desc %s~\n", ch->description);
if (ch->prompt != NULL || !str_cmp (ch->prompt, "<[%hH][%mM][%vV]> ")
|| !str_cmp (ch->prompt, "{B<[%hH][%mM][%vV]>{x "))
fprintf (fp, "Prom %s~\n", ch->prompt);
fprintf (fp, "Race %s~\n", pc_race_table[ch->race].name);
if (ch->clan)
fprintf (fp, "Clan %s~\n", clan_table[ch->clan].name);
fprintf (fp, "Sex %d\n", ch->sex);
fprintf (fp, "Cla %d\n", ch->class);
fwrite_rle(ch->pcdata->explored, fp);
fprintf( fp, "Bp %d\n", ch->bp_points );
fprintf(fp, "Hmtown %d\n", ch->hometown);
fprintf (fp, "Levl %d\n", ch->level);
if (ch->trust != 0)
fprintf (fp, "Tru %d\n", ch->trust);
fprintf (fp, "Sec %d\n", ch->pcdata->security); /* OLC */
fprintf (fp, "Plyd %d\n", ch->played + (int) (current_time -
ch->logon));
fprintf (fp, "Scro %d\n", ch->lines);
fprintf (fp, "Room %d\n", (ch->in_room == get_room_index
(ROOM_VNUM_LIMBO)
&& ch->was_in_room != NULL)
? ch->was_in_room->vnum
: ch->in_room == NULL ? 3001 : ch->in_room->vnum);
if (ch->questpoints != 0)
fprintf( fp, "QuestPnts %d\n", ch->questpoints );
if (ch->nextquest != 0)
fprintf( fp, "QuestNext %d\n", ch->nextquest );
else if (ch->countdown != 0)
fprintf( fp, "QuestNext %d\n", 10 );
fprintf (fp, "HMV %d %d %d %d %d %d\n",
ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move,
ch->max_move);
if (ch->gold > 0)
fprintf (fp, "Gold %ld\n", ch->gold);
else
fprintf (fp, "Gold %d\n", 0);
if (ch->silver > 0)
fprintf (fp, "Silv %ld\n", ch->silver);
else
fprintf (fp, "Silv %d\n", 0);
fprintf (fp, "Exp %d\n", ch->exp);
if (ch->act != 0)
fprintf (fp, "Act %s\n", print_flags (ch->act));
if (ch->affected_by != 0)
fprintf (fp, "AfBy %s\n", print_flags (ch->affected_by));
fprintf (fp, "Comm %s\n", print_flags (ch->comm));
if (ch->wiznet)
fprintf (fp, "Wizn %s\n", print_flags (ch->wiznet));
if (ch->info)
fprintf( fp, "Info %s\n", print_flags(ch->info));
if (ch->invis_level)
fprintf (fp, "Invi %d\n", ch->invis_level);
if (ch->incog_level)
fprintf (fp, "Inco %d\n", ch->incog_level);
fprintf (fp, "Pos %d\n",
ch->position == POS_FIGHTING ? POS_STANDING : ch->position);
if (ch->practice != 0)
fprintf (fp, "Prac %d\n", ch->practice);
if (ch->train != 0)
fprintf (fp, "Trai %d\n", ch->train);
if (ch->saving_throw != 0)
fprintf (fp, "Save %d\n", ch->saving_throw);
fprintf (fp, "Alig %d\n", ch->alignment);
if (ch->hitroll != 0)
fprintf (fp, "Hit %d\n", ch->hitroll);
if (ch->damroll != 0)
fprintf (fp, "Dam %d\n", ch->damroll);
fprintf (fp, "ACs %d %d %d %d\n",
ch->armor[0], ch->armor[1], ch->armor[2], ch->armor[3]);
if (ch->wimpy != 0)
fprintf (fp, "Wimp %d\n", ch->wimpy);
fprintf (fp, "Attr %d %d %d %d %d\n",
ch->perm_stat[STAT_STR],
ch->perm_stat[STAT_INT],
ch->perm_stat[STAT_WIS],
ch->perm_stat[STAT_DEX], ch->perm_stat[STAT_CON]);
fprintf (fp, "AMod %d %d %d %d %d\n",
ch->mod_stat[STAT_STR],
ch->mod_stat[STAT_INT],
ch->mod_stat[STAT_WIS],
ch->mod_stat[STAT_DEX], ch->mod_stat[STAT_CON]);
if (IS_NPC (ch))
{
fprintf (fp, "Vnum %d\n", ch->pIndexData->vnum);
}
else
{
fprintf (fp, "Pass %s~\n", ch->pcdata->pwd);
if (ch->pcdata->bamfin[0] != '\0')
fprintf (fp, "Bin %s~\n", ch->pcdata->bamfin);
if (ch->pcdata->bamfout[0] != '\0')
fprintf (fp, "Bout %s~\n", ch->pcdata->bamfout);
fprintf( fp, "Balance %d\n",
ch->pcdata->balance );
fprintf( fp, "Shares %d\n",
ch->pcdata->shares );
fprintf (fp, "Titl %s~\n", ch->pcdata->title);
fprintf (fp, "Pnts %d\n", ch->pcdata->points);
fprintf (fp, "TSex %d\n", ch->pcdata->true_sex);
fprintf (fp, "LLev %d\n", ch->pcdata->last_level);
fprintf (fp, "HMVP %d %d %d\n", ch->pcdata->perm_hit,
ch->pcdata->perm_mana, ch->pcdata->perm_move);
fprintf (fp, "Cnd %d %d %d %d\n",
ch->pcdata->condition[0],
ch->pcdata->condition[1],
ch->pcdata->condition[2], ch->pcdata->condition[3]);
/*
* Write Colour Config Information.
*/
fprintf (fp, "Coloura %d%d%d %d%d%d %d%d%d %d%d%d %d%d%d\n",
ch->pcdata->text[2],
ch->pcdata->text[0],
ch->pcdata->text[1],
ch->pcdata->auction[2],
ch->pcdata->auction[0],
ch->pcdata->auction[1],
ch->pcdata->gossip[2],
ch->pcdata->gossip[0],
ch->pcdata->gossip[1],
ch->pcdata->music[2],
ch->pcdata->music[0],
ch->pcdata->music[1],
ch->pcdata->question[2],
ch->pcdata->question[0], ch->pcdata->question[1]);
fprintf (fp, "Colourb %d%d%d %d%d%d %d%d%d %d%d%d %d%d%d\n",
ch->pcdata->answer[2],
ch->pcdata->answer[0],
ch->pcdata->answer[1],
ch->pcdata->quote[2],
ch->pcdata->quote[0],
ch->pcdata->quote[1],
ch->pcdata->quote_text[2],
ch->pcdata->quote_text[0],
ch->pcdata->quote_text[1],
ch->pcdata->immtalk_text[2],
ch->pcdata->immtalk_text[0],
ch->pcdata->immtalk_text[1],
ch->pcdata->immtalk_type[2],
ch->pcdata->immtalk_type[0],
ch->pcdata->immtalk_type[1]);
fprintf (fp, "Colourc %d%d%d %d%d%d %d%d%d %d%d%d %d%d%d\n",
ch->pcdata->info[2],
ch->pcdata->info[0],
ch->pcdata->info[1],
ch->pcdata->tell[2],
ch->pcdata->tell[0],
ch->pcdata->tell[1],
ch->pcdata->reply[2],
ch->pcdata->reply[0],
ch->pcdata->reply[1],
ch->pcdata->gtell_text[2],
ch->pcdata->gtell_text[0],
ch->pcdata->gtell_text[1],
ch->pcdata->gtell_type[2],
ch->pcdata->gtell_type[0], ch->pcdata->gtell_type[1]);
fprintf (fp, "Colourd %d%d%d %d%d%d %d%d%d %d%d%d %d%d%d\n",
ch->pcdata->room_title[2],
ch->pcdata->room_title[0],
ch->pcdata->room_title[1],
ch->pcdata->room_text[2],
ch->pcdata->room_text[0],
ch->pcdata->room_text[1],
ch->pcdata->room_exits[2],
ch->pcdata->room_exits[0],
ch->pcdata->room_exits[1],
ch->pcdata->room_things[2],
ch->pcdata->room_things[0],
ch->pcdata->room_things[1],
ch->pcdata->prompt[2],
ch->pcdata->prompt[0], ch->pcdata->prompt[1]);
fprintf (fp, "Coloure %d%d%d %d%d%d %d%d%d %d%d%d %d%d%d\n",
ch->pcdata->fight_death[2],
ch->pcdata->fight_death[0],
ch->pcdata->fight_death[1],
ch->pcdata->fight_yhit[2],
ch->pcdata->fight_yhit[0],
ch->pcdata->fight_yhit[1],
ch->pcdata->fight_ohit[2],
ch->pcdata->fight_ohit[0],
ch->pcdata->fight_ohit[1],
ch->pcdata->fight_thit[2],
ch->pcdata->fight_thit[0],
ch->pcdata->fight_thit[1],
ch->pcdata->fight_skill[2],
ch->pcdata->fight_skill[0], ch->pcdata->fight_skill[1]);
fprintf (fp, "Colourf %d%d%d %d%d%d %d%d%d %d%d%d %d%d%d\n",
ch->pcdata->wiznet[2],
ch->pcdata->wiznet[0],
ch->pcdata->wiznet[1],
ch->pcdata->say[2],
ch->pcdata->say[0],
ch->pcdata->say[1],
ch->pcdata->say_text[2],
ch->pcdata->say_text[0],
ch->pcdata->say_text[1],
ch->pcdata->tell_text[2],
ch->pcdata->tell_text[0],
ch->pcdata->tell_text[1],
ch->pcdata->reply_text[2],
ch->pcdata->reply_text[0], ch->pcdata->reply_text[1]);
fprintf (fp, "Colourg %d%d%d %d%d%d %d%d%d %d%d%d %d%d%d\n",
ch->pcdata->auction_text[2],
ch->pcdata->auction_text[0],
ch->pcdata->auction_text[1],
ch->pcdata->gossip_text[2],
ch->pcdata->gossip_text[0],
ch->pcdata->gossip_text[1],
ch->pcdata->music_text[2],
ch->pcdata->music_text[0],
ch->pcdata->music_text[1],
ch->pcdata->question_text[2],
ch->pcdata->question_text[0],
ch->pcdata->question_text[1],
ch->pcdata->answer_text[2],
ch->pcdata->answer_text[0], ch->pcdata->answer_text[1]);
fprintf( fp, "Incr %d\n",
ch->pcdata->incarnations );
/* write alias */
for (pos = 0; pos < MAX_ALIAS; pos++)
{
if (ch->pcdata->alias[pos] == NULL
|| ch->pcdata->alias_sub[pos] == NULL)
break;
fprintf (fp, "Alias %s %s~\n", ch->pcdata->alias[pos],
ch->pcdata->alias_sub[pos]);
}
/* Save note board status */
/* Save number of boards in case that number changes */
fprintf (fp, "Boards %d ", MAX_BOARD);
for (i = 0; i < MAX_BOARD; i++)
fprintf (fp, "%s %ld ", boards[i].short_name,
ch->pcdata->last_note[i]);
fprintf (fp, "\n");
for (sn = 0; sn < MAX_SKILL; sn++)
{
if (skill_table[sn].name != NULL && ch->pcdata->learned[sn] >
0)
{
fprintf (fp, "Sk %d '%s'\n",
ch->pcdata->learned[sn], skill_table[sn].name);
}
}
for (gn = 0; gn < MAX_GROUP; gn++)
{
if (group_table[gn].name != NULL &&
ch->pcdata->group_known[gn])
{
fprintf (fp, "Gr '%s'\n", group_table[gn].name);
}
}
}
for (paf = ch->affected; paf != NULL; paf = paf->next)
{
if (paf->type < 0 || paf->type >= MAX_SKILL)
continue;
fprintf (fp, "Affc '%s' %3d %3d %3d %3d %3d %10d\n",
skill_table[paf->type].name,
paf->where,
paf->level,
paf->duration, paf->modifier, paf->location,
paf->bitvector);
}
#ifdef I3
i3save_char( ch, fp );
#endif
fprintf (fp, "End\n\n");
return;
}
[EMAIL PROTECTED]@[EMAIL PROTECTED] CODE ENDS [EMAIL PROTECTED]@[EMAIL
PROTECTED]
Anyone see ANYTHING funny? If so please help.
I really do thank everyone in advance... without this list i'd have to
start my entire mud over that I've spent so much time on...
I would provide more info, but I would be stuck as to what to give.
Thanks in advance,
Oz