/**************************************************************************** * ^ +----- | / ^ ^ | | +-\ * * / \ | | / |\ /| | | | \ * * / \ +--- |< | \ / | | | | | * * /-----\ | | \ | v | | | | / * * / \ | | \ | | +-----+ +-/ * **************************************************************************** * AFKMud Copyright 1997-2002 Alsherok. Contributors: Samson, Dwip, Whir, * * Cyberfox, Karangi, Rathian, Cam, Raine, and Tarl. * * * * Original SMAUG 1.4a written by Thoric (Derek Snider) with Altrag, * * Blodkai, Haus, Narn, Scryn, Swordbearer, Tricops, Gorog, Rennard, * * Grishnakh, Fireblade, and Nivek. * * * * Original MERC 2.1 code by Hatchet, Furey, and Kahn. * * * * Original DikuMUD code by: Hans Staerfeldt, Katja Nyboe, Tom Madsen, * * Michael Seifert, and Sebastian Hammer. * **************************************************************************** * Finger and Wizinfo Module * ****************************************************************************/ /****************************************************** Additions and changes by Edge of Acedia Rewritten do_finger to better handle info of offline players. E-mail: nevesfirestar2002@yahoo.com ******************************************************/ #include <ctype.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> #include <time.h> #include "mud.h" #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } /* Begin wizinfo stuff - Samson 6-6-99 */ bool check_parse_name args( ( char *name, bool newchar ) ); WIZINFO_DATA *first_wizinfo; WIZINFO_DATA *last_wizinfo; /* Construct wizinfo list from god dir info - Samson 6-6-99 */ void add_to_wizinfo( char *name, WIZINFO_DATA * wiz ) { WIZINFO_DATA *wiz_prev; wiz->name = str_dup( name ); if( !wiz->email ) wiz->email = str_dup( "Not Set" ); for( wiz_prev = first_wizinfo; wiz_prev; wiz_prev = wiz_prev->next ) if( strcasecmp( wiz_prev->name, name ) >= 0 ) break; if( !wiz_prev ) LINK( wiz, first_wizinfo, last_wizinfo, next, prev ); else INSERT( wiz, wiz_prev, first_wizinfo, next, prev ); return; } void clear_wizinfo( bool bootup ) { WIZINFO_DATA *wiz, *next; if( !bootup ) { for( wiz = first_wizinfo; wiz; wiz = next ) { next = wiz->next; UNLINK( wiz, first_wizinfo, last_wizinfo, next, prev ); DISPOSE( wiz->name ); DISPOSE( wiz->email ); DISPOSE( wiz ); } } first_wizinfo = NULL; last_wizinfo = NULL; return; } void fread_info( WIZINFO_DATA * wiz, FILE * fp ) { char *word; bool fMatch; for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'E': KEY( "Email", wiz->email, fread_string_nohash( fp ) ); if( !str_cmp( word, "End" ) ) return; break; case 'I': KEY( "ICQ", wiz->icq, fread_number( fp ) ); break; case 'L': KEY( "Level", wiz->level, fread_number( fp ) ); break; } if( !fMatch ) fread_to_eol( fp ); } } void build_wizinfo( bool bootup ) { DIR *dp; struct dirent *dentry; FILE *fp; WIZINFO_DATA *wiz; char buf[MAX_STRING_LENGTH]; clear_wizinfo( bootup ); /* Clear out the table before rebuilding a new one */ dp = opendir( GOD_DIR ); dentry = readdir( dp ); while( dentry ) { /* * Added by Tarl 3 Dec 02 because we are now using CVS */ if( !str_cmp( dentry->d_name, "CVS" ) ) { dentry = readdir( dp ); continue; } if( dentry->d_name[0] != '.' ) { sprintf( buf, "%s%s", GOD_DIR, dentry->d_name ); fp = fopen( buf, "r" ); if( fp ) { CREATE( wiz, WIZINFO_DATA, 1 ); fread_info( wiz, fp ); add_to_wizinfo( dentry->d_name, wiz ); FCLOSE( fp ); } } dentry = readdir( dp ); } closedir( dp ); return; } /* * Wizinfo information. * Added by Samson on 6-6-99 */ void do_wizinfo( CHAR_DATA * ch, char *argument ) { WIZINFO_DATA *wiz; char buf[MAX_STRING_LENGTH]; send_to_pager( "Contact Information for the Immortals:\n\r\n\r", ch ); send_to_pager( "Name Email Address ICQ#\n\r", ch ); send_to_pager( "------------+---------------------------------+----------\n\r", ch ); for( wiz = first_wizinfo; wiz; wiz = wiz->next ) { if( !str_cmp( wiz->name, "normed" ) ) continue; sprintf( buf, "%-12s %-33s %10d", wiz->name, wiz->email, wiz->icq ); strcat( buf, "\n\r" ); send_to_pager( buf, ch ); } return; } /* End wizinfo stuff - Samson 6-6-99 */ /* Finger snippet courtesy of unknown author. Installed by Samson 4-6-98 */ /* File read/write code redone using standard Smaug I/O routines - Samson 9-12-98 */ /* Data gathering now done via the pfiles, eliminated separate finger files - Samson 12-21-98 */ /* Improvements for offline players by Edge of Acedia 8-26-03 */ /* Further refined by Samson on 8-26-03 */ //Added extra Immortal info to finger so whois is now invalid -Karn //Added clan support -Karn 12.13.05 void do_finger( CHAR_DATA * ch, char *argument ) { CHAR_DATA *victim = NULL; CMDTYPE *command; ROOM_INDEX_DATA *temproom, *original = NULL; int level = LEVEL_IMMORTAL; char buf[MAX_STRING_LENGTH], fingload[MAX_INPUT_LENGTH]; struct stat fst; char *laston = NULL; bool loaded = FALSE, skip = FALSE; char buf2[MAX_STRING_LENGTH]; if( IS_NPC( ch ) ) { send_to_char( "Mobs can't use the finger command.\n\r", ch ); return; } if( !argument || argument[0] == '\0' ) { send_to_char( "Finger whom?\n\r", ch ); return; } sprintf( buf, "0.%s", argument ); /* * If player is online, check for fingerability (yeah, I coined that one) -Edge */ if( ( victim = get_char_world( ch, buf ) ) != NULL ) { if( IS_SET( victim->pcdata->flags, PCFLAG_PRIVACY ) && !IS_IMMORTAL( ch ) ) { ch_printf( ch, "%s has privacy enabled.\n\r", victim->name ); return; } if( IS_IMMORTAL( victim ) && !IS_IMMORTAL( ch ) ) { send_to_char( "You cannot finger an immortal.\n\r", ch ); return; } } /* * Check for offline players - Edge */ else { DESCRIPTOR_DATA *d; sprintf( fingload, "%s%c/%s", PLAYER_DIR, tolower( argument[0] ), capitalize( argument ) ); /* * Bug fix here provided by Senir to stop /dev/null crash */ if( stat( fingload, &fst ) == -1 || !check_parse_name( capitalize( argument ), FALSE ) || !str_cmp( argument, "normed" ) ) { ch_printf( ch, "&YNo such player named '%s'.\n\r", argument ); return; } /* * laston = ctime( &fst.st_mtime ); */ temproom = get_room_index( ROOM_VNUM_LIMBO ); if( !temproom ) { bug( "%s", "do_finger: Limbo room is not available!" ); send_to_char( "Fatal error, report to the immortals.\n\r", ch ); return; } CREATE( d, DESCRIPTOR_DATA, 1 ); d->next = NULL; d->prev = NULL; d->connected = CON_GET_NAME; d->outsize = 2000; CREATE( d->outbuf, char, d->outsize ); argument[0] = UPPER( argument[0] ); loaded = load_char_obj( d, argument, FALSE ); /* Remove second FALSE if compiler complains */ LINK( d->character, first_char, last_char, next, prev ); original = d->character->in_room; char_to_room( d->character, temproom ); victim = d->character; /* Hopefully this will work, if not, we're SOL */ d->character->desc = NULL; d->character = NULL; DISPOSE( d->outbuf ); DISPOSE( d ); /* * Link dead check? Was crashing on "IP Info" line below * * hopefully this will fix it. -Goku 10.11.03 */ if( !victim->desc ) loaded = FALSE; if( IS_SET( victim->pcdata->flags, PCFLAG_PRIVACY ) && !IS_IMMORTAL( ch ) ) { ch_printf( ch, "%s has privacy enabled.\n\r", victim->name ); skip = TRUE; } if( IS_IMMORTAL( victim ) && !IS_IMMORTAL( ch ) ) { ch_printf( ch, "%s has privacy enabled.\n\r", victim->name ); skip = TRUE; } loaded = TRUE; } if( !skip ) { send_to_char( "&w Finger Info\n\r", ch ); send_to_char( " -----------\n\r", ch ); ch_printf( ch, "&wName : &G%-20s &wMUD Age: &G%d\n\r", victim->name, get_newage( victim ) ); ch_printf( ch, "&wRank : &G%-20s &wRace : &G%s\n\r", get_rank( victim ), capitalize( get_race( victim ) ) ); ch_printf( ch, "&wSex : &G%-20s &wAuth'd : &G%s\n\r", victim->sex == SEX_MALE ? "Male" : victim->sex == SEX_FEMALE ? "Female" : "Neutral", victim->pcdata->authed_by == NULL ? "Yes" : "No" ); ch_printf( ch, "&wTitle : &G%s\n\r", victim->pcdata->title ); if( victim->pcdata->clan != NULL ) ch_printf( ch, "&wClan : &G%s\n\r", victim->pcdata->clan->name ); ch_printf( ch, "&wHomepage: &G%s\n\r", victim->pcdata->homepage != NULL ? victim->pcdata->homepage : "Not specified" ); ch_printf( ch, "&wEmail : &G%s\n\r", victim->pcdata->email != NULL ? victim->pcdata->email : "Not specified" ); ch_printf( ch, "&wICQ# : &G%d\n\r", victim->pcdata->icq ); if( loaded /*&& victim->level < 50*/ ) ch_printf( ch, "&wLast on : &G%s\n\r", ctime( &victim->pcdata->lastlogon ) ); else ch_printf( ch, "&wLast on : &GCurrently Online\n\n\r", laston ); if( IS_IMMORTAL( ch ) ) { send_to_char( "&wImmortal Information\n\r", ch ); send_to_char( "--------------------\n\r", ch ); pager_printf_color( ch, "&wPlayer Level : &G%d\n\r", victim->level ); ch_printf( ch, "&wTime played : &G%ld hours\n\r", ( long int )GET_TIME_PLAYED( victim ) ); ch_printf( ch, "&wAuthorized by : &G%s\n\r", victim->pcdata->authed_by ? victim->pcdata->authed_by : ( sysdata. WAIT_FOR_AUTH ? "Not Authed" : "The Code" ) ); ch_printf( ch, "&wRP Points : &G%d/%d\n\r", victim->pcdata->quest_curr, victim->pcdata->quest_accum ); ch_printf( ch, "&wPrivacy Status: &G%s&D\n\r", IS_SET( victim->pcdata->flags, PCFLAG_PRIVACY ) ? "Enabled" : "Disabled" ); if( is_android( victim ) || is_superandroid( victim ) ) pager_printf( ch, "Base Techlevel: &G%s&D\n\r", num_punct_ld( victim->exp ) ); else pager_printf( ch, "Base Powerlevl: &G%s&D\n\r", num_punct_ld( victim->exp ) ); if( ch->level >= 55 ) { if( victim->desc && victim->desc->host[0] != '\0' ) //Online IP Check - Karn 5.21.05 { sprintf( buf2, "Ip Address : &G%s&Y ", victim->desc->host ); if( get_trust( ch ) >= LEVEL_GOD ) strcat( buf2, victim->desc->user ); strcat( buf2, "&D\n\r" ); send_to_pager( buf2, ch ); } if( !victim->desc ) //Offline IP Check - Karn & Geh 5.21.05 { sprintf( buf2, "Ip Address : &G%s&Y (Offline)", victim->pcdata->lasthost ); strcat( buf2, "&D\n\r" ); send_to_pager( buf2, ch ); } } if( IS_SET( victim->fusionflags, FUSION_STASIS ) ) pager_printf( ch, "&R%s is PWNT!!!&D\n\r", victim->name ); else pager_printf( ch, "&G%s is Safe.&D\n\r", victim->name ); pager_printf( ch, "%s is %shelled at the moment.\n\r", victim->sex == SEX_MALE ? "He" : victim->sex == SEX_FEMALE ? "She" : "It", ( victim->pcdata->release_date == 0 ) ? "not " : "" ); if( victim->pcdata->release_date != 0 ) pager_printf( ch, "%s was helled by %s, and will be released on %24.24s.\n\r", victim->sex == SEX_MALE ? "He" : victim->sex == SEX_FEMALE ? "She" : "It", victim->pcdata->helled_by, ctime( &victim->pcdata->release_date ) ); if( victim->pcdata->silence != 0 ) { pager_printf( ch, "%s was silenced by %s for %d minutes.\n\r", victim->sex == SEX_MALE ? "He" : victim->sex == SEX_FEMALE ? "She" : "It", victim->pcdata->silencedby, victim->pcdata->silence ); } if( xIS_SET( victim->act, PLR_SILENCE ) || xIS_SET( victim->act, PLR_NO_EMOTE ) || xIS_SET( victim->act, PLR_NO_TELL ) || xIS_SET( victim->act, PLR_THIEF ) || xIS_SET( victim->act, PLR_KILLER ) ) { sprintf( buf2, "This player has the following flags set:" ); if( xIS_SET( victim->act, PLR_SILENCE ) ) strcat( buf2, " silence" ); if( xIS_SET( victim->act, PLR_NO_EMOTE ) ) strcat( buf2, " noemote" ); if( xIS_SET( victim->act, PLR_NO_TELL ) ) strcat( buf2, " notell" ); if( xIS_SET( victim->act, PLR_THIEF ) ) strcat( buf2, " thief" ); if( xIS_SET( victim->act, PLR_KILLER ) ) strcat( buf2, " killer" ); strcat( buf2, ".\n\r" ); send_to_pager( buf2, ch ); } if( victim->level < ch->level ) { /* * Added by Tarl 19 Dec 02 to remove Huh? when ch not high enough to view comments. */ command = find_command( "comment" ); if( !command ) level = LEVEL_IMMORTAL; else level = command->level; if( ch->level >= command->level ) { sprintf( buf, "comment list %s", victim->name ); interpret( ch, buf ); } pager_printf( ch, "\n\r" ); } } pager_printf_color( ch, "&wBio:\n\r&G%s\n\r", victim->pcdata->bio ? victim->pcdata->bio : "Not created" ); pager_printf_color( ch, "\n\r&wDescription:\n\r&G%s\n\r", victim->description ? victim->description : "Not created" ); } if( loaded ) { int x, y; char_from_room( victim ); char_to_room( victim, original ); quitting_char = victim; /* * save_char_obj( victim ); */ if( sysdata.save_pets && victim->pcdata->pet ) extract_char( victim->pcdata->pet, TRUE ); saving_char = NULL; /* * After extract_char the ch is no longer valid! */ extract_char( victim, TRUE ); for( x = 0; x < MAX_WEAR; x++ ) for( y = 0; y < MAX_LAYERS; y++ ) save_equipment[x][y] = NULL; } return; } /* Added a clone of homepage to let players input their email addy - Samson 4-18-98 */ void do_email( CHAR_DATA * ch, char *argument ) { char buf[MAX_STRING_LENGTH]; if( IS_NPC( ch ) ) return; if( argument[0] == '\0' ) { if( !ch->pcdata->email ) ch->pcdata->email = str_dup( "" ); ch_printf( ch, "Your email address is: %s\n\r", show_tilde( ch->pcdata->email ) ); return; } if( !str_cmp( argument, "clear" ) ) { if( ch->pcdata->email ) DISPOSE( ch->pcdata->email ); ch->pcdata->email = str_dup( "" ); if( IS_IMMORTAL( ch ) ); { save_char_obj( ch ); build_wizinfo( FALSE ); } send_to_char( "Email address cleared.\n\r", ch ); return; } strcpy( buf, argument ); if( strlen( buf ) > 70 ) buf[70] = '\0'; hide_tilde( buf ); if( ch->pcdata->email ) DISPOSE( ch->pcdata->email ); ch->pcdata->email = str_dup( buf ); if( IS_IMMORTAL( ch ) ); { save_char_obj( ch ); build_wizinfo( FALSE ); } send_to_char( "Email address set.\n\r", ch ); } void do_icq_number( CHAR_DATA * ch, char *argument ) { int icq; if( IS_NPC( ch ) ) return; if( argument[0] == '\0' ) { if( !ch->pcdata->icq ) ch->pcdata->icq = 0; ch_printf( ch, "Your ICQ# is: %d\n\r", ch->pcdata->icq ); return; } if( !str_cmp( argument, "clear" ) ) { ch->pcdata->icq = 0; if( IS_IMMORTAL( ch ) ); { save_char_obj( ch ); build_wizinfo( FALSE ); } send_to_char( "ICQ# cleared.\n\r", ch ); return; } if( !is_number( argument ) ) { send_to_char( "You must enter numeric data.\n\r", ch ); return; } icq = atoi( argument ); if( icq < 1 ) { send_to_char( "Valid range is greater than 0.\n\r", ch ); return; } ch->pcdata->icq = icq; if( IS_IMMORTAL( ch ) ); { save_char_obj( ch ); build_wizinfo( FALSE ); } send_to_char( "ICQ# set.\n\r", ch ); return; } void do_homepage( CHAR_DATA * ch, char *argument ) { char buf[MAX_STRING_LENGTH]; if( IS_NPC( ch ) ) return; if( !argument || argument[0] == '\0' ) { if( !ch->pcdata->homepage ) ch->pcdata->homepage = str_dup( "" ); ch_printf( ch, "Your homepage is: %s\n\r", show_tilde( ch->pcdata->homepage ) ); return; } if( !str_cmp( argument, "clear" ) ) { if( ch->pcdata->homepage ) DISPOSE( ch->pcdata->homepage ); ch->pcdata->homepage = str_dup( "" ); send_to_char( "Homepage cleared.\n\r", ch ); return; } if( strstr( argument, "://" ) ) strcpy( buf, argument ); else sprintf( buf, "http://%s", argument ); if( strlen( buf ) > 70 ) buf[70] = '\0'; hide_tilde( buf ); if( ch->pcdata->homepage ) DISPOSE( ch->pcdata->homepage ); ch->pcdata->homepage = str_dup( buf ); send_to_char( "Homepage set.\n\r", ch ); } void do_privacy( CHAR_DATA * ch, char *argument ) { if( IS_NPC( ch ) ) { send_to_char( "Mobs can't use the privacy toggle.\n\r", ch ); return; } TOGGLE_BIT( ch->pcdata->flags, PCFLAG_PRIVACY ); if( IS_SET( ch->pcdata->flags, PCFLAG_PRIVACY ) ) { send_to_char( "Privacy flag enabled.\n\r", ch ); return; } else { send_to_char( "Privacy flag disabled.\n\r", ch ); return; } } /* * basicly a copy of do_finger but checks pfiles in the backup dir -Goku 09.29.04 */ void do_backfinger( CHAR_DATA * ch, char *argument ) { CHAR_DATA *victim = NULL; CMDTYPE *command; ROOM_INDEX_DATA *temproom, *original = NULL; int level = LEVEL_IMMORTAL; char buf[MAX_STRING_LENGTH], fingload[MAX_INPUT_LENGTH]; char *laston = NULL; struct stat fst; bool loaded = FALSE, skip = FALSE; DESCRIPTOR_DATA *d; if( IS_NPC( ch ) ) { send_to_char( "Mobs can't use the finger command.\n\r", ch ); return; } if( !argument || argument[0] == '\0' ) { send_to_char( "Back finger whom?\n\r", ch ); return; } sprintf( buf, "0.%s", argument ); sprintf( fingload, "%s%c/%s", BACKUP_DIR, tolower( argument[0] ), capitalize( argument ) ); /* * Bug fix here provided by Senir to stop /dev/null crash */ if( stat( fingload, &fst ) == -1 || !check_parse_name( capitalize( argument ), FALSE ) ) { ch_printf( ch, "&YNo such player named '%s'.\n\r", argument ); return; } /* * laston = ctime( &fst.st_mtime ); */ temproom = get_room_index( ROOM_VNUM_LIMBO ); if( !temproom ) { bug( "%s", "do_backfinger: Limbo room is not available!" ); send_to_char( "Fatal error, report to the immortals.\n\r", ch ); return; } CREATE( d, DESCRIPTOR_DATA, 1 ); d->next = NULL; d->prev = NULL; d->connected = CON_GET_NAME; d->outsize = 2000; CREATE( d->outbuf, char, d->outsize ); argument[0] = UPPER( argument[0] ); loaded = load_char_obj( d, argument, FALSE ); /* Remove second FALSE if compiler complains */ LINK( d->character, first_char, last_char, next, prev ); original = d->character->in_room; char_to_room( d->character, temproom ); victim = d->character; /* Hopefully this will work, if not, we're SOL */ d->character->desc = NULL; d->character = NULL; DISPOSE( d->outbuf ); DISPOSE( d ); /* * Link dead check? Was crashing on "IP Info" line below * * hopefully this will fix it. -Goku 10.11.03 */ if( !victim->desc ) loaded = FALSE; if( IS_SET( victim->pcdata->flags, PCFLAG_PRIVACY ) && !IS_IMMORTAL( ch ) ) { ch_printf( ch, "%s has privacy enabled.\n\r", victim->name ); skip = TRUE; } if( IS_IMMORTAL( victim ) && !IS_IMMORTAL( ch ) ) { send_to_char( "You cannot back finger an immortal.\n\r", ch ); skip = TRUE; } loaded = TRUE; if( !skip ) { send_to_char( "&w Back Finger Info\n\r", ch ); send_to_char( " -----------\n\r", ch ); ch_printf( ch, "&wName : &G%-20s &wMUD Age: &G%d\n\r", victim->name, get_newage( victim ) ); ch_printf( ch, "&wRank : &G%-20s &wRace : &G%s\n\r", get_rank( victim ), capitalize( get_race( victim ) ) ); ch_printf( ch, "&wSex : &G%-20s\n\r", victim->sex == SEX_MALE ? "Male" : victim->sex == SEX_FEMALE ? "Female" : "Neutral" ); ch_printf( ch, "&wTitle : &G%s\n\r", victim->pcdata->title ); ch_printf( ch, "&wHomepage: &G%s\n\r", victim->pcdata->homepage != NULL ? victim->pcdata->homepage : "Not specified" ); ch_printf( ch, "&wEmail : &G%s\n\r", victim->pcdata->email != NULL ? victim->pcdata->email : "Not specified" ); ch_printf( ch, "&wICQ# : &G%d\n\r", victim->pcdata->icq ); if( loaded ) ch_printf( ch, "&wLast on : &G%s\n\r", ctime( &victim->pcdata->lastlogon ) ); else ch_printf( ch, "&wLast on : &GCurrently Online\n\n\r", laston ); if( IS_IMMORTAL( ch ) ) { send_to_char( "&wImmortal Information\n\r", ch ); send_to_char( "--------------------\n\r", ch ); // ch_printf( ch, "&wIP Info : &G%s\n\r", loaded ? "Unknown" : victim->desc->host ); ch_printf( ch, "&wTime played : &G%ld hours\n\r", ( long int )GET_TIME_PLAYED( victim ) ); ch_printf( ch, "&wAuthorized by : &G%s\n\r", victim->pcdata->authed_by ? victim->pcdata->authed_by : ( sysdata. WAIT_FOR_AUTH ? "Not Authed" : "The Code" ) ); ch_printf( ch, "&wPrivacy Status: &G%s\n\r", IS_SET( victim->pcdata->flags, PCFLAG_PRIVACY ) ? "Enabled" : "Disabled" ); if( victim->level < ch->level ) { /* * Added by Tarl 19 Dec 02 to remove Huh? when ch not high enough to view comments. */ command = find_command( "comment" ); if( !command ) level = LEVEL_IMMORTAL; else level = command->level; if( ch->level >= command->level ) { sprintf( buf, "comment list %s", victim->name ); interpret( ch, buf ); } } } pager_printf_color( ch, "&wBio:\n\r&G%s\n\r", victim->pcdata->bio ? victim->pcdata->bio : "Not created" ); pager_printf_color( ch, "\n\r&wDescription:\n\r&G%s\n\r", victim->description ? victim->description : "Not created" ); } if( loaded ) { int x, y; char_from_room( victim ); char_to_room( victim, original ); quitting_char = victim; /* * save_char_obj( victim ); */ if( sysdata.save_pets && victim->pcdata->pet ) extract_char( victim->pcdata->pet, TRUE ); saving_char = NULL; /* * After extract_char the ch is no longer valid! */ extract_char( victim, TRUE ); for( x = 0; x < MAX_WEAR; x++ ) for( y = 0; y < MAX_LAYERS; y++ ) save_equipment[x][y] = NULL; } return; } void fread_pfile2( CHAR_DATA * ch, FILE * fp ) { char *word; char *name = NULL; sh_int level = 0; sh_int file_ver = 0; bool fMatch; long double exp = 0; char *description = NULL; char *bio = NULL; for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; /* if (StopFP) { bug("Bad Pfile detected. Stoping proccessing of bad Pfile."); StopFP = FALSE; return; } */ switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'B': KEY( "Bio", bio, fread_string( fp ) ); break; case 'D': KEY( "Description", description, fread_string( fp ) ); break; case 'E': KEY( "Exp", exp, fread_number_ld( fp ) ); if( !strcmp( word, "End" ) ) goto timecheck; break; case 'L': KEY( "Level", level, fread_number( fp ) ); break; case 'N': KEY( "Name", name, fread_string( fp ) ); break; case 'V': KEY( "Version", file_ver, fread_number( fp ) ); break; } if( !fMatch ) fread_to_eol( fp ); } timecheck: { send_to_char( "Name: ", ch ); send_to_char( name, ch ); send_to_char( "\n\rBio:\n\r", ch ); send_to_char( bio, ch ); send_to_char( "\n\r\n\rDesc:\n\r", ch ); send_to_char( description, ch ); } } void do_finger2( CHAR_DATA * ch, char *argument ) { char buf[MAX_STRING_LENGTH], fingload[MAX_INPUT_LENGTH]; FILE *fp; if( IS_NPC( ch ) ) { send_to_char( "Mobs can't use the finger command.\n\r", ch ); return; } if( !argument || argument[0] == '\0' ) { send_to_char( "Finger whom?\n\r", ch ); return; } sprintf( buf, "0.%s", argument ); /* * Check for offline players - Edge */ // else { sprintf( fingload, "%s%c/%s", BACKUP_DIR, tolower( argument[0] ), capitalize( argument ) ); /* * Bug fix here provided by Senir to stop /dev/null crash */ if( ( fp = fopen( fingload, "r" ) ) == NULL ) { send_to_char( "Error.\n\r", ch ); return; } for( ;; ) { char letter; char *word; /* if (StopFP) { bug("Bad Pfile detected. Stoping proccessing of bad Pfile."); StopFP = FALSE; return; } */ letter = fread_letter( fp ); if( letter != '#' ) continue; word = fread_word( fp ); if( !str_cmp( word, "End" ) ) break; if( !str_cmp( word, "PLAYER" ) ) fread_pfile2( ch, fp ); else if( !str_cmp( word, "END" ) ) /* Done */ break; } fclose( fp ); } return; }