/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * _/ _/_/_/ _/ _/ _/ ACK! MUD is modified * * _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code * * _/ _/ _/ _/_/ _/ (c)Stephen Zepp 1998 * * _/_/_/_/ _/ _/ _/ Version #: 4.3 * * _/ _/ _/_/_/ _/ _/ _/ * * * * http://ackmud.nuc.net/ * * zenithar@ackmud.nuc.net * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * _/_/_/_/ _/ _/ _/_/_/_/ _/_/_/_/ AckFUSS is modified ACK!MUD 4.3.1 * * _/ _/ _/ _/ _/ copyright Matt Goff (Kline) 2008 * * _/_/ _/ _/ _/_/_/_/ _/_/_/_/ * * _/ _/ _/ _/ _/ Support for this code is provided * * _/ _/_/_/_/ _/_/_/_/ _/_/_/_/ at www.ackmud.net -- check it out!* ***************************************************************************/ #include "h/globals.h" #ifndef DEC_COMM_H #include "h/comm.h" #endif #ifndef DEC_DB_H #include "h/db.h" #endif #ifndef DEC_HANDLER_H #include "h/handler.h" #endif #ifndef DEC_SAVE_H #include "h/save.h" #endif #ifndef DEC_SSM_H #include "h/ssm.h" #endif /* =========================================================================== This snippet was written by Erwin S. Andreasen, 4u2@aabc.dk. You may use this code freely, as long as you retain my name in all of the files. You also have to mail me telling that you are using it. I am giving this, hopefully useful, piece of source code to you for free, and all I require from you is some feedback. Please mail me if you find any bugs or have any new ideas or just comments. All my snippets are publically available at: http://pip.dknet.dk/~pip1773/ If you do not have WWW access, try ftp'ing to pip.dknet.dk and examine the /pub/pip1773 directory. =========================================================================== Various administrative utility commands. Version: 3 - Last update: January 1996. To use these 2 commands you will have to add a filename field to AREA_DATA. This value can be found easily in load_area while booting - the filename of the current area boot_db is reading from is in the strArea global. Since version 2 following was added: A rename command which renames a player. Search for do_rename to see more info on it. Fixes since last release: None. */ /* To have VLIST show more than vnum 0 - 9900, change the number below: */ #define MAX_SHOW_VNUM 326 /* show only 1 - 100*100 */ #define NUL '\0' /* opposite directions */ const short opposite_dir[6] = { DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_DOWN, DIR_UP }; /* get the 'short' name of an area (e.g. MIDGAARD, MIRROR etc. */ /* assumes that the filename saved in the AREA_DATA struct is something like midgaard.are */ char *area_name( AREA_DATA * pArea ) { static char buffer[64]; /* short filename */ char *period; assert( pArea != NULL ); strncpy( buffer, pArea->filename, 64 ); /* copy the filename */ period = strchr( buffer, '.' ); /* find the period (midgaard.are) */ if( period ) /* if there was one */ *period = '\0'; /* terminate the string there (midgaard) */ return buffer; } /* depending on status print > or < or <> between the 2 rooms */ void room_pair( ROOM_INDEX_DATA * left, ROOM_INDEX_DATA * right, exit_status ex, char *buffer ) { char *sExit; switch ( ex ) { default: sExit = "??"; break; /* invalid usage */ case exit_from: sExit = "< "; break; case exit_to: sExit = " >"; break; case exit_both: sExit = "<>"; break; } snprintf( buffer, sizeof(buffer), "%5d %-26.26s %s%5d %-26.26s(%-8.8s)\r\n", left->vnum, left->name, sExit, right->vnum, right->name, area_name( right->area ) ); } /* for every exit in 'room' which leads to or from pArea but NOT both, print it */ void checkexits( ROOM_INDEX_DATA * room, AREA_DATA * pArea, char *buffer ) { char buf[MAX_STRING_LENGTH]; int i; EXIT_DATA *exit; ROOM_INDEX_DATA *to_room; strcpy( buffer, "" ); for( i = 0; i < 6; i++ ) { exit = room->exit[i]; if( !exit ) continue; else to_room = exit->to_room; if( to_room ) /* there is something on the other side */ { if( ( room->area == pArea ) && ( to_room->area != pArea ) ) { /* an exit from our area to another area */ /* * check first if it is a two-way exit */ if( to_room->exit[opposite_dir[i]] && to_room->exit[opposite_dir[i]]->to_room == room ) room_pair( room, to_room, exit_both, buf ); /* <> */ else room_pair( room, to_room, exit_to, buf ); /* > */ strncat( buffer, buf, MSL ); } else if( ( room->area != pArea ) && ( exit->to_room->area == pArea ) ) { /* an exit from another area to our area */ if( !( to_room->exit[opposite_dir[i]] && to_room->exit[opposite_dir[i]]->to_room == room ) ) /* * two-way exits are handled in the other if */ { room_pair( to_room, room, exit_from, buf ); strncat( buffer, buf, MSL ); } } /* if room->area */ } } /* for */ } /* for now, no arguments, just list the current area */ DO_FUN(do_exlist) { AREA_DATA *pArea; ROOM_INDEX_DATA *room; int i; char buffer[MAX_STRING_LENGTH]; pArea = ch->in_room->area; /* this is the area we want info on */ for( i = 0; i < MAX_KEY_HASH; i++ ) /* room index hash table */ for( room = room_index_hash[i]; room != NULL; room = room->next ) /* * run through all the rooms on the MUD */ { checkexits( room, pArea, buffer ); send_to_char( buffer, ch ); } } /* show a list of all used VNUMS */ #define COLUMNS 5 /* number of columns */ #define MAX_ROW ((MAX_SHOW_VNUM / COLUMNS)+1) /* rows */ DO_FUN(do_vlist) { int i, j, vnum; ROOM_INDEX_DATA *room; char buffer[MAX_ROW * 100]; /* should be plenty */ char buf2[100]; for( i = 0; i < MAX_ROW; i++ ) { strcpy( buffer, "" ); /* clear the buffer for this row */ for( j = 0; j < COLUMNS; j++ ) /* for each column */ { vnum = ( ( j * MAX_ROW ) + i ); /* find a vnum whih should be there */ if( vnum < MAX_SHOW_VNUM ) { room = get_room_index( vnum * 100 + 1 ); /* each zone has to have a XXX01 room */ snprintf( buf2, 100, "%3d %-8.8s ", vnum, room ? area_name( room->area ) : "-" ); /* * something there or unused ? */ strncat( buffer, buf2, (MAX_ROW * 100)-1 ); } } /* for columns */ send_to_char( buffer, ch ); send_to_char( "\r\n", ch ); } /* for rows */ } /* * do_rename renames a player to another name. * PCs only. Previous file is deleted, if it exists. * Char is then saved to new file. * New name is checked against std. checks, existing offline players and * online players. * .gz files are checked for too, just in case. */ DO_FUN(do_rename) { char old_name[MAX_INPUT_LENGTH], new_name[MAX_INPUT_LENGTH], strsave[MAX_INPUT_LENGTH]; CHAR_DATA *victim; FILE *file; argument = one_argument( argument, old_name ); /* find new/old name */ one_argument( argument, new_name ); /* * Trivial checks */ if( !old_name[0] ) { send_to_char( "Rename who?\r\n", ch ); return; } victim = get_char_world( ch, old_name ); if( !victim ) { send_to_char( "There is no such a person online.\r\n", ch ); return; } if( IS_NPC( victim ) ) { send_to_char( "You cannot use Rename on NPCs.\r\n", ch ); return; } /* * allow rename self new_name,but otherwise only lower level */ if( ( victim != ch ) && ( get_trust( victim ) >= get_trust( ch ) ) ) { send_to_char( "You failed.\r\n", ch ); return; } if( !victim->desc || ( victim->desc->connected != CON_PLAYING ) ) { send_to_char( "This player has lost his link or is inside a pager or the like.\r\n", ch ); return; } if( !new_name[0] ) { send_to_char( "Rename to what new name?\r\n", ch ); return; } /* * Insert check for clan here!! */ /* * * if (victim->clan) * { * send_to_char ("This player is member of a clan, remove him from there first.\r\n",ch); * return; * } */ if( !check_parse_name( new_name ) ) { send_to_char( "The new name is illegal.\r\n", ch ); return; } /* * First, check if there is a player named that off-line */ #if !defined(machintosh) && !defined(MSDOS) snprintf( strsave, MIL, "%s%s%s%s", PLAYER_DIR, initial( new_name ), "/", capitalize( new_name ) ); #else snprintf( strsave, MIL, "%s%s", PLAYER_DIR, capitalize( new_name ) ); #endif file = file_open( strsave, "r" ); /* attempt to to open pfile */ if( file ) { send_to_char( "A player with that name already exists!\r\n", ch ); file_close( file ); return; } file_close( file ); /* * Check .gz file ! */ #if !defined(machintosh) && !defined(MSDOS) snprintf( strsave, MIL, "%s%s%s%s.gz", PLAYER_DIR, initial( new_name ), "/", capitalize( new_name ) ); #else snprintf( strsave, MIL, "%s%s.gz", PLAYER_DIR, capitalize( new_name ) ); #endif file = file_open( strsave, "r" ); /* attempt to to open pfile */ if( file ) { send_to_char( "A player with that name already exists in a compressed file!\r\n", ch ); file_close( file ); return; } file_close( file ); if( get_char_world( ch, new_name ) ) /* check for playing level-1 non-saved */ { send_to_char( "A player with the name you specified already exists!\r\n", ch ); return; } /* * Save the filename of the old name */ #if !defined(machintosh) && !defined(MSDOS) snprintf( strsave, MIL, "%s%s%s%s", PLAYER_DIR, initial( victim->name.c_str() ), "/", capitalize( victim->name.c_str() ) ); #else snprintf( strsave, MIL, "%s%s", PLAYER_DIR, capitalize( victim->name.c_str() ) ); #endif /* * Rename the character and save him to a new file */ /* * NOTE: Players who are level 1 do NOT get saved under a new name */ victim->name = capitalize( new_name ); save_char_obj( victim ); /* * unlink the old file */ unlink( strsave ); /* unlink does return a value.. but we do not care */ /* * That's it! */ send_to_char( "Character renamed.\r\n", ch ); victim->position = POS_STANDING; /* I am laaazy */ act( "$n has renamed you to $N!", ch, NULL, victim, TO_VICT ); } /* do_rename */