#include <math.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#include "mud.h"
#if defined(__CYGWIN__)
#include <dirent.h>
#else
#include <sys/dir.h>
#endif
#include <unistd.h>
void descriptor_switch( DESCRIPTOR_DATA * ch, DESCRIPTOR_DATA * victim );
void do_as_mortal( CHAR_DATA * ch, char *argument );
bool exists_player( char *name )
{
struct stat fst;
char buf[256];
/*
* Stands to reason that if there ain't a name to look at, they damn well don't exist!
*/
if( !name || !str_cmp( name, "" ) )
return FALSE;
snprintf( buf, 256, "%s%c/%s", PLAYER_DIR, tolower( name[0] ), capitalize( name ) );
if( stat( buf, &fst ) != -1 )
return TRUE;
return FALSE;
}
void do_doas( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if( IS_NPC( ch ) )
return;
if( argument[0] == '\0' )
{
send_to_pager( "You must input the name of an online character.\n\r", ch );
return;
}
if( !str_prefix( "quit", argument ) )
{
send_to_char( "&RDon't be stupid, you'd turn them into you or trap yourself as a mortal.\n\r", ch );
return;
}
if( !str_cmp( arg, "mortal" ) )
{
do_as_mortal( ch, argument );
return;
}
if( ( ( victim = get_char_world( ch, arg ) ) == NULL ) )
{
send_to_pager( "No such character online.\n\r", ch );
return;
}
if( IS_NPC( victim ) )
{
send_to_pager( "That's not a player!\n\r", ch );
return;
}
if( !victim->desc )
{
send_to_pager( "&RAre you trying to crash the MUD or something?\n\r", ch );
return;
}
if( ch->desc->original || victim->desc->original )
{
send_to_pager( "Not while switched!\n\r", ch );
return;
}
if( get_trust( ch ) <= get_trust( victim ) )
{
send_to_char( "I don't think so..\n\r", ch );
return;
}
descriptor_switch( ch->desc, victim->desc );
interpret( victim, argument );
descriptor_switch( ch->desc, victim->desc );
}
void descriptor_switch( DESCRIPTOR_DATA * ch, DESCRIPTOR_DATA * victim )
{
DESCRIPTOR_DATA *origch;
DESCRIPTOR_DATA *origvictim;
CHAR_DATA *chr;
CHAR_DATA *vict;
if( !ch || !victim )
return;
origch = ch;
origvictim = victim;
chr = ch->character;
vict = victim->character;
victim = origch;
victim->character = vict;
victim->character->desc = origch;
ch = origvictim;
ch->character = chr;
ch->character->desc = origvictim;
}
void do_as_mortal( CHAR_DATA * ch, char *argument )
{
int trust, level;
level = ch->top_level;
trust = ch->trust;
ch->top_level = LEVEL_IMMORTAL - 2;
ch->trust = LEVEL_IMMORTAL - 2;
interpret( ch, argument );
ch->top_level = level;
ch->trust = trust;
return;
}
void do_pfreload( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
if( IS_NPC( ch ) )
return;
argument = one_argument( argument, arg );
if( arg[0] == '\0' )
{
send_to_char( "Reload who?\n\r", ch );
return;
}
if( !( victim = get_char_world( ch, arg ) ) )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if( get_trust( victim ) > get_trust( ch ) )
{
send_to_char( "You can't reload imms who are on a higher level!\n\r", ch );
return;
}
if( exists_player( victim->name ) )
{
DESCRIPTOR_DATA *d;
char name[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *in_room;
bool Load;
d = NULL;
d = victim->desc;
sprintf( name, "%s", victim->name );
in_room = victim->in_room;
/*
* clear descriptor pointer to get rid of bug message in log
*/
victim->desc = NULL;
extract_char( victim, TRUE );
d->character = NULL;
Load = load_char_obj( d, name, FALSE, FALSE );
victim = d->character;
victim->desc = d;
victim->timer = 0;
/*
* Insert in the char_list
*/
LINK( d->character, first_char, last_char, next, prev );
char_to_room( victim, in_room );
if( Load )
{
send_to_char( "Your pfile has been reloaded.\n\r", victim );
send_to_char( "Their pfile has been reloaded.\n\r", ch );
sprintf( buf, "%s has been reloaded.", victim->name );
log_string( buf );
}
else
{
send_to_char( "Hrmm bug, it didnt work.\n\r", ch );
return;
}
}
else
send_to_char( "They have to have a pfile before you can load it.\n\r", ch );
return;
}
void do_crash( CHAR_DATA * ch, char *argument )
{
if( !argument || ( argument[0] == '\0' ) || strcmp( argument, "yes" ) )
{
send_to_char( "&wIf you really want to crash the mud type \"&Wcrash yes&w\".\n\r", ch );
return;
}
if( ch->pIndexData || ( ch->top_level < MAX_LEVEL ) )
{
send_to_char( "&YYou wish you had that kind of power!\n\r", ch );
log_printf( "%s tried to crash the mud with the Crash Command", ch->name );
return;
}
else
{
log_printf( "%s is crashing the mud", ch->name );
if( ch->pIndexData->vnum == 1234 )
send_to_char( "Wierd\n\r", ch );
}
}