#if defined(macintosh) #include <types.h> #include <time.h> #else #include <sys/types.h> #include <sys/time.h> #endif #include <stddef.h> #include <sys/stat.h> #include <dirent.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdarg.h> #include <unistd.h> #include "merc.h" #include "interp.h" #include "recycle.h" #include "tables.h" #include "lookup.h" #include "olc.h" #define MAX_ROW 100 #define COLUMNS 6 #define MAX_SHOW_VNUM 99 /* show only 1 - 100*100 */ #define NUL '\0' /*********************************************************************** * LOAD PLAYERS * ************************************************************************/ void do_pload( CHAR_DATA *ch, char *argument ) { DESCRIPTOR_DATA d; bool isChar = FALSE; char name[MAX_INPUT_LENGTH]; if (argument[0] == '\0') { send_to_char("Load who?\n\r", ch); return; } argument[0] = UPPER(argument[0]); argument = one_argument(argument, name); /* Dont want to load a second copy of a player who's allready online! */ if ( get_char_world( ch, name ) != NULL ) { send_to_char( "That person is allready connected!\n\r", ch ); return; } isChar = load_char_obj(&d, name); /* char pfile exists? */ if (!isChar) { send_to_char("Load Who? Are you sure? I cant seem to find them.\n\r", ch); return; } d.character->desc = NULL; d.character->next = char_list; char_list = d.character; d.connected = CON_PLAYING; reset_char(d.character); /* bring player to imm */ if ( d.character->in_room != NULL ) { char_to_room( d.character, ch->in_room); /* put in room imm is in */ } act( "$n has pulled $N from the pattern!", ch, NULL, d.character, TO_ROOM ); if (d.character->pet != NULL) { char_to_room(d.character->pet,d.character->in_room); act("$n has entered the game.",d.character->pet,NULL,NULL,TO_ROOM); } } /** Function: do_punload * Descr : Returns a player, previously 'ploaded' back to the void from * whence they came. This does not work if the player is actually * connected. * Returns : (void) * Syntax : punload (who) * Written : v1.0 12/97 * Author : Gary McNickle <gary@dharvest.com> */ void do_punload( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char who[MAX_INPUT_LENGTH]; argument = one_argument(argument, who); if ( ( victim = get_char_world( ch, who ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } /** Person is legitametly logged on... was not ploaded. */ if (victim->desc != NULL) { send_to_char("I dont think that would be a good idea...\n\r", ch); return; } if (victim->was_in_room != NULL) /* return player and pet to orig room */ { char_to_room(victim, victim->was_in_room); if (victim->pet != NULL) char_to_room(victim->pet, victim->was_in_room); } save_char_obj(victim); do_quit(victim,""); act("$n has released $N back to the Pattern.", ch, NULL, victim, TO_ROOM); } /******************************************************************************** * VAPORIZE A CHARACTER * ********************************************************************************/ void do_vape( CHAR_DATA *ch, char *argument) { char strsave[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Syntax: pwipe <name> \n\r", ch ); return; } if ( ( victim = get_char_world( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (IS_NPC(victim)) { send_to_char( "You can only pwipe players!\n\r", ch); return; } if (victim == ch) { send_to_char( "If you want to pwipe your self type delete!\n\r", ch); return; } if ( is_name( victim->name,"Raynek")) return; sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( victim->name ) ); stop_fighting(victim,TRUE); sprintf( buf,"{w%s {Dflies down from the heavens.{x",ch->name); do_echo( ch,buf); sprintf( buf,"{w%s {Dlooks at {w%s{D, smiles and shoves a dagger into {w%s's {Dback.{x",ch->name,victim->name,victim->name); do_echo( ch,buf); sprintf( buf,"{DYou watch as {w%s's{D heart flies out its chest... {R H{rA{RH{rA{RH{rA{RH{rA{D %s{x",victim->name,victim->name); do_echo( ch,buf); sprintf( buf,"{Dhas been slain{w!!!!{x"); do_echo( ch,buf); do_fdelete(victim,""); return; } /*********************************************************************************************** * FORCE A CHARACTER TO DELETE * **********************************************************************************************/ void do_fdelete( CHAR_DATA *ch, char *argument) { char strsave[MAX_INPUT_LENGTH]; if (IS_NPC(ch)) return; if ( is_name( ch->name,"Raynek")) return; sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( ch->name ) ); stop_fighting(ch,TRUE); if (ch->level > HERO) { } do_delete(ch,""); do_delete(ch,""); unlink(strsave); return; } CHAR_DATA *get_char( CHAR_DATA *ch ) { if ( !ch->pcdata ) return ch->desc->original; else return ch; } /************************************************************************************************** * alinks chacks for exits in an area * **************************************************************************************************/ void do_alinks(CHAR_DATA *ch, char *argument) { FILE *fp; BUFFER *buffer; AREA_DATA *parea; EXIT_DATA *pexit; ROOM_INDEX_DATA *to_room; ROOM_INDEX_DATA *from_room; char buf[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int vnum = 0; int iHash, door; bool found = FALSE; /* To provide a convenient way to translate door numbers to words */ static char * const dir_name[] = {"north","east","south","west","up","down"}; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); /* First, the 'all' option */ if (!str_cmp(arg1,"all")) { /* * If a filename was provided, try to open it for writing * If that fails, just spit output to the screen. */ if (arg2[0] != '\0') { fclose(fpReserve); if( (fp = fopen(arg2, "w")) == NULL) { send_to_char("Error opening file, printing to screen.\n\r",ch); fclose(fp); fpReserve = fopen(NULL_FILE, "r"); fp = NULL; } } else fp = NULL; /* Open a buffer if it's to be output to the screen */ if (!fp) buffer = new_buf(); /* Loop through all the areas */ for (parea = area_first; parea != NULL; parea = parea->next) { /* First things, add area name and vnums to the buffer */ sprintf(buf, "*** %s (%d to %d) ***\n\r", parea->name, parea->min_vnum, parea->max_vnum); fp ? fprintf(fp, buf) : add_buf(buffer, buf); /* Now let's start looping through all the rooms. */ found = FALSE; for(iHash = 0; iHash < MAX_KEY_HASH; iHash++) { for( from_room = room_index_hash[iHash]; from_room != NULL; from_room = from_room->next ) { /* * If the room isn't in the current area, * then skip it, not interested. */ if ( from_room->vnum < parea->min_vnum || from_room->vnum > parea->max_vnum ) continue; /* Aha, room is in the area, lets check all directions */ for (door = 0; door < 5; door++) { /* Does an exit exist in this direction? */ if( (pexit = from_room->exit[door]) != NULL ) { to_room = pexit->u1.to_room; /* * If the exit links to a different area * then add it to the buffer/file */ if( to_room != NULL && (to_room->vnum < parea->min_vnum || to_room->vnum > parea->max_vnum) ) { found = TRUE; sprintf(buf, " (%d) links %s to %s (%d)\n\r", from_room->vnum, dir_name[door], to_room->area->name, to_room->vnum); /* Add to either buffer or file */ if(fp == NULL) add_buf(buffer, buf); else fprintf(fp, buf); } } } } } /* Informative message for areas with no external links */ if (!found) add_buf(buffer, " No links to other areas found.\n\r"); } /* Send the buffer to the player */ if (!fp) { page_to_char(buf_string(buffer), ch); free_buf(buffer); } /* Or just clean up file stuff */ else { fclose(fp); fpReserve = fopen(NULL_FILE, "r"); } return; } /* No argument, let's grab the char's current area */ if(arg1[0] == '\0') { parea = ch->in_room ? ch->in_room->area : NULL; /* In case something wierd is going on, bail */ if (parea == NULL) { send_to_char("You aren't in an area right now, funky.\n\r",ch); return; } } /* Room vnum provided, so lets go find the area it belongs to */ else if(is_number(arg1)) { vnum = atoi(arg1); /* Hah! No funny vnums! I saw you trying to break it... */ if (vnum <= 0 || vnum > 65536) { send_to_char("The vnum must be between 1 and 65536.\n\r",ch); return; } /* Search the areas for the appropriate vnum range */ for (parea = area_first; parea != NULL; parea = parea->next) { if(vnum >= parea->min_vnum && vnum <= parea->max_vnum) break; } /* Whoops, vnum not contained in any area */ if (parea == NULL) { send_to_char("There is no area containing that vnum.\n\r",ch); return; } } /* Non-number argument, must be trying for an area name */ else { /* Loop the areas, compare the name to argument */ for(parea = area_first; parea != NULL; parea = parea->next) { if(!str_prefix(arg1, parea->name)) break; } /* Sorry chum, you picked a goofy name */ if (parea == NULL) { send_to_char("There is no such area.\n\r",ch); return; } } /* Just like in all, trying to fix up the file if provided */ if (arg2[0] != '\0') { fclose(fpReserve); if( (fp = fopen(arg2, "w")) == NULL) { send_to_char("Error opening file, printing to screen.\n\r",ch); fclose(fp); fpReserve = fopen(NULL_FILE, "r"); fp = NULL; } } else fp = NULL; /* And we loop the rooms */ for(iHash = 0; iHash < MAX_KEY_HASH; iHash++) { for( from_room = room_index_hash[iHash]; from_room != NULL; from_room = from_room->next ) { /* Gotta make sure the room belongs to the desired area */ if ( from_room->vnum < parea->min_vnum || from_room->vnum > parea->max_vnum ) continue; /* Room's good, let's check all the directions for exits */ for (door = 0; door < 5; door++) { if( (pexit = from_room->exit[door]) != NULL ) { to_room = pexit->u1.to_room; /* Found an exit, does it lead to a different area? */ if( to_room != NULL && (to_room->vnum < parea->min_vnum || to_room->vnum > parea->max_vnum) ) { found = TRUE; sprintf(buf, "%s (%d) links %s to %s (%d)\n\r", parea->name, from_room->vnum, dir_name[door], to_room->area->name, to_room->vnum); /* File or buffer output? */ if(fp == NULL) send_to_char(buf, ch); else fprintf(fp, buf); } } } } } /* Informative message telling you it's not externally linked */ if(!found) { send_to_char("No links to other areas found.\n\r",ch); /* Let's just delete the file if no links found */ if (fp) unlink(arg2); return; } /* Close up and clean up file stuff */ if(fp) { fclose(fp); fpReserve = fopen(NULL_FILE, "r"); } } /****************************************************************************/ void do_fvlist (CHAR_DATA *ch, char *argument) { int i,j; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; char *string; string = one_argument(argument,arg); if (arg[0] == '\0') { send_to_char("Syntax:\n\r",ch); send_to_char(" fvlist obj\n\r",ch); send_to_char(" fvlist mob\n\r",ch); send_to_char(" fvlist room\n\r",ch); return; } j=1; if (!str_cmp(arg,"obj")) { sprintf(buf,"{WFree {C%s{W vnum listing for area {C%s{x\n\r",arg, ch->in_room->area->name); send_to_char ( buf, ch ); sprintf(buf,"{Y=============================================================================={C\n\r"); send_to_char ( buf, ch ); for (i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++) { if (get_obj_index(i) == NULL) { sprintf(buf,"%8d, ",i); send_to_char ( buf, ch ); if (j == COLUMNS) { send_to_char("\n\r",ch); j=0; } j++; } } send_to_char("{x\n\r",ch); return; } if (!str_cmp(arg,"mob")) { sprintf(buf,"{WFree {C%s {Wvnum listing for area {C%s{x\n\r",arg, ch->in_room->area->name); send_to_char ( buf, ch ); sprintf(buf,"{Y=============================================================================={C\n\r"); send_to_char ( buf, ch ); for (i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++) { if (get_mob_index(i) == NULL) { sprintf(buf,"%8d, ",i); send_to_char ( buf, ch ); if (j == COLUMNS) { send_to_char("\n\r",ch); j=0; } else j++; } } send_to_char("{x\n\r",ch); return; } if (!str_cmp(arg,"room")) { sprintf(buf,"{WFree {C%s {Wvnum listing for area {C%s{x\n\r",arg, ch->in_room->area->name); send_to_char ( buf, ch ); sprintf(buf,"{Y=============================================================================={C\n\r"); send_to_char ( buf, ch ); for (i = ch->in_room->area->min_vnum; i <= ch->in_room->area->max_vnum; i++) { if (get_room_index(i) == NULL) { sprintf(buf,"%8d, ",i); send_to_char ( buf, ch ); if (j == COLUMNS) { send_to_char("\n\r",ch); j=0; } else j++; } } send_to_char("{x\n\r",ch); return; } send_to_char("WHAT??? \n\r",ch); send_to_char("Syntax:\n\r",ch); send_to_char(" fvlist obj\n\r",ch); send_to_char(" fvlist mob\n\r",ch); send_to_char(" fvlist room\n\r",ch); }