/**************************************************************************
* Mudprogram's (Mobprogram, Objprogram and Roomprogram) originaly *
* by the SMAUG development team *
* Ported to EmberMUD by Thanatos and Tyrluk of ToED *
* (Temple of Eternal Death) *
* Tyrluk - morn@telmaron.com or dajy@mindspring.com *
* Thanatos - morn@telmaron.com or jonathan_w._rose@ffic.com *
**************************************************************************/
/***************************************************************************
* 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. *
* *
* 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. *
* *
* 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. *
***************************************************************************/
#if !defined(WIN32)
#include <sys/time.h>
#endif
#include <time.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include "merc.h"
#include "olc.h"
#include "interp.h"
/* command procedures needed */
DECLARE_DO_FUN( do_remove );
DECLARE_DO_FUN( do_rstat );
DECLARE_DO_FUN( do_mstat );
DECLARE_DO_FUN( do_ostat );
DECLARE_DO_FUN( do_rset );
DECLARE_DO_FUN( do_mset );
DECLARE_DO_FUN( do_oset );
DECLARE_DO_FUN( do_sset );
DECLARE_DO_FUN( do_mfind );
DECLARE_DO_FUN( do_ofind );
DECLARE_DO_FUN( do_rfind );
DECLARE_DO_FUN( do_mpfind );
DECLARE_DO_FUN( do_slookup );
DECLARE_DO_FUN( do_mload );
DECLARE_DO_FUN( do_oload );
DECLARE_DO_FUN( do_force );
DECLARE_DO_FUN( do_quit );
DECLARE_DO_FUN( do_save );
DECLARE_DO_FUN( do_look );
DECLARE_DO_FUN( do_force );
DECLARE_DO_FUN( do_pload );
DECLARE_DO_FUN( do_punload );
DECLARE_DO_FUN( do_wizgrant );
DECLARE_DO_FUN( do_wizrevoke );
DECLARE_DO_FUN( do_olevel );
DECLARE_DO_FUN( do_mlevel );
/*
* Local functions.
*/
ROOM_INDEX_DATA *find_location args( ( CHAR_DATA * ch, char *arg ) );
extern int control;
extern bool write_to_descriptor( int, char *, int, bool );
#ifdef REQUIRE_EDIT_PERMISSION
void do_setedit( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "That person does not exist.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\rDuh.\n\r", ch );
return;
}
TOGGLE_BIT( victim->act, PLR_CAN_EDIT );
if ( victim->act & PLR_CAN_EDIT )
{
send_to_char( "You may now use OLC.\n\r", victim );
send_to_char( "OLC enabled!\n\r", ch );
}
else
{
send_to_char( "OLC disabled.\n\r", ch );
send_to_char( "You may no longer use OLC.\n\r", victim );
}
return;
}
#endif
#ifdef REQUIRE_MUDPROG_PERMISSION
void do_setprog( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "That person does not exist.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\rDuh.\n\r", ch );
return;
}
TOGGLE_BIT( victim->act, PLR_CAN_PROG );
send_to_char( "Ok.\n\r", ch );
if ( victim->act & PLR_CAN_PROG )
send_to_char( "You may now make programs.\n\r", victim );
else
send_to_char( "You may no longer make programs.\n\r", victim );
return;
}
#endif
/* This Permit command is to be used along with the ban site permit
command. It allows certain players to login from banned sites. -Lancelight
*/
void do_permit( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "That person does not exist.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\rDuh.\n\r", ch );
return;
}
TOGGLE_BIT( victim->act, PLR_PERMIT );
if ( victim->act & PLR_PERMIT )
{
send_to_char( "Player may now log in from banned sites.\n\r", ch );
send_to_char( "You may now log in from banned sites.\n\r", victim );
}
else
{
send_to_char( "Player may no longer login from banned sites.\n\r", ch );
send_to_char( "You may no longer login from banned sites.\n\r",
victim );
}
return;
}
/* I whipped this jail command up after a suggestion came that we should
have some sort of jail system. I'm the meanie type, so I whipped up a
really nasty jail bit. -Lancelight */
void do_jail( CHAR_DATA * ch, char *argument )
{
int blarg;
int jtimer;
char arg1[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0' )
{
send_to_char( "Jail whom?\n`RSyntax: `Yjail <player> <time>`w\n", ch );
return;
}
if ( ( victim = get_player_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( IS_SET( victim->act, PLR_JAILED ) )
{
if ( IS_NPC( victim ) )
{
blarg = victim->was_in_room->vnum;
}
else
{
if ( JAIL_RELEASE_RECALL == 1 )
blarg = victim->pcdata->recall_room->vnum;
else
blarg = JAIL_RELEASE_VNUM;
}
if ( JAIL_NOSHOUT == 1 )
{
REMOVE_BIT( victim->comm, COMM_NOSHOUT );
}
if ( JAIL_NOEMOTE == 1 )
{
REMOVE_BIT( victim->comm, COMM_NOEMOTE );
}
if ( JAIL_NOTELL == 1 )
{
REMOVE_BIT( victim->comm, COMM_NOTELL );
}
if ( JAIL_NOCHANNEL == 1 )
{
REMOVE_BIT( victim->comm, COMM_NOCHANNELS );
}
REMOVE_BIT( victim->act, PLR_JAILED );
send_to_char( "`WYour `Rjail term`W has been `clifted\n\r", victim );
if ( !IS_NPC( victim ) && ( JAIL_RELEASE_RECALL == 1 ) )
{
send_to_char
( "`Wand you are being teleported back to `Grecall`W.`w\n\r",
victim );
send_to_char( "Jail Lifted\n\r", ch );
char_from_room( victim );
victim->jail_timer = 0;
char_to_room( victim, get_room_index( blarg ) );
if ( IS_NPC( victim ) )
sprintf( buf, "%s frees %s from jail.", ch->name,
victim->short_descr );
else
sprintf( buf, "%s frees %s from jail.", ch->name,
victim->name );
do_sendinfo( ch, buf );
}
else
{
send_to_char
( "`Wand you are being teleported to the front gates of the jail.`w\n\r",
victim );
send_to_char( "Jail Lifted\n\r", ch );
char_from_room( victim );
char_to_room( victim, get_room_index( blarg ) );
sprintf( buf, "%s frees %s from jail.", ch->name, victim->name );
do_sendinfo( ch, buf );
}
}
else
{
if ( !is_number( arg2 ) )
{
send_to_char( "`YPlease enter a time in ticks`w\n", ch );
return;
}
jtimer = atoi( arg2 );
if ( jtimer <= -1 )
{
send_to_char( "`YPositive numbers only brainy.\n", ch );
return;
}
if ( jtimer == 0 )
{
jtimer = jtimer - 1;
victim->jail_timer = jtimer;
}
victim->jail_timer = jtimer;
if ( victim->jail_timer < 0 )
send_to_char( "`RYou have been Jailed indefinatly!!!!`w\n\r",
victim );
else
printf_to_char( victim,
"`RYou have been Jailed for %d hours!!!!.`w\n\r",
victim->jail_timer );
victim->jail_timer = victim->jail_timer;
send_to_char( "Jail set.\n\r", ch );
if ( IS_NPC( victim ) )
sprintf( buf, "%s has tossed %s in the slammer!", ch->name,
victim->short_descr );
else
sprintf( buf, "%s has tossed %s in the slammer!", ch->name,
victim->name );
if ( JAIL_NOSHOUT == 1 )
{
SET_BIT( victim->comm, COMM_NOSHOUT );
}
if ( JAIL_NOEMOTE == 1 )
{
SET_BIT( victim->comm, COMM_NOEMOTE );
}
if ( JAIL_NOTELL == 1 )
{
SET_BIT( victim->comm, COMM_NOTELL );
}
if ( JAIL_NOCHANNEL == 1 )
{
SET_BIT( victim->comm, COMM_NOCHANNELS );
}
SET_BIT( victim->act, PLR_JAILED );
if ( JAIL_REMOVES_EQ == 1 )
{
do_remove( victim, "all" );
}
victim->was_in_room = victim->in_room;
char_from_room( victim );
char_to_room( victim, get_room_index( JAIL_CELL_VNUM ) );
do_sendinfo( ch, buf );
}
return;
}
/* equips a character */
void do_outfit( CHAR_DATA * ch, char *argument )
{
OBJ_DATA *obj;
if ( ch->level > 5 || IS_NPC( ch ) )
{
send_to_char( "Find it yourself!\n\r", ch );
return;
}
if ( ( obj = get_eq_char( ch, WEAR_LIGHT ) ) == NULL )
{
obj = create_object( get_obj_index( OBJ_VNUM_SCHOOL_BANNER ), 0 );
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_LIGHT );
}
if ( ( obj = get_eq_char( ch, WEAR_BODY ) ) == NULL )
{
obj = create_object( get_obj_index( OBJ_VNUM_SCHOOL_VEST ), 0 );
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_BODY );
}
if ( ( obj = get_eq_char( ch, WEAR_SHIELD ) ) == NULL )
{
obj = create_object( get_obj_index( OBJ_VNUM_SCHOOL_SHIELD ), 0 );
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_SHIELD );
}
if ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL )
{
obj =
create_object( get_obj_index( class_table[ch->Class].weapon ), 0 );
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_WIELD );
}
send_to_char( "You have been equipped by the gods.\n\r", ch );
}
/* do_award function coded by Rindar (Ron Cole) and Raven (Laurie Zenner). */
void do_award( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
int value;
int level;
int levelvi;
char *maxed = NULL;
long maxlong = 2147483647;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if ( arg1[0] == '\0' || arg3[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: award <char> <amount> <type>.\n\r", ch );
send_to_char( "Valid types: alignment, experience, gold, object.\n\r",
ch );
send_to_char( "NOTE: Substitute the object's VNUM for the amount.\n\r",
ch );
return;
}
if ( strncmp( arg3, "alignment", strlen( arg3 ) )
&& strncmp( arg3, "experience", strlen( arg3 ) )
&& strncmp( arg3, "gold", strlen( arg3 ) )
&& strncmp( arg3, "qp", strlen( arg3 ) )
&& strncmp( arg3, "object", strlen( arg3 ) ) )
{
send_to_char
( "Valid types: alignment, experience, gold, qp, object.\n\r", ch );
send_to_char( "NOTE: Substitute the object's VNUM for the amount.\n\r",
ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "That person is not currently on-line.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
level = get_trust( ch );
levelvi = get_trust( victim );
if ( ( level <= levelvi ) && ( ch != victim ) )
{
send_to_char( "You can only award those of lesser trust level.", ch );
return;
}
value = atoi( arg2 );
if ( value == 0 )
{
send_to_char( "The value must not be equal to 0.\n\r", ch );
return;
}
if ( arg3[0] == 'a' ) /* alignment */
{
if ( value < -2000 || value > 2000 )
{
send_to_char
( "You can only alter someone's alignment by -2000 to 2000 points.\n\r",
ch );
return;
}
if ( ( victim->alignment + value ) > 1000 )
{
value = ( 1000 - victim->alignment );
victim->alignment = 1000;
maxed = "high";
}
else if ( ( victim->alignment + value ) < -1000 )
{
value = ( -1000 - victim->alignment );
victim->alignment = -1000;
maxed = "low";
}
else
victim->alignment += value;
if ( value == 0 )
{
sprintf( buf, "%s's alignment is already as %s as it can be.\n\r",
victim->name, maxed );
send_to_char( buf, ch );
return;
}
else
{
sprintf( buf, "You alter %s's alignment by %d points.\n\r",
victim->name, value );
send_to_char( buf, ch );
if ( value > 0 )
{
sprintf( buf, "Your soul feels lighter and more virtuous!" );
send_to_char( buf, victim );
return;
}
else
{
sprintf( buf, "You shudder deeply as your soul darkens." );
send_to_char( buf, victim );
return;
}
}
}
if ( arg3[0] == 'q' ) /* Quest Points */
{
if ( value < -2000 || value > 100 )
{
send_to_char
( "You can only alter someone's quest points by -2000 to 100 points.\n\r",
ch );
return;
}
if ( ( victim->qp + value ) > 2000 )
{
value = ( 2000 - victim->qp );
victim->qp = 2000;
maxed = "high";
}
else if ( ( victim->qp + value ) < -2000 )
{
value = ( -2000 - victim->qp );
victim->qp = -2000;
maxed = "low";
}
else
victim->qp += value;
if ( value == 0 )
{
sprintf( buf, "%s's qp is already as %s as it can be.\n\r",
victim->name, maxed );
send_to_char( buf, ch );
return;
}
else
{
sprintf( buf, "You alter %s's qp by %d points.\n\r",
victim->name, value );
send_to_char( buf, ch );
if ( value > 0 )
{
sprintf( buf,
"You receive %d quest points for your efforts!\n\r",
value );
send_to_char( buf, victim );
return;
}
else
{
sprintf( buf, "You are drained of %d quest points!\n\r",
value );
send_to_char( buf, victim );
return;
}
}
}
if ( arg3[0] == 'e' ) /* experience */
{
/* Cannot use the 'gain_exp' function since it won't
give experience if the player is in the arena and it
takes con away if they go below minimum experience
(which could make them self-destruct). That's just
too mean to do during an 'award', since it might happen
by mistake. */
if ( victim->level >= LEVEL_HERO )
{
sprintf( buf, "%s cannot receive experience bonuses",
victim->name );
send_to_char( buf, ch );
return;
}
if ( value < -1000000 || value > 1000000 )
{
send_to_char
( "You can only award between -1000000 and 1000000 experience.\n\r",
ch );
return;
}
if ( victim->exp < 0 && value < 0
&& victim->exp < ( ( -1 * maxlong ) - value ) )
{
value = ( -1 * maxlong ) - victim->exp;
victim->exp = ( -1 * maxlong );
maxed = "minumum";
}
else if ( victim->exp > 0 && value > 0
&& victim->exp > ( maxlong - value ) )
{
value = maxlong - victim->exp;
victim->exp = maxlong;
maxed = "maximum";
}
else
victim->exp += value;
if ( value == 0 )
{
sprintf( buf,
"%s already has the %s experience points possible.\n\r",
victim->name, maxed );
send_to_char( buf, ch );
return;
}
else
{
sprintf( buf, "You award %s %d experience points.\n\r",
victim->name, value );
send_to_char( buf, ch );
if ( value > 0 )
{
sprintf( buf,
"You receive %d experience points for your efforts!\n\r",
value );
send_to_char( buf, victim );
return;
}
else
{
sprintf( buf,
"You are drained of %d experience points!\n\r",
value );
send_to_char( buf, victim );
return;
}
}
}
if ( arg3[0] == 'g' ) /* gold */
{
if ( value < -9999999 || value > 9999999 )
{
send_to_char
( "You can only award between -9999999 and 9999999 gold.\n\r",
ch );
return;
}
if ( value < 0 && victim->gold < value )
{
value = -1 * victim->gold;
victim->gold = 0;
maxed = "minumum";
}
else if ( value > 0 && victim->gold > ( maxlong - value ) )
{
value = maxlong - victim->exp;
victim->exp = maxlong;
maxed = "maximum";
}
else
victim->gold += value;
if ( value == 0 )
{
sprintf( buf,
"%s already has the %s amount of gold allowed.\n\r",
victim->name, maxed );
send_to_char( buf, ch );
return;
}
else
{
sprintf( buf, "You award %s %d gold coins.\n\r", victim->name,
value );
send_to_char( buf, ch );
if ( value > 0 )
{
sprintf( buf,
"Your coin pouch grows heavier! You gain %d gold coins!\n\r",
value );
send_to_char( buf, victim );
return;
}
else
{
sprintf( buf,
"Your coin pouch grows lighter! You lose %d gold coins!\n\r",
value );
send_to_char( buf, victim );
return;
}
}
}
if ( arg3[0] == 'o' ) /* objects */
{
OBJ_INDEX_DATA *pObjIndex;
int level = get_trust( ch );
OBJ_DATA *obj;
if ( ( pObjIndex = get_obj_index( atoi( arg2 ) ) ) == NULL )
{
send_to_char( "There is no object with that vnum.\n\r", ch );
return;
}
obj = create_object( pObjIndex, level );
if ( victim->carry_number + get_obj_number( obj ) >
can_carry_n( victim ) )
{
sprintf( buf,
"Alas, %s is carrying too many items to receive that.\n\r",
victim->name );
send_to_char( buf, ch );
extract_obj( obj );
return;
}
if ( victim->carry_weight + get_obj_weight( obj ) >
can_carry_w( victim ) )
{
sprintf( buf, "Alas, that is too heavy for %s to carry.\n\r",
victim->name );
send_to_char( buf, ch );
extract_obj( obj );
return;
}
obj_to_char( obj, victim );
sprintf( buf, "You award %s item %d.\n\r", victim->name, value );
send_to_char( buf, ch );
sprintf( buf, "Your backpack seems heavier!\n\r" );
send_to_char( buf, victim );
return;
}
return;
}
/* RT nochannels command, for those spammers */
void do_nochannels( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Nochannel whom?", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( IS_SET( victim->comm, COMM_NOCHANNELS ) )
{
REMOVE_BIT( victim->comm, COMM_NOCHANNELS );
send_to_char( "The gods have restored your channel priviliges.\n\r",
victim );
send_to_char( "NOCHANNELS removed.\n\r", ch );
}
else
{
SET_BIT( victim->comm, COMM_NOCHANNELS );
send_to_char( "The gods have revoked your channel priviliges.\n\r",
victim );
send_to_char( "NOCHANNELS set.\n\r", ch );
}
return;
}
void do_bamfin( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
if ( !IS_NPC( ch ) )
{
smash_tilde( argument );
if ( argument[0] == '\0' )
{
sprintf( buf, "Your poofin is %s\n\r`w", ch->pcdata->bamfin );
send_to_char( buf, ch );
return;
}
if ( str_str( argument, ch->name ) == NULL )
{
send_to_char( "You must include your name.\n\r", ch );
return;
}
free_string( &ch->pcdata->bamfin );
sprintf( buf, "%s`w", argument );
ch->pcdata->bamfin = str_dup( buf );
sprintf( buf, "Your poofin is now %s\n\r`w", ch->pcdata->bamfin );
send_to_char( buf, ch );
}
return;
}
void do_bamfout( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
if ( !IS_NPC( ch ) )
{
smash_tilde( argument );
if ( argument[0] == '\0' )
{
sprintf( buf, "Your poofout is %s\n\r`w", ch->pcdata->bamfout );
send_to_char( buf, ch );
return;
}
if ( str_str( argument, ch->name ) == NULL )
{
send_to_char( "You must include your name.\n\r", ch );
return;
}
free_string( &ch->pcdata->bamfout );
sprintf( buf, "%s`w", argument );
ch->pcdata->bamfout = str_dup( buf );
sprintf( buf, "Your poofout is now %s\n\r`w", ch->pcdata->bamfout );
send_to_char( buf, ch );
}
return;
}
void do_deny( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Deny whom?\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( "Not on NPC's.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
SET_BIT( victim->act, PLR_DENY );
send_to_char( "You are denied access!\n\r", victim );
send_to_char( "OK.\n\r", ch );
save_char_obj( victim );
do_quit( victim, "" );
return;
}
void do_disconnect( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Disconnect whom?\n\r", ch );
return;
}
if ( ( victim = get_player_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim->desc == NULL )
{
act( "$N doesn't have a descriptor.", ch, NULL, victim, TO_CHAR );
return;
}
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d == victim->desc )
{
#if defined(cbuilder)
if ( d->character )
RemoveUser( d->character );
#endif
close_socket( d );
send_to_char( "Ok.\n\r", ch );
return;
}
}
bug( "Do_disconnect: desc not found.", 0 );
send_to_char( "Descriptor not found!\n\r", ch );
return;
}
void do_new_discon( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
int sock_num;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Disconnect whom?\n\r", ch );
return;
}
if ( !is_number( arg ) )
{
send_to_char
( "Argument must be numeric, use sockets to find number.\n\r", ch );
return;
}
sock_num = atoi( arg );
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d->descriptor == sock_num )
{
#if defined(cbuilder)
if ( d->character )
RemoveUser( d->character );
#endif
close_socket( d );
send_to_char( "Ok.\n\r", ch );
return;
}
}
send_to_char( "Descriptor not on list, use sockets.\n\r", ch );
return;
}
void do_pardon( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
if ( arg[0] == '\0' || arg2[0] == '\0' )
{
send_to_char( "Syntax: pardon <character> <killer|thief>.\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( "Not on NPC's.\n\r", ch );
return;
}
if ( !str_cmp( arg2, "killer" ) )
{
if ( IS_SET( victim->act, PLR_KILLER ) )
{
REMOVE_BIT( victim->act, PLR_KILLER );
send_to_char( "Killer flag removed.\n\r", ch );
send_to_char( "You are no longer a KILLER.\n\r", victim );
}
return;
}
if ( !str_cmp( arg2, "thief" ) )
{
if ( IS_SET( victim->act, PLR_THIEF ) )
{
REMOVE_BIT( victim->act, PLR_THIEF );
send_to_char( "Thief flag removed.\n\r", ch );
send_to_char( "You are no longer a THIEF.\n\r", victim );
}
return;
}
send_to_char( "Syntax: pardon <character> <killer|thief>.\n\r", ch );
return;
}
void do_echo( CHAR_DATA * ch, char *argument )
{
DESCRIPTOR_DATA *d;
char buff[MAX_STRING_LENGTH];
char buff2[MAX_STRING_LENGTH];
if ( argument[0] == '\0' )
{
send_to_char( "Global echo what?\n\r", ch );
return;
}
sprintf( buff, "%s\n\r", argument );
sprintf( buff2, "global> %s", buff );
#if defined(cbuilder)
ChannelMessage( buff2, NULL );
#endif
for ( d = descriptor_list; d; d = d->next )
{
if ( d->connected == CON_PLAYING )
{
if ( get_trust( d->character ) >= get_trust( ch ) )
send_to_char( buff2, d->character );
send_to_char( buff, d->character );
}
}
return;
}
void do_recho( CHAR_DATA * ch, char *argument )
{
DESCRIPTOR_DATA *d;
if ( argument[0] == '\0' )
{
send_to_char( "Local echo what?\n\r", ch );
return;
}
for ( d = descriptor_list; d; d = d->next )
{
if ( d->connected == CON_PLAYING
&& d->character->in_room == ch->in_room )
{
if ( get_trust( d->character ) >= get_trust( ch ) )
send_to_char( "local> ", d->character );
send_to_char( argument, d->character );
send_to_char( "\n\r`w", d->character );
}
}
return;
}
void do_pecho( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument( argument, arg );
if ( argument[0] == '\0' || arg[0] == '\0' )
{
send_to_char( "Personal echo what?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "Target not found.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch )
&& get_trust( ch ) != MAX_LEVEL )
send_to_char( "personal> ", victim );
send_to_char( argument, victim );
send_to_char( "\n\r`w", victim );
send_to_char( "personal> ", ch );
send_to_char( argument, ch );
send_to_char( "\n\r`w", ch );
}
ROOM_INDEX_DATA *find_location( CHAR_DATA * ch, char *arg )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
if ( is_number( arg ) && ( atoi( arg ) != ROOM_VNUM_SUPERMOB ) )
return get_room_index( atoi( arg ) );
if ( ( ( victim = get_char_world( ch, arg ) ) != NULL ) && ( !IS_NPC( victim ) /* +1 */
||
( IS_NPC
( victim )
&&
( victim->
pIndexData->
vnum !=
MOB_VNUM_SUPERMOB ) ) ) )
return victim->in_room;
if ( ( obj = get_obj_world( ch, arg ) ) != NULL )
return obj->in_room;
return NULL;
}
void do_transfer( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
if ( arg[0] == '\0' )
{
send_to_char( "Transfer whom (and where)?\n\r", ch );
return;
}
if ( !str_cmp( arg, "all" ) )
{
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d->connected == CON_PLAYING
&& d->character != ch
&& d->character->in_room != NULL
&& can_see( ch, d->character ) )
{
sprintf( buf, "%s %s", d->character->name, arg2 );
do_transfer( ch, buf );
}
}
return;
}
/*
* Thanks to Grodyn for the optional location parameter.
*/
if ( arg2[0] == '\0' )
{
location = ch->in_room;
}
else
{
if ( ( location = find_location( ch, arg2 ) ) == NULL )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if ( room_is_private( location ) && get_trust( ch ) < MAX_LEVEL )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( get_trust( victim ) > get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( victim->in_room == NULL )
{
send_to_char( "They are in limbo.\n\r", ch );
return;
}
if ( victim->fighting != NULL )
stop_fighting( victim, TRUE );
act( "$n disappears in a mushroom cloud.", victim, NULL, NULL, TO_ROOM );
char_from_room( victim );
char_to_room( victim, location );
act( "$n arrives from a puff of smoke.", victim, NULL, NULL, TO_ROOM );
if ( ch != victim )
act( "$n has transferred you.", ch, NULL, victim, TO_VICT );
do_look( victim, "auto" );
send_to_char( "Ok.\n\r", ch );
}
void do_at( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
ROOM_INDEX_DATA *original;
CHAR_DATA *wch;
OBJ_DATA *on;
argument = one_argument( argument, arg );
if ( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "At where what?\n\r", ch );
return;
}
if ( ( location = find_location( ch, arg ) ) == NULL )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if ( room_is_private( location ) && get_trust( ch ) < MAX_LEVEL )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
original = ch->in_room;
on = ch->on;
char_from_room( ch );
char_to_room( ch, location );
interpret( ch, argument );
/*
* See if 'ch' still exists before continuing!
* Handles 'at XXXX quit' case.
*/
for ( wch = char_list; wch != NULL; wch = wch->next )
{
if ( wch == ch )
{
char_from_room( ch );
char_to_room( ch, original );
ch->on = on;
break;
}
}
return;
}
void do_repop( CHAR_DATA * ch, char *argument )
{
AREA_DATA *pArea;
char buf[MAX_STRING_LENGTH];
bool found_area = FALSE;
int vnum;
if ( argument[0] == 0 )
{
reset_area( ch->in_room->area );
send_to_char( "Area repop!\n\r", ch );
}
if ( is_number( argument ) )
{
vnum = atoi( argument );
for ( pArea = area_first; pArea; pArea = pArea->next )
{
if ( pArea->vnum == vnum )
{
sprintf( buf, "%s has been repoped!\n\r", &pArea->name[8] );
send_to_char( buf, ch );
found_area = TRUE;
reset_area( pArea );
}
}
if ( !found_area )
send_to_char( "No such area!\n\r", ch );
}
if ( !strcmp( argument, "all" ) )
{
for ( pArea = area_first; pArea; pArea = pArea->next )
{
reset_area( pArea );
}
send_to_char( "World repop!\n\r", ch );
}
return;
}
void do_goto( CHAR_DATA * ch, char *argument )
{
ROOM_INDEX_DATA *location;
CHAR_DATA *rch;
if ( argument[0] == '\0' )
{
send_to_char( "Goto where?\n\r", ch );
return;
}
if ( ( location = find_location( ch, argument ) ) == NULL )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if ( room_is_private( location ) && get_trust( ch ) < MAX_LEVEL )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
if ( !can_see_room( ch, location ) && get_trust( ch ) < MAX_LEVEL )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
if ( ch->fighting != NULL )
stop_fighting( ch, TRUE );
for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
{
if ( get_trust( rch ) >= ch->invis_level )
{
if ( ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0' )
act( "$t", ch, ch->pcdata->bamfout, rch, TO_VICT );
else
act( "$n leaves in a swirling mist.", ch, NULL, rch, TO_VICT );
}
}
char_from_room( ch );
char_to_room( ch, location );
for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
{
if ( get_trust( rch ) >= ch->invis_level )
{
if ( ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0' )
act( "$t", ch, ch->pcdata->bamfin, rch, TO_VICT );
else
act( "$n appears in a swirling mist.", ch, NULL, rch, TO_VICT );
}
}
do_look( ch, "auto" );
return;
}
/* RT to replace the 3 stat commands */
void do_stat( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char *string;
OBJ_DATA *obj;
ROOM_INDEX_DATA *location;
CHAR_DATA *victim;
string = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " stat <name>\n\r", ch );
send_to_char( " stat obj <name>\n\r", ch );
send_to_char( " stat mob <name>\n\r", ch );
send_to_char( " stat room <number>\n\r", ch );
return;
}
if ( !str_cmp( arg, "room" ) )
{
do_rstat( ch, string );
return;
}
if ( !str_cmp( arg, "obj" ) )
{
do_ostat( ch, string );
return;
}
if ( !str_cmp( arg, "char" ) || !str_cmp( arg, "mob" ) )
{
do_mstat( ch, string );
return;
}
/* do it the old way */
obj = get_obj_world( ch, argument );
if ( obj != NULL )
{
do_ostat( ch, argument );
return;
}
victim = get_char_world( ch, argument );
if ( victim != NULL )
{
do_mstat( ch, argument );
return;
}
location = find_location( ch, argument );
if ( location != NULL )
{
do_rstat( ch, argument );
return;
}
send_to_char( "Nothing by that name found anywhere.\n\r", ch );
}
void do_rstat( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *location;
OBJ_DATA *obj;
CHAR_DATA *rch;
int door;
one_argument( argument, arg );
location = ( arg[0] == '\0' ) ? ch->in_room : find_location( ch, arg );
if ( location == NULL )
{
send_to_char( "No such location.\n\r", ch );
return;
}
if ( ch->in_room != location && room_is_private( location ) &&
get_trust( ch ) < MAX_LEVEL )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
sprintf( buf, "Name: '%s.'\n\rArea: '%s'.\n\r",
location->name, location->area->name );
send_to_char( buf, ch );
sprintf( buf,
"Vnum: %d. Sector: %d. Light: %d.\n\r",
location->vnum, location->sector_type, location->light );
send_to_char( buf, ch );
sprintf( buf,
"Room flags: %d.\n\rDescription:\n\r%s",
location->room_flags, location->description );
send_to_char( buf, ch );
if ( location->extra_descr != NULL )
{
EXTRA_DESCR_DATA *ed;
send_to_char( "Extra description keywords: '", ch );
for ( ed = location->extra_descr; ed; ed = ed->next )
{
send_to_char( ed->keyword, ch );
if ( ed->next != NULL )
send_to_char( " ", ch );
}
send_to_char( "'.\n\r", ch );
}
send_to_char( "Characters:", ch );
for ( rch = location->people; rch; rch = rch->next_in_room )
{
if ( can_see( ch, rch ) )
{
send_to_char( " ", ch );
one_argument( rch->name, buf );
send_to_char( buf, ch );
}
}
send_to_char( ".\n\rObjects: ", ch );
for ( obj = location->contents; obj; obj = obj->next_content )
{
send_to_char( " ", ch );
one_argument( obj->name, buf );
send_to_char( buf, ch );
}
send_to_char( ".\n\r", ch );
for ( door = 0; door <= 5; door++ )
{
EXIT_DATA *pexit;
if ( ( pexit = location->exit[door] ) != NULL )
{
sprintf( buf,
"Door: %d. To: %d. Key: %d. Exit flags: %d.\n\rKeyword: '%s'. Description: %s",
door,
( pexit->u1.to_room ==
NULL ? -1 : pexit->u1.to_room->vnum ), pexit->key,
pexit->exit_info, pexit->keyword,
pexit->description[0] !=
'\0' ? pexit->description : "(none).\n\r" );
send_to_char( buf, ch );
}
}
return;
}
void do_repeat( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
int count = 0;
argument = one_argument( argument, buf );
if ( strlen( buf ) < 1 || ( count = atoi( buf ) ) < 1
|| strlen( argument ) < 1 )
{
send_to_char( "Syntax: repeat <count> <command string>\r\n", ch );
return;
}
for ( ; count > 0; count-- )
interpret( ch, argument );
}
void do_ostat( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
AFFECT_DATA *paf;
OBJ_DATA *obj;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Stat what?\n\r", ch );
return;
}
if ( ( obj = get_obj_world( ch, argument ) ) == NULL )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
sprintf( buf, "Name(s): %s\n\r", obj->name );
send_to_char( buf, ch );
sprintf( buf, "Vnum: %d Type: %s Resets: %d\n\r",
obj->pIndexData->vnum, item_type_name( obj ),
obj->pIndexData->reset_num );
send_to_char( buf, ch );
sprintf( buf, "Short description: %s\n\rLong description: %s\n\r",
obj->short_descr, obj->description );
send_to_char( buf, ch );
sprintf( buf, "Wear bits: %s\n\rExtra bits: %s\n\r",
wear_bit_name( obj->wear_flags ),
extra_bit_name( obj->extra_flags ) );
send_to_char( buf, ch );
sprintf( buf, "Number: %d/%d Weight: %d/%d\n\r",
1, get_obj_number( obj ), obj->weight, get_obj_weight( obj ) );
send_to_char( buf, ch );
sprintf( buf, "Level: %d Cost: %d Condition: %d Timer: %d\n\r",
obj->level, obj->cost, obj->condition, obj->timer );
send_to_char( buf, ch );
sprintf( buf,
"In room: %d In object: %s Carried by: %s Wear_loc: %d\n\r",
obj->in_room == NULL ? 0 : obj->in_room->vnum,
obj->in_obj == NULL ? "(none)" : obj->in_obj->short_descr,
obj->carried_by == NULL ? "(none)" :
can_see( ch, obj->carried_by ) ? obj->carried_by->name
: "someone", obj->wear_loc );
send_to_char( buf, ch );
sprintf( buf, "Values: %d %d %d %d %d\n\r",
obj->value[0], obj->value[1], obj->value[2], obj->value[3],
obj->value[4] );
send_to_char( buf, ch );
/* now give out vital statistics as per identify */
switch ( obj->item_type )
{
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
sprintf( buf, "Level %d spells of:", obj->value[0] );
send_to_char( buf, ch );
if ( obj->value[1] >= 0 && obj->value[1] < MAX_SKILL )
{
send_to_char( " '", ch );
send_to_char( skill_table[obj->value[1]].name, ch );
send_to_char( "'", ch );
}
if ( obj->value[2] >= 0 && obj->value[2] < MAX_SKILL )
{
send_to_char( " '", ch );
send_to_char( skill_table[obj->value[2]].name, ch );
send_to_char( "'", ch );
}
if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
{
send_to_char( " '", ch );
send_to_char( skill_table[obj->value[3]].name, ch );
send_to_char( "'", ch );
}
send_to_char( ".\n\r", ch );
break;
case ITEM_WAND:
case ITEM_STAFF:
sprintf( buf, "Has %d(%d) charges of level %d",
obj->value[1], obj->value[2], obj->value[0] );
send_to_char( buf, ch );
if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
{
send_to_char( " '", ch );
send_to_char( skill_table[obj->value[3]].name, ch );
send_to_char( "'", ch );
}
send_to_char( ".\n\r", ch );
break;
case ITEM_WEAPON:
send_to_char( "Weapon type is ", ch );
switch ( obj->value[0] )
{
case ( WEAPON_EXOTIC ):
send_to_char( "exotic\n\r", ch );
break;
case ( WEAPON_SWORD ):
send_to_char( "sword\n\r", ch );
break;
case ( WEAPON_DAGGER ):
send_to_char( "dagger\n\r", ch );
break;
case ( WEAPON_SPEAR ):
send_to_char( "spear/staff\n\r", ch );
break;
case ( WEAPON_MACE ):
send_to_char( "mace/club\n\r", ch );
break;
case ( WEAPON_AXE ):
send_to_char( "axe\n\r", ch );
break;
case ( WEAPON_FLAIL ):
send_to_char( "flail\n\r", ch );
break;
case ( WEAPON_WHIP ):
send_to_char( "whip\n\r", ch );
break;
case ( WEAPON_POLEARM ):
send_to_char( "polearm\n\r", ch );
break;
default:
send_to_char( "unknown\n\r", ch );
break;
}
sprintf( buf, "Damage is %dd%d (average %d)\n\r",
obj->value[1], obj->value[2],
( 1 + obj->value[2] ) * obj->value[1] / 2 );
send_to_char( buf, ch );
if ( obj->value[4] ) /* weapon flags */
{
sprintf( buf, "Weapons flags: %s\n\r",
weapon_bit_name( obj->value[4] ) );
send_to_char( buf, ch );
}
break;
case ITEM_ARMOR:
sprintf( buf,
"Armor class is %d pierce, %d bash, %d slash, and %d vs. magic\n\r",
obj->value[0], obj->value[1], obj->value[2], obj->value[3] );
send_to_char( buf, ch );
break;
}
if ( obj->extra_descr != NULL || obj->pIndexData->extra_descr != NULL )
{
EXTRA_DESCR_DATA *ed;
send_to_char( "Extra description keywords: '", ch );
for ( ed = obj->extra_descr; ed != NULL; ed = ed->next )
{
send_to_char( ed->keyword, ch );
if ( ed->next != NULL )
send_to_char( " ", ch );
}
for ( ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next )
{
send_to_char( ed->keyword, ch );
if ( ed->next != NULL )
send_to_char( " ", ch );
}
send_to_char( "'\n\r", ch );
}
for ( paf = obj->affected; paf != NULL; paf = paf->next )
{
sprintf( buf, "Affects %s by %d, level %d.\n\r",
affect_loc_name( paf->location ), paf->modifier, paf->level );
send_to_char( buf, ch );
}
if ( !obj->enchanted )
for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next )
{
sprintf( buf, "Affects %s by %d, level %d.\n\r",
affect_loc_name( paf->location ), paf->modifier,
paf->level );
send_to_char( buf, ch );
}
return;
}
void do_mstat( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
AFFECT_DATA *paf;
NEWAFFECT_DATA *npaf;
CHAR_DATA *victim;
int x;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Stat whom?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
sprintf( buf, "Name: %s.\n\r", victim->name );
send_to_char( buf, ch );
sprintf( buf, "Vnum: %d Format: %s Race: %s Sex: %s Room: %d\n\r",
IS_NPC( victim ) ? victim->pIndexData->vnum : 0,
IS_NPC( victim ) ? "mob" : "pc",
race_table[victim->race].name,
victim->sex == SEX_MALE ? "male" :
victim->sex == SEX_FEMALE ? "female" : "neutral",
victim->in_room == NULL ? 0 : victim->in_room->vnum );
send_to_char( buf, ch );
if ( IS_NPC( victim ) )
{
sprintf( buf, "Count: %d Killed: %d\n\r",
victim->pIndexData->count, victim->pIndexData->killed );
send_to_char( buf, ch );
}
sprintf( buf,
"Str: %d(%d) Int: %d(%d) Wis: %d(%d) Dex: %d(%d) Con: %d(%d)\n\r",
victim->perm_stat[STAT_STR],
get_curr_stat( victim, STAT_STR ),
victim->perm_stat[STAT_INT],
get_curr_stat( victim, STAT_INT ),
victim->perm_stat[STAT_WIS],
get_curr_stat( victim, STAT_WIS ),
victim->perm_stat[STAT_DEX],
get_curr_stat( victim, STAT_DEX ),
victim->perm_stat[STAT_CON], get_curr_stat( victim, STAT_CON ) );
send_to_char( buf, ch );
sprintf( buf, "Hp: %d/%d Mana: %d/%d Move: %d/%d Practices: %d\n\r",
victim->hit, victim->max_hit,
victim->mana, victim->max_mana,
victim->move, victim->max_move,
IS_NPC( ch ) ? 0 : victim->practice );
send_to_char( buf, ch );
sprintf( buf,
"Lv: %d Class: %s Align: %d Gold: %ld Exp: %ld\n\r",
victim->level,
IS_NPC( victim ) ? "mobile" : class_table[victim->Class].name,
victim->alignment, victim->gold, victim->exp );
send_to_char( buf, ch );
sprintf( buf, "Armor: pierce: %d bash: %d slash: %d magic: %d\n\r",
GET_AC( victim, AC_PIERCE ), GET_AC( victim, AC_BASH ),
GET_AC( victim, AC_SLASH ), GET_AC( victim, AC_EXOTIC ) );
send_to_char( buf, ch );
sprintf( buf,
"Hit: %d Dam: %d Saves: %d Position: %d Wimpy: %d\n\r",
GET_HITROLL( victim ), GET_DAMROLL( victim ),
victim->saving_throw, victim->position, victim->wimpy );
send_to_char( buf, ch );
if ( IS_NPC( victim ) )
{
sprintf( buf, "Damage: %dd%d Message: %s\n\r",
victim->damage[DICE_NUMBER], victim->damage[DICE_TYPE],
attack_table[victim->dam_type].name );
send_to_char( buf, ch );
}
sprintf( buf, "Fighting: %s\n\r",
victim->fighting ? victim->fighting->name : "(none)" );
send_to_char( buf, ch );
if ( !IS_NPC( victim ) )
{
sprintf( buf,
"Thirst: %d Full: %d Drunk: %d\n\r",
victim->pcdata->condition[COND_THIRST],
victim->pcdata->condition[COND_FULL],
victim->pcdata->condition[COND_DRUNK] );
send_to_char( buf, ch );
}
sprintf( buf, "Carry number: %d Carry weight: %d\n\r",
victim->carry_number, victim->carry_weight );
send_to_char( buf, ch );
if ( !IS_NPC( victim ) )
{
sprintf( buf,
"Age: %d Played: %d Last Level: %d Timer: %d\n\r",
get_age( victim ),
( int ) ( victim->played + current_time -
victim->logon ) / 3600,
victim->pcdata->last_level, victim->timer );
send_to_char( buf, ch );
}
if ( !IS_NPC( victim ) )
{
sprintf( buf, "Recall: %d Incarnations: %d\n\r ",
victim->pcdata->recall_room->vnum, victim->incarnations );
send_to_char( buf, ch );
}
sprintf( buf, "Act: %s\n\r", act_bit_name( victim->act ) );
send_to_char( buf, ch );
printf_to_char( ch, "Jail Timer: %d\n\r", victim->jail_timer );
if ( victim->comm )
{
sprintf( buf, "Comm: %s\n\r", comm_bit_name( victim->comm ) );
send_to_char( buf, ch );
}
if ( IS_NPC( victim ) && victim->off_flags )
{
sprintf( buf, "Offense: %s\n\r", off_bit_name( victim->off_flags ) );
send_to_char( buf, ch );
}
if ( victim->imm_flags )
{
sprintf( buf, "Immune: %s\n\r", imm_bit_name( victim->imm_flags ) );
send_to_char( buf, ch );
}
if ( victim->res_flags )
{
sprintf( buf, "Resist: %s\n\r", imm_bit_name( victim->res_flags ) );
send_to_char( buf, ch );
}
if ( victim->vuln_flags )
{
sprintf( buf, "Vulnerable: %s\n\r",
imm_bit_name( victim->vuln_flags ) );
send_to_char( buf, ch );
}
sprintf( buf, "Form: %s\n\r", form_bit_name( victim->form ) );
send_to_char( buf, ch );
sprintf( buf, "Parts: %s\n\r", part_bit_name( victim->parts ) );
send_to_char( buf, ch );
if ( victim->affected_by )
{
sprintf( buf, "Affected by %s\n\r",
affect_bit_name( victim->affected_by ) );
send_to_char( buf, ch );
}
if ( victim->newaffected )
{
send_to_char( "NewAffected by: ", ch );
for ( x = 0; x < MAX_NEWAFF_BIT; x++ )
{
if ( IS_NEWAFF_SET( victim->newaff, x ) )
{
printf_to_char( ch, "In is new aff set" );
printf_to_char( ch, "%s ", newaff_table[x].name );
}
}
send_to_char( "\n\r", ch );
}
sprintf( buf, "Master: %s Leader: %s Pet: %s\n\r",
victim->master ? victim->master->name : "(none)",
victim->leader ? victim->leader->name : "(none)",
victim->pet ? victim->pet->name : "(none)" );
send_to_char( buf, ch );
if ( !IS_NPC( victim ) )
{
sprintf( buf, "Security: %d.\n\r", victim->pcdata->security ); /* OLC */
send_to_char( buf, ch ); /* OLC */
}
#ifdef AUTO_HATE
sprintf( buf, "Hating: %s\n\r",
victim->hate ? victim->hate->name : "(none)" );
send_to_char( buf, ch );
#endif
sprintf( buf, "Short description: %s\n\rLong description: %s",
victim->short_descr,
victim->long_descr[0] !=
'\0' ? victim->long_descr : "(none)\n\r" );
send_to_char( buf, ch );
for ( paf = victim->affected; paf != NULL; paf = paf->next )
{
sprintf( buf,
"Spell: '%s' modifies %s by %d for %d hours with bits %s, level %d.\n\r",
skill_table[( int ) paf->type].name,
affect_loc_name( paf->location ),
paf->modifier,
paf->duration, affect_bit_name( paf->bitvector ), paf->level );
send_to_char( buf, ch );
}
for ( npaf = victim->newaffected; npaf != NULL; npaf = npaf->next )
{
sprintf( buf,
"NewSpell: '%s' modifies %s by %d for %d hours at level %d with bits ",
skill_table[( int ) npaf->type].name,
affect_loc_name( npaf->location ),
npaf->modifier, npaf->duration, npaf->level );
send_to_char( buf, ch );
for ( x = 1; x < MAX_NEWAFF_BIT; x++ )
{
if ( IS_NEWAFF_SET( victim->newaff, x ) )
{
printf_to_char( ch, "%s.", newaff_table[x].name );
}
}
send_to_char( "\n\r", ch );
}
if ( !IS_NPC( victim ) )
{
sprintf( buf,
"E-Mail Addres: %s\n\rComment: %s\n\rSpouse: %s\n\rNemesis: %s\n\rPK Deaths: %d PK Kills: %d\n\rPoints: %d\n\r",
victim->pcdata->email, victim->pcdata->comment,
victim->pcdata->spouse, victim->pcdata->nemesis,
victim->pcdata->pk_deaths, victim->pcdata->pk_kills,
victim->pcdata->points );
send_to_char( buf, ch );
}
faction_stat( ch, victim );
return;
}
/* ofind and mfind replaced with vnum, vnum skill also added */
void do_vnum( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char *string;
string = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " vnum obj <name>\n\r", ch );
send_to_char( " vnum mob <name>\n\r", ch );
send_to_char( " vnum room <name>\n\r", ch );
send_to_char( " vnum skill <skill or spell>\n\r", ch );
send_to_char( " vnum mprog <name>\n\r", ch );
send_to_char( " vnum faction <name> or all\n\r", ch );
return;
}
if ( !str_prefix( arg, "obj" ) )
{
do_ofind( ch, string );
return;
}
if ( !str_prefix( arg, "mob" ) || !str_prefix( arg, "char" ) )
{
do_mfind( ch, string );
return;
}
if ( !str_prefix( arg, "room" ) )
{
do_rfind( ch, string );
return;
}
if ( !str_prefix( arg, "skill" ) || !str_prefix( arg, "spell" ) )
{
do_slookup( ch, string );
return;
}
if ( !str_prefix( arg, "mprog" ) || !str_prefix( arg, "prog" ) )
{
do_mpfind( ch, string );
return;
}
if ( !str_prefix( arg, "faction" ) )
{
do_factionfind( ch, string );
return;
}
/* do all */
do_mfind( ch, argument );
do_ofind( ch, argument );
do_rfind( ch, argument );
}
void do_mfind( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
extern int top_mob_index;
MOB_INDEX_DATA *pMobIndex;
int vnum;
int nMatch;
bool fAll;
bool found;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Find whom?\n\r", ch );
return;
}
fAll = FALSE; /* !str_cmp( arg, "all" ); */
found = FALSE;
nMatch = 0;
/*
* Yeah, so iterating over all vnum's takes 10,000 loops.
* Get_mob_index is fast, and I don't feel like threading another link.
* Do you?
* -- Furey
*/
for ( vnum = 0; nMatch < top_mob_index; vnum++ )
{
if ( ( pMobIndex = get_mob_index( vnum ) ) != NULL )
{
nMatch++;
if ( fAll || is_name( argument, pMobIndex->player_name ) )
{
found = TRUE;
sprintf( buf, "[M:%5d] %s\n\r",
pMobIndex->vnum, pMobIndex->short_descr );
send_to_char( buf, ch );
}
}
}
if ( !found )
send_to_char( "No mobiles by that name.\n\r", ch );
return;
}
void do_ofind( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
extern int top_obj_index;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
int nMatch;
bool fAll;
bool found;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Find what?\n\r", ch );
return;
}
fAll = FALSE;
found = FALSE;
nMatch = 0;
/*
* Yeah, so iterating over all vnum's takes 10,000 loops.
* Get_obj_index is fast, and I don't feel like threading another link.
* Do you?
* -- Furey
*/
for ( vnum = 0; nMatch < top_obj_index; vnum++ )
{
if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
{
nMatch++;
if ( fAll || is_name( argument, pObjIndex->name ) )
{
found = TRUE;
sprintf( buf, "[O:%5d] %s\n\r",
pObjIndex->vnum, pObjIndex->short_descr );
send_to_char( buf, ch );
}
}
}
if ( !found )
send_to_char( "No objects by that name.\n\r", ch );
return;
}
void do_rfind( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
extern int top_room;
ROOM_INDEX_DATA *pRoomIndex;
int vnum;
int nMatch;
bool fAll;
bool found;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Find where?\n\r", ch );
return;
}
fAll = FALSE; /* !str_cmp( arg, "all" ); */
found = FALSE;
nMatch = 0;
/*
* Yeah, so iterating over all vnum's takes 10,000 loops.
* Get_mob_index is fast, and I don't feel like threading another link.
* Do you?
* -- Furey
*/
for ( vnum = 0; nMatch < top_room; vnum++ )
{
if ( ( pRoomIndex = get_room_index( vnum ) ) != NULL )
{
nMatch++;
if ( fAll || is_name( argument, pRoomIndex->name ) )
{
if ( pRoomIndex->area )
{
found = TRUE;
sprintf( buf, "[R:%5d] %-28s [Area %3d] %s\n\r",
pRoomIndex->vnum, pRoomIndex->name,
pRoomIndex->area->vnum, pRoomIndex->area->name );
send_to_char( buf, ch );
}
else
{
found = TRUE;
sprintf( buf, "[R:%5d] %s\n\r",
pRoomIndex->vnum, pRoomIndex->name );
send_to_char( buf, ch );
}
}
}
}
if ( !found )
send_to_char( "No rooms by that name.\n\r", ch );
return;
}
void do_mpfind( CHAR_DATA * ch, char *argument )
{
MPROG_DATA *pMudProg;
MPROG_GROUP *pMprogGroup;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char progtype = 'M';
bool found;
bool fAll;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Find what?\n\r", ch );
return;
}
fAll = FALSE;
found = FALSE;
*buf = '\0';
if ( !str_cmp( arg, "all" ) )
{
fAll = TRUE;
}
for ( pMprogGroup = mprog_group_first; pMprogGroup;
pMprogGroup = pMprogGroup->next )
{
if ( fAll || is_name( argument, pMprogGroup->name ) )
{
found = TRUE;
switch ( pMprogGroup->prog_type )
{
case MOB_PROG:
progtype = 'M';
break;
case OBJ_PROG:
progtype = 'O';
break;
case ROOM_PROG:
progtype = 'R';
break;
}
sprintf( buf2, "[%cG:%4d] %s\n\r", progtype, pMprogGroup->vnum,
pMprogGroup->name );
if ( strlen( buf ) + strlen( buf2 ) >= sizeof( buf ) )
{
page_to_char( buf, ch );
*buf = '\0';
}
strcat( buf, buf2 );
}
}
for ( pMudProg = mudprog_first; pMudProg; pMudProg = pMudProg->next )
{
if ( fAll || is_name( argument, pMudProg->name ) )
{
found = TRUE;
switch ( pMudProg->prog_type )
{
case MOB_PROG:
progtype = 'M';
break;
case OBJ_PROG:
progtype = 'O';
break;
case ROOM_PROG:
progtype = 'R';
break;
}
sprintf( buf2, "[%cP:%4d] %s\n\r", progtype, pMudProg->vnum,
pMudProg->name );
if ( strlen( buf ) + strlen( buf2 ) >= sizeof( buf ) )
{
page_to_char( buf, ch );
*buf = '\0';
}
strcat( buf, buf2 );
}
}
if ( !found )
send_to_char( "No MudProgs or MudProg groups by that name.\n\r", ch );
else
page_to_char( buf, ch );
return;
}
void do_mwhere( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buffer[8 * MAX_STRING_LENGTH];
CHAR_DATA *victim;
bool found;
if ( argument[0] == '\0' )
{
send_to_char( "Mwhere whom?\n\r", ch );
return;
}
found = FALSE;
buffer[0] = '\0';
for ( victim = char_list; victim != NULL; victim = victim->next )
{
if ( IS_NPC( victim )
&& victim->in_room != NULL && is_name( argument, victim->name ) )
{
found = TRUE;
sprintf( buf, "[%5d] %-28s [%5d] %s\n\r",
victim->pIndexData->vnum,
victim->short_descr,
victim->in_room->vnum, victim->in_room->name );
strcat( buffer, buf );
}
}
if ( !found )
act( "You didn't find any $T.", ch, NULL, argument, TO_CHAR );
else if ( ch->lines )
page_to_char( buffer, ch );
else
send_to_char( buffer, ch );
return;
}
void do_owhere( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buffer[8 * MAX_STRING_LENGTH];
OBJ_DATA *obj;
bool found;
if ( argument[0] == '\0' )
{
send_to_char( "Owhere what?\n\r", ch );
return;
}
found = FALSE;
buffer[0] = '\0';
for ( obj = object_list; obj != NULL; obj = obj->next )
{
if ( ( obj->in_room || obj->in_obj || obj->carried_by )
&& is_name( argument, obj->name ) )
{
if ( obj->in_room )
{
found = TRUE;
sprintf( buf, "[%5d] %-28s [R:%5d] %s\n\r",
obj->pIndexData->vnum,
obj->short_descr,
obj->in_room->vnum, obj->in_room->name );
strcat( buffer, buf );
}
else if ( obj->in_obj )
{
found = TRUE;
sprintf( buf, "[%5d] %-28s [O:%5d] %s\n\r",
obj->pIndexData->vnum,
obj->short_descr,
obj->in_obj->pIndexData->vnum,
obj->in_obj->short_descr );
strcat( buffer, buf );
}
else if ( obj->carried_by )
{
if ( IS_NPC( obj->carried_by ) )
{
found = TRUE;
sprintf( buf, "[%5d] %-28s [M:%5d] %s\n\r",
obj->pIndexData->vnum,
obj->short_descr,
obj->carried_by->pIndexData->vnum,
obj->carried_by->name );
strcat( buffer, buf );
}
else
{
found = TRUE;
sprintf( buf, "[%5d] %-28s [Player] %s\n\r",
obj->pIndexData->vnum,
obj->short_descr, obj->carried_by->name );
strcat( buffer, buf );
}
}
}
}
if ( !found )
act( "You didn't find any $T.", ch, NULL, argument, TO_CHAR );
else if ( ch->lines )
page_to_char( buffer, ch );
else
send_to_char( buffer, ch );
return;
}
void do_reboo( CHAR_DATA * ch, char *argument )
{
send_to_char( "If you want to REBOOT, spell it out.\n\r", ch );
return;
}
void do_reboot( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
extern bool merc_down;
DESCRIPTOR_DATA *d, *d_next;
extern bool chaos;
#if defined(cbuilder)
extern bool Reboot;
#endif
if ( ( chaos ) && ( ch->Class != 4 ) )
{
send_to_char
( "Please remove `rC`RH`YA`RO`rS`w before rebooting.\n\r", ch );
return;
}
if ( IS_NPC( ch ) )
{
send_to_char( "Mobs dont need to be rebooting the mud.\n", ch );
return;
}
if ( !IS_SET( ch->act, PLR_WIZINVIS ) )
{
sprintf( buf, "Reboot by %s.", ch->name );
do_echo( ch, buf );
}
else
{
sprintf( buf, "Rebooting..." );
do_echo( ch, buf );
}
do_force( ch, "all save" );
if ( ch->Class != 4 )
do_save( ch, "" );
do_asave( ch, "changed" );
merc_down = TRUE;
for ( d = descriptor_list; d != NULL; d = d_next )
{
#if defined(cbuilder)
if ( d->character )
RemoveUser( d->character );
#endif
d_next = d->next;
close_socket( d );
}
#if defined(cbuilder)
Reboot = TRUE;
#endif
return;
}
/* Added to prevent my son, age 5, from hotbooting the mud by
* typing hot
*/
void do_hotboo( CHAR_DATA * ch, char *argument )
{
send_to_char( "Type it all out if you want to hotboot the mud.\n\r", ch );
return;
}
void do_shutdow( CHAR_DATA * ch, char *argument )
{
send_to_char( "If you want to SHUTDOWN, spell it out.\n\r", ch );
return;
}
void do_shutdown( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char strPath[MAX_STRING_LENGTH];
extern bool merc_down;
DESCRIPTOR_DATA *d, *d_next;
extern bool chaos;
if ( ( chaos ) && ( ch->Class != 4 ) )
{
send_to_char
( "Please remove `rC`RH`YA`RO`rS`w before shutting down.\n\r", ch );
return;
}
if ( IS_NPC( ch ) )
{
send_to_char( "Mobs dont need to be rebooting the mud.\n", ch );
return;
}
if ( !IS_SET( ch->act, PLR_WIZINVIS ) )
sprintf( buf, "Shutdown by %s.", ch->name );
else
sprintf( buf, "Shutting down." );
sprintf( strPath, "%s/%s", sysconfig.area_dir, sysconfig.shutdown_file );
append_file( ch, strPath, buf );
strcat( buf, "\n\r" );
do_echo( ch, buf );
do_force( ch, "all save" );
if ( ch->Class != 4 )
do_save( ch, "" );
do_asave( ch, "changed" );
merc_down = TRUE;
for ( d = descriptor_list; d != NULL; d = d_next )
{
#if defined(cbuilder)
if ( d->character )
RemoveUser( d->character );
#endif
d_next = d->next;
close_socket( d );
}
return;
}
void do_snoop( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Snoop whom?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim->desc == NULL )
{
send_to_char( "No descriptor to snoop.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "Cancelling all snoops.\n\r", ch );
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d->snoop_by == ch->desc )
d->snoop_by = NULL;
}
return;
}
if ( victim->desc->snoop_by != NULL )
{
send_to_char( "Busy already.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( ch->desc != NULL )
{
for ( d = ch->desc->snoop_by; d != NULL; d = d->snoop_by )
{
if ( d->character == victim || d->original == victim )
{
send_to_char( "No snoop loops.\n\r", ch );
return;
}
}
}
victim->desc->snoop_by = ch->desc;
send_to_char( "Ok.\n\r", ch );
return;
}
void do_switch( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Switch into whom?\n\r", ch );
return;
}
if ( ch->desc == NULL )
return;
if ( ch->desc->original != NULL )
{
send_to_char( "You are already switched.\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_SET( victim->act, PLR_JAILED ) )
{
send_to_char( "Cannot switch into jailed mobs", ch );
return;
}
if ( victim == ch )
{
send_to_char( "Ok.\n\r", ch );
return;
}
if ( !IS_NPC( victim ) )
{
send_to_char( "You can only switch into mobiles.\n\r", ch );
return;
}
if ( victim->desc != NULL )
{
send_to_char( "Character in use.\n\r", ch );
return;
}
if ( ch->pcdata->tick > 0 )
{
send_to_char
( "Mobs cannot use the tick option, so it has been turned off.\n\r",
ch );
}
ch->pcdata->tick = 0;
ch->desc->character = victim;
ch->desc->original = ch;
victim->desc = ch->desc;
ch->desc = NULL;
/* change communications to match */
victim->comm = ch->comm;
victim->lines = ch->lines;
send_to_char( "Ok.\n\r", victim );
return;
}
void do_return( CHAR_DATA * ch, char *argument )
{
if ( ch->desc == NULL )
return;
if ( ch->desc->original == NULL )
{
send_to_char( "You aren't switched.\n\r", ch );
return;
}
if ( IS_SET( ch->act, PLR_JAILED ) )
{
send_to_char
( "You have been jailed and will remain so until your jail sentence as a mob has been completed\n\r",
ch );
return;
}
send_to_char( "You return to your original body.\n\r", ch );
ch->desc->character = ch->desc->original;
ch->desc->original = NULL;
ch->desc->character->desc = ch->desc;
ch->desc = NULL;
return;
}
/* trust levels for load and clone */
bool obj_check( CHAR_DATA * ch, OBJ_DATA * obj )
{
if ( IS_TRUSTED( ch, GOD )
|| ( IS_TRUSTED( ch, IMMORTAL ) && obj->level <= 20
&& obj->cost <= 1000 ) || ( IS_TRUSTED( ch, DEMI )
&& obj->level <= 10
&& obj->cost <= 500 )
|| ( IS_TRUSTED( ch, ANGEL ) && obj->level <= 5
&& obj->cost <= 250 ) || ( IS_TRUSTED( ch, AVATAR )
&& obj->level == 0
&& obj->cost <= 100 ) )
return TRUE;
else
return FALSE;
}
/* for clone, to insure that cloning goes many levels deep */
void recursive_clone( CHAR_DATA * ch, OBJ_DATA * obj, OBJ_DATA * clone )
{
OBJ_DATA *c_obj, *t_obj;
for ( c_obj = obj->contains; c_obj != NULL; c_obj = c_obj->next_content )
{
if ( obj_check( ch, c_obj ) )
{
t_obj = create_object( c_obj->pIndexData, 0 );
clone_object( c_obj, t_obj );
obj_to_obj( t_obj, clone );
recursive_clone( ch, c_obj, t_obj );
}
}
}
/* command that is similar to load */
void do_clone( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char *rest;
CHAR_DATA *mob;
OBJ_DATA *obj;
rest = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Clone what?\n\r", ch );
return;
}
if ( !str_prefix( arg, "object" ) )
{
mob = NULL;
obj = get_obj_here( ch, rest );
if ( obj == NULL )
{
send_to_char( "You don't see that here.\n\r", ch );
return;
}
}
else if ( !str_prefix( arg, "mobile" ) || !str_prefix( arg, "character" ) )
{
obj = NULL;
mob = get_char_room( ch, rest );
if ( mob == NULL )
{
send_to_char( "You don't see that here.\n\r", ch );
return;
}
}
else /* find both */
{
mob = get_char_room( ch, argument );
obj = get_obj_here( ch, argument );
if ( mob == NULL && obj == NULL )
{
send_to_char( "You don't see that here.\n\r", ch );
return;
}
}
/* clone an object */
if ( obj != NULL )
{
OBJ_DATA *clone;
if ( !obj_check( ch, obj ) )
{
send_to_char
( "Your powers are not great enough for such a task.\n\r", ch );
return;
}
clone = create_object( obj->pIndexData, 0 );
clone_object( obj, clone );
if ( obj->carried_by != NULL )
obj_to_char( clone, ch );
else
obj_to_room( clone, ch->in_room );
recursive_clone( ch, obj, clone );
act( "$n has created $p.", ch, clone, NULL, TO_ROOM );
act( "You clone $p.", ch, clone, NULL, TO_CHAR );
return;
}
else if ( mob != NULL )
{
CHAR_DATA *clone;
OBJ_DATA *new_obj;
if ( !IS_NPC( mob ) )
{
send_to_char( "You can only clone mobiles.\n\r", ch );
return;
}
if ( ( mob->level > 20 && !IS_TRUSTED( ch, GOD ) )
|| ( mob->level > 10 && !IS_TRUSTED( ch, IMMORTAL ) )
|| ( mob->level > 5 && !IS_TRUSTED( ch, DEMI ) )
|| ( mob->level > 0 && !IS_TRUSTED( ch, ANGEL ) )
|| !IS_TRUSTED( ch, AVATAR ) )
{
send_to_char
( "Your powers are not great enough for such a task.\n\r", ch );
return;
}
clone = create_mobile( mob->pIndexData );
clone_mobile( mob, clone );
for ( obj = mob->carrying; obj != NULL; obj = obj->next_content )
{
if ( obj_check( ch, obj ) )
{
new_obj = create_object( obj->pIndexData, 0 );
clone_object( obj, new_obj );
recursive_clone( ch, obj, new_obj );
obj_to_char( new_obj, clone );
new_obj->wear_loc = obj->wear_loc;
}
}
char_to_room( clone, ch->in_room );
act( "$n has created $N.", ch, NULL, clone, TO_ROOM );
act( "You clone $N.", ch, NULL, clone, TO_CHAR );
return;
}
}
/* RT to replace the two load commands */
void do_load( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " load mob <vnum>\n\r", ch );
send_to_char( " load obj <vnum> <level>\n\r", ch );
return;
}
if ( !str_cmp( arg, "mob" ) || !str_cmp( arg, "char" ) )
{
do_mload( ch, argument );
return;
}
if ( !str_cmp( arg, "obj" ) )
{
do_oload( ch, argument );
return;
}
/* echo syntax */
do_load( ch, "" );
}
void do_mload( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
MOB_INDEX_DATA *pMobIndex;
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' || !is_number( arg ) )
{
send_to_char( "Syntax: load mob <vnum>.\n\r", ch );
return;
}
if ( ( pMobIndex = get_mob_index( atoi( arg ) ) ) == NULL )
{
send_to_char( "No mob has that vnum.\n\r", ch );
return;
}
victim = create_mobile( pMobIndex );
char_to_room( victim, ch->in_room );
act( "$n has created $N!", ch, NULL, victim, TO_ROOM );
send_to_char( "Ok.\n\r", ch );
return;
}
void do_oload( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
int level;
argument = one_argument( argument, arg );
one_argument( argument, arg2 );
if ( arg[0] == '\0' || !is_number( arg ) )
{
send_to_char( "Syntax: load obj <vnum> <level>.\n\r", ch );
return;
}
level = get_trust( ch ); /* default */
if ( arg2[0] != '\0' ) /* load with a level */
{
if ( !is_number( arg2 ) )
{
send_to_char( "Syntax: oload <vnum> <level>.\n\r", ch );
return;
}
level = atoi( arg2 );
if ( level < 0 || level > get_trust( ch ) )
{
send_to_char( "Level must be be between 0 and your level.\n\r",
ch );
return;
}
}
if ( ( pObjIndex = get_obj_index( atoi( arg ) ) ) == NULL )
{
send_to_char( "No object has that vnum.\n\r", ch );
return;
}
obj = create_object( pObjIndex, level );
if ( CAN_WEAR( obj, ITEM_TAKE ) )
obj_to_char( obj, ch );
else
obj_to_room( obj, ch->in_room );
act( "$n has created $p!", ch, obj, NULL, TO_ROOM );
send_to_char( "Ok.\n\r", ch );
return;
}
void do_purge( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj;
DESCRIPTOR_DATA *d;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
CHAR_DATA *vnext;
OBJ_DATA *obj_next;
for ( victim = ch->in_room->people; victim != NULL; victim = vnext )
{
vnext = victim->next_in_room;
if ( IS_NPC( victim ) && !IS_SET( victim->act, ACT_NOPURGE )
&& victim != ch /* safety precaution */ )
{
extract_char( victim, TRUE );
}
}
for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
{
obj_next = obj->next_content;
if ( !IS_OBJ_STAT( obj, ITEM_NOPURGE ) )
{
extract_obj( obj );
}
}
act( "`mYou are surrounded by purple flames as $n purges the room.`w",
ch, NULL, NULL, TO_ROOM );
send_to_char( "`mYou are surrounded in all consuming flames.\n\r`w",
ch );
return;
}
if ( ( obj = get_obj_list( ch, arg, ch->in_room->contents ) ) != NULL )
{
act( "You disintegrate $p.", ch, obj, NULL, TO_CHAR );
act( "$n disintegrates $p.", ch, obj, NULL, TO_ROOM );
extract_obj( obj );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "Nothing like that in heaven or hell.\n\r", ch );
return;
}
if ( !IS_NPC( victim ) )
{
if ( ch == victim )
{
send_to_char( "Ho ho ho.\n\r", ch );
return;
}
if ( get_trust( ch ) <= get_trust( victim ) )
{
send_to_char( "Maybe that wasn't a good idea...\n\r", ch );
sprintf( buf, "%s tried to purge you!\n\r", ch->name );
send_to_char( buf, victim );
return;
}
act( "$n disintegrates $N.", ch, 0, victim, TO_NOTVICT );
act( "You disintegrate $N.", ch, 0, victim, TO_CHAR );
save_char_obj( victim );
d = victim->desc;
extract_char( victim, TRUE );
if ( d != NULL )
{
#if defined(cbuilder)
if ( d->character )
{
RemoveUser( d->character );
}
#endif
close_socket( d );
}
return;
}
act( "$n purges $N.", ch, NULL, victim, TO_NOTVICT );
act( "You disintegrate $N.", ch, 0, victim, TO_CHAR );
extract_char( victim, TRUE );
return;
}
void do_advance( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buff[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int level;
int iLevel;
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
if ( arg[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: advance <char> <level>.\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "That player is not here.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( ( level = atoi( arg2 ) ) < 1 || level > MAX_LEVEL )
{
sprintf( buff, "Level must be 1 to %d.\n\r", MAX_LEVEL );
send_to_char( buff, ch );
return;
}
if ( level > get_trust( ch ) )
{
send_to_char( "Limited to your trust level.\n\r", ch );
return;
}
if ( victim->level > ch->level )
{
printf_to_char( ch,
"You're not powerful enough to do that to %s.\n\r",
victim->name );
printf_to_char( victim,
"%s just tried to lower your level with the advance command.",
ch->name );
return;
}
/*
* Lower level:
* Reset to level 1.
* Then raise again.
* Currently, an imp can lower another imp.
* -- Swiftest
*/
if ( level <= victim->level )
{
int temp_prac;
send_to_char( "Lowering a player's level!\n\r", ch );
send_to_char( "**** OOOOHHHHHHHHHH NNNNOOOO ****\n\r", victim );
temp_prac = victim->practice;
victim->level = 1;
victim->exp = 0;
victim->max_hit = 10;
victim->max_mana = 100;
victim->max_move = 100;
victim->pcdata->perm_hit = 10;
victim->pcdata->perm_mana = 100;
victim->pcdata->perm_move = 100;
victim->practice = 0;
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
advance_level( victim );
victim->practice = temp_prac;
}
else
{
send_to_char( "Raising a player's level!\n\r", ch );
send_to_char( "**** OOOOHHHHHHHHHH YYYYEEEESSS ****\n\r", victim );
}
for ( iLevel = victim->level; iLevel < level; iLevel++ )
{
send_to_char( "You raise a level!! ", victim );
victim->level += 1;
advance_level( victim );
}
victim->exp = 0;
victim->trust = 0;
save_char_obj( victim );
return;
}
void do_trust( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buff[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int level;
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
if ( arg[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
{
send_to_char( "Syntax: trust <char> <level>.\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "That player is not here.\n\r", ch );
return;
}
if ( ( level = atoi( arg2 ) ) < 0 || level > MAX_LEVEL )
{
sprintf( buff, "Level must be 0 (reset) or 1 to %d.\n\r", MAX_LEVEL );
send_to_char( buff, ch );
return;
}
if ( get_trust( ch ) <= get_trust( victim ) )
{
send_to_char( "Nice try.\n\r", ch );
return;
}
if ( level > get_trust( ch ) )
{
send_to_char( "Limited to your trust.\n\r", ch );
return;
}
victim->trust = level;
return;
}
void do_restore( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *vch;
DESCRIPTOR_DATA *d;
one_argument( argument, arg );
if ( arg[0] == '\0' || !str_cmp( arg, "room" ) )
{
/* cure room */
for ( vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room )
{
affect_strip( vch, gsn_plague );
affect_strip( vch, gsn_poison );
affect_strip( vch, gsn_blindness );
affect_strip( vch, gsn_sleep );
affect_strip( vch, gsn_curse );
vch->hit = vch->max_hit;
vch->mana = vch->max_mana;
vch->move = vch->max_move;
update_pos( vch );
act( "$n has restored you.", ch, NULL, vch, TO_VICT );
}
send_to_char( "Room restored.\n\r", ch );
return;
}
if ( get_trust( ch ) >= MAX_LEVEL && !str_cmp( arg, "all" ) )
{
/* cure all */
for ( d = descriptor_list; d != NULL; d = d->next )
{
victim = d->character;
if ( victim == NULL || IS_NPC( victim ) )
continue;
affect_strip( victim, gsn_plague );
affect_strip( victim, gsn_poison );
affect_strip( victim, gsn_blindness );
affect_strip( victim, gsn_sleep );
affect_strip( victim, gsn_curse );
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
update_pos( victim );
if ( victim->in_room != NULL )
act( "$n has restored you.", ch, NULL, victim, TO_VICT );
}
send_to_char( "All active players restored.\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
affect_strip( victim, gsn_plague );
affect_strip( victim, gsn_poison );
affect_strip( victim, gsn_blindness );
affect_strip( victim, gsn_sleep );
affect_strip( victim, gsn_curse );
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
update_pos( victim );
act( "$n has restored you.", ch, NULL, victim, TO_VICT );
send_to_char( "Ok.\n\r", ch );
return;
}
void do_freeze( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Freeze whom?\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( "Not on NPC's.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( IS_SET( victim->act, PLR_FREEZE ) )
{
REMOVE_BIT( victim->act, PLR_FREEZE );
send_to_char( "You can play again.\n\r", victim );
send_to_char( "FREEZE removed.\n\r", ch );
}
else
{
SET_BIT( victim->act, PLR_FREEZE );
send_to_char( "You can't do ANYthing!\n\r", victim );
send_to_char( "FREEZE set.\n\r", ch );
}
save_char_obj( victim );
return;
}
void do_log( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Log whom?\n\r", ch );
return;
}
if ( !str_cmp( arg, "all" ) )
{
if ( fLogAll )
{
fLogAll = FALSE;
send_to_char( "Log ALL off.\n\r", ch );
}
else
{
fLogAll = TRUE;
send_to_char( "Log ALL on.\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( "Not on NPC's.\n\r", ch );
return;
}
/*
* No level check, gods can log anyone.
*/
if ( IS_SET( victim->act, PLR_LOG ) )
{
REMOVE_BIT( victim->act, PLR_LOG );
send_to_char( "LOG removed.\n\r", ch );
}
else
{
SET_BIT( victim->act, PLR_LOG );
send_to_char( "LOG set.\n\r", ch );
}
return;
}
void do_noemote( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Noemote whom?\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( "Not on NPC's.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( IS_SET( victim->comm, COMM_NOEMOTE ) )
{
REMOVE_BIT( victim->comm, COMM_NOEMOTE );
send_to_char( "You can emote again.\n\r", victim );
send_to_char( "NOEMOTE removed.\n\r", ch );
}
else
{
SET_BIT( victim->comm, COMM_NOEMOTE );
send_to_char( "You can't emote!\n\r", victim );
send_to_char( "NOEMOTE set.\n\r", ch );
}
return;
}
void do_noshout( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Noshout whom?\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( "Not on NPC's.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( IS_SET( victim->comm, COMM_NOSHOUT ) )
{
REMOVE_BIT( victim->comm, COMM_NOSHOUT );
send_to_char( "You can shout again.\n\r", victim );
send_to_char( "NOSHOUT removed.\n\r", ch );
}
else
{
SET_BIT( victim->comm, COMM_NOSHOUT );
send_to_char( "You can't shout!\n\r", victim );
send_to_char( "NOSHOUT set.\n\r", ch );
}
return;
}
void do_notell( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Notell whom?", 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( "Not on NPC's.\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( IS_SET( victim->comm, COMM_NOTELL ) )
{
REMOVE_BIT( victim->comm, COMM_NOTELL );
send_to_char( "You can tell again.\n\r", victim );
send_to_char( "NOTELL removed.\n\r", ch );
}
else
{
SET_BIT( victim->comm, COMM_NOTELL );
send_to_char( "You can't tell!\n\r", victim );
send_to_char( "NOTELL set.\n\r", ch );
}
return;
}
void do_peace( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *rch;
for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
{
if ( rch->fighting != NULL )
stop_fighting( rch, TRUE );
if ( IS_NPC( rch ) && IS_SET( rch->act, ACT_AGGRESSIVE ) )
REMOVE_BIT( rch->act, ACT_AGGRESSIVE );
#ifdef AUTO_HATE
stop_hating( rch );
#endif
}
send_to_char( "Ok.\n\r", ch );
return;
}
/* The ban functions that use to be here have been ripped out to make room
for the new ban and permban. -Lancelight */
void do_wizlock( CHAR_DATA * ch, char *argument )
{
extern bool wizlock;
wizlock = !wizlock;
if ( wizlock )
send_to_char( "Game wizlocked.\n\r", ch );
else
send_to_char( "Game un-wizlocked.\n\r", ch );
return;
}
/* RT anti-newbie code */
void do_newlock( CHAR_DATA * ch, char *argument )
{
extern bool newlock;
newlock = !newlock;
if ( newlock )
send_to_char( "New characters have been locked out.\n\r", ch );
else
send_to_char( "Newlock removed.\n\r", ch );
return;
}
void do_slookup( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int sn;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Lookup which skill or spell?\n\r", ch );
return;
}
if ( !str_cmp( arg, "all" ) )
{
for ( sn = 0; sn < MAX_SKILL; sn++ )
{
if ( skill_table[sn].name == NULL )
break;
sprintf( buf, "Sn: %3d Slot: %3d Skill/spell: '%s'\n\r",
sn, skill_table[sn].slot, skill_table[sn].name );
send_to_char( buf, ch );
}
}
else
{
if ( ( sn = skill_lookup( arg ) ) < 0 )
{
send_to_char( "No such skill or spell.\n\r", ch );
return;
}
sprintf( buf, "Sn: %3d Slot: %3d Skill/spell: '%s'\n\r",
sn, skill_table[sn].slot, skill_table[sn].name );
send_to_char( buf, ch );
}
return;
}
/* RT set replaces sset, mset, oset, and rset */
void do_set( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " set char <name> <field> <value>\n\r", ch );
send_to_char( " set mob <name> <field> <value>\n\r", ch );
send_to_char( " set obj <name> <field> <value>\n\r", ch );
send_to_char( " set room <room> <field> <value>\n\r", ch );
send_to_char( " set skill <name> <spell or skill> <value>\n\r", ch );
return;
}
if ( !str_prefix( arg, "mobile" ) || !str_prefix( arg, "character" ) )
{
do_mset( ch, argument );
return;
}
if ( !str_prefix( arg, "skill" ) || !str_prefix( arg, "spell" ) )
{
do_sset( ch, argument );
return;
}
if ( !str_prefix( arg, "object" ) )
{
do_oset( ch, argument );
return;
}
if ( !str_prefix( arg, "room" ) )
{
do_rset( ch, argument );
return;
}
/* echo syntax */
do_set( ch, "" );
}
void do_sset( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int value;
int sn;
bool fAll;
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if ( arg[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " set skill <name> <spell or skill> <value>\n\r", ch );
send_to_char( " set skill <name> all <value>\n\r", ch );
send_to_char( " (use the name of the skill, not the number)\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( "Not on NPC's.\n\r", ch );
return;
}
fAll = !str_cmp( arg2, "all" );
sn = 0;
if ( !fAll && ( sn = skill_lookup( arg2 ) ) < 0 )
{
send_to_char( "No such skill or spell.\n\r", ch );
return;
}
/*
* Snarf the value.
*/
if ( !is_number( arg3 ) )
{
send_to_char( "Value must be numeric.\n\r", ch );
return;
}
value = atoi( arg3 );
if ( value < 0 || value > 100 )
{
send_to_char( "Value range is 0 to 100.\n\r", ch );
return;
}
if ( fAll )
{
for ( sn = 0; sn < MAX_SKILL; sn++ )
{
if ( skill_table[sn].name != NULL )
victim->pcdata->learned[sn] = value;
}
}
else
{
victim->pcdata->learned[sn] = value;
}
return;
}
void do_mset( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char arg4[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
ROOM_INDEX_DATA *location;
int value;
smash_tilde( argument );
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
argument = one_argument( argument, arg4 );
argument = one_argument( argument, arg4 );
if ( ( arg[0] == '\0' ) || ( arg2[0] == '\0' ) || ( arg3[0] == '\0' ) )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " set char <name> <field> <value>\n\r", ch );
send_to_char( " set char <name> faction <vnum> <value>\n\r\n\r", ch );
send_to_char( "Field being one of:\n\r", ch );
send_to_char( " str int wis dex con sex class level\n\r", ch );
send_to_char( " race gold hp mana move practice align\n\r", ch );
send_to_char( " train thirst drunk full security recall\n\r", ch );
send_to_char( " vlower vupper whorace whoprefix\n\r", ch );
/* send_to_char( " clan\n\r",ch ); */
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( ( victim != ch && !IS_NPC( victim ) )
&& ( get_trust( ch ) <= get_trust( victim ) ) )
{
send_to_char
( "You cannot modify a character of equal or higher level.\n\r",
ch );
return;
}
/*
* Snarf the value (which need not be numeric).
*/
value = is_number( arg3 ) ? atoi( arg3 ) : -1;
/*
* Set Faction.
*/
if ( !str_prefix( arg2, "faction" ) )
{
one_argument( arg3, arg3 );
value = is_number( arg3 ) ? atoi( arg3 ) : -1;
if ( value < 1 )
{
send_to_char( "Invalid faction vnum\n\r", ch );
return;
}
if ( arg4[0] == '\0' )
{
send_to_char( "Invalid faction value\n\r", ch );
return;
}
set_faction( ch, victim, ( sh_int ) value, ( sh_int ) atoi( arg4 ) );
return;
}
/*
* Set something.
*/
if ( !str_prefix( arg2, "str" ) )
{
if ( value < 3 || value > get_max_train( victim, STAT_STR ) )
{
sprintf( buf,
"Strength range is 3 to %d\n\r.",
get_max_train( victim, STAT_STR ) );
send_to_char( buf, ch );
return;
}
victim->perm_stat[STAT_STR] = value;
return;
}
if ( !str_prefix( arg2, "vlower" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( value < 0 || value > victim->pcdata->vnum_range[1] )
{
send_to_char( "Syntex Error:\n\r", ch );
send_to_char( "1) vlower has to be less than vupper\n\r", ch );
send_to_char( "2) you have not set the vupper range yet\n\r", ch );
return;
}
victim->pcdata->vnum_range[0] = value;
printf_to_char( ch, "%s's Lower Vnum has been set to %d\n\r",
victim->name, value );
return;
}
if ( !str_prefix( arg2, "vupper" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( value < victim->pcdata->vnum_range[0] )
{
send_to_char
( "Invalid VNUM. The Vnum must be greater then the lower vnum.\n\r",
ch );
return;
}
victim->pcdata->vnum_range[1] = value;
printf_to_char( ch, "%s's Upper Vnum has been set to %d\n\r",
victim->name, value );
return;
}
if ( !str_prefix( arg2, "int" ) )
{
if ( value < 3 || value > get_max_train( victim, STAT_INT ) )
{
sprintf( buf,
"Intelligence range is 3 to %d.\n\r",
get_max_train( victim, STAT_INT ) );
send_to_char( buf, ch );
return;
}
victim->perm_stat[STAT_INT] = value;
return;
}
if ( !str_prefix( arg2, "wis" ) )
{
if ( value < 3 || value > get_max_train( victim, STAT_WIS ) )
{
sprintf( buf,
"Wisdom range is 3 to %d.\n\r", get_max_train( victim,
STAT_WIS ) );
send_to_char( buf, ch );
return;
}
victim->perm_stat[STAT_WIS] = value;
return;
}
if ( !str_prefix( arg2, "dex" ) )
{
if ( value < 3 || value > get_max_train( victim, STAT_DEX ) )
{
sprintf( buf,
"Dexterity ranges is 3 to %d.\n\r",
get_max_train( victim, STAT_DEX ) );
send_to_char( buf, ch );
return;
}
victim->perm_stat[STAT_DEX] = value;
return;
}
if ( !str_prefix( arg2, "con" ) )
{
if ( value < 3 || value > get_max_train( victim, STAT_CON ) )
{
sprintf( buf,
"Constitution range is 3 to %d.\n\r",
get_max_train( victim, STAT_CON ) );
send_to_char( buf, ch );
return;
}
victim->perm_stat[STAT_CON] = value;
return;
}
if ( !str_prefix( arg2, "sex" ) )
{
if ( value < 0 || value > 2 )
{
send_to_char( "Sex range is 0 to 2.\n\r", ch );
return;
}
victim->sex = value;
if ( !IS_NPC( victim ) )
victim->pcdata->true_sex = value;
return;
}
if ( !str_prefix( arg2, "class" ) )
{
int Class;
if ( IS_NPC( victim ) )
{
send_to_char( "Mobiles have no class.\n\r", ch );
return;
}
Class = class_lookup( arg3 );
if ( Class == -1 )
{
strcpy( buf, "Possible classes are: " );
for ( Class = 0; Class < MAX_CLASS; Class++ )
{
if ( Class > 0 )
strcat( buf, " " );
strcat( buf, class_table[Class].name );
}
strcat( buf, ".\n\r" );
send_to_char( buf, ch );
return;
}
victim->Class = Class;
return;
}
if ( !str_prefix( arg2, "level" ) )
{
if ( !IS_NPC( victim ) )
{
send_to_char( "Not on PC's.\n\r", ch );
return;
}
if ( value < 0 || value > MAX_LEVEL )
{
sprintf( buf, "Level range is 0 to %d.\n\r", MAX_LEVEL );
send_to_char( buf, ch );
return;
}
victim->level = value;
return;
}
if ( !str_prefix( arg2, "gold" ) )
{
victim->gold = value;
return;
}
if ( !str_prefix( arg2, "hp" ) )
{
if ( value < -10 || value > 30000 )
{
send_to_char( "Hp range is -10 to 30,000 hit points.\n\r", ch );
return;
}
victim->max_hit = value;
if ( !IS_NPC( victim ) )
victim->pcdata->perm_hit = value;
return;
}
if ( !str_prefix( arg2, "mana" ) )
{
if ( value < 0 || value > 30000 )
{
send_to_char( "Mana range is 0 to 30,000 mana points.\n\r", ch );
return;
}
victim->max_mana = value;
if ( !IS_NPC( victim ) )
victim->pcdata->perm_mana = value;
return;
}
if ( !str_prefix( arg2, "move" ) )
{
if ( value < 0 || value > 30000 )
{
send_to_char( "Move range is 0 to 30,000 move points.\n\r", ch );
return;
}
victim->max_move = value;
if ( !IS_NPC( victim ) )
victim->pcdata->perm_move = value;
return;
}
if ( !str_prefix( arg2, "practice" ) )
{
if ( value < 0 || value > 250 )
{
send_to_char( "Practice range is 0 to 250 sessions.\n\r", ch );
return;
}
victim->practice = value;
return;
}
if ( !str_prefix( arg2, "train" ) )
{
if ( value < 0 || value > 50 )
{
send_to_char( "Training session range is 0 to 50 sessions.\n\r",
ch );
return;
}
victim->train = value;
return;
}
if ( !str_prefix( arg2, "align" ) )
{
if ( value < -1000 || value > 1000 )
{
send_to_char( "Alignment range is -1000 to 1000.\n\r", ch );
return;
}
victim->alignment = value;
return;
}
if ( !str_prefix( arg2, "thirst" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( value < -1 || value > 100 )
{
send_to_char( "Thirst range is -1 to 100.\n\r", ch );
return;
}
victim->pcdata->condition[COND_THIRST] = value;
return;
}
if ( !str_prefix( arg2, "drunk" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( value < -1 || value > 100 )
{
send_to_char( "Drunk range is -1 to 100.\n\r", ch );
return;
}
victim->pcdata->condition[COND_DRUNK] = value;
return;
}
if ( !str_prefix( arg2, "full" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( value < -1 || value > 100 )
{
send_to_char( "Full range is -1 to 100.\n\r", ch );
return;
}
victim->pcdata->condition[COND_FULL] = value;
return;
}
if ( !str_prefix( arg2, "race" ) )
{
int race;
race = race_lookup( arg3 );
if ( race == 0 )
{
send_to_char( "That is not a valid race.\n\r", ch );
return;
}
if ( !IS_NPC( victim ) && !race_table[race].pc_race )
{
send_to_char( "That is not a valid player race.\n\r", ch );
return;
}
victim->race = race;
return;
}
if ( !str_prefix( arg2, "security" ) ) /* OLC */
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
/* Why should IMPs have to have security 9 to change anything?
Changed by Kyle to be less annoying to new IMPs. */
if ( ( value > ch->pcdata->security || value < 0 )
&& get_trust( ch ) < MAX_LEVEL )
{
if ( ch->pcdata->security != 0 )
{
sprintf( buf, "Valid security is 0-%d.\n\r",
ch->pcdata->security );
send_to_char( buf, ch );
}
else
{
send_to_char( "Valid security is 0 only.\n\r", ch );
}
return;
}
else if ( value > 9 || value < 0 )
{
send_to_char( "Valid security is 0-9.\n\r", ch );
return;
}
victim->pcdata->security = value;
return;
}
if ( !str_prefix( arg2, "recall" ) ) /* Thexder */
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( ( location = find_location( ch, arg3 ) ) == NULL )
{
send_to_char( "That is an invalid location.\n\r", ch );
return;
}
else
{
victim->pcdata->recall_room = location;
send_to_char( "Recall set.\n\r", ch );
return;
}
}
if ( !str_prefix( arg2, "whorace" ) ) /* By Kyle */
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( !str_cmp( arg3, "normal" )
|| !str_cmp( arg3, "default" ) || !str_cmp( arg3, "none" ) )
{
free_string( &victim->pcdata->who_race );
send_to_char( "Race now shows the actual race.\n\r", ch );
return;
}
if ( str_len( arg3 ) > 10 )
{
send_to_char
( "Too long, length is limited to 10 characters not counting color.\n\r",
ch );
return;
}
if ( str_len( arg3 ) < 10 )
{
int numpads = 0;
int extrapad = 0;
int x = 0;
extrapad = ( 10 - str_len( arg3 ) ) % 2;
numpads = ( 10 - str_len( arg3 ) - extrapad ) / 2;
if ( numpads > 0 )
{
sprintf( buf, "%*s", numpads + str_len( arg3 ), arg3 );
strcpy( arg3, buf );
}
for ( x = 0; x < numpads + extrapad; x++ )
strcat( arg3, " " );
}
free_string( &victim->pcdata->who_race );
smash_tilde( arg3 );
victim->pcdata->who_race = str_dup( arg3 );
send_to_char( "Whorace set.\n\r", ch );
return;
}
if ( !str_prefix( arg2, "whoprefix" ) ) /* By Kyle */
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( !str_cmp( arg3, "normal" )
|| !str_cmp( arg3, "default" ) || !str_cmp( arg3, "none" ) )
{
free_string( &victim->pcdata->who_prefix );
send_to_char( "Prefix removed.\n\r", ch );
return;
}
if ( str_len( arg3 ) > 20 )
{
send_to_char
( "Too long, length is limited to 20 characters not counting color.\n\r",
ch );
return;
}
free_string( &victim->pcdata->who_prefix );
smash_tilde( arg3 );
victim->pcdata->who_prefix = str_dup( arg3 );
send_to_char( "Whoprefix set.\n\r", ch );
return;
}
/*
* Generate usage message.
*/
do_mset( ch, "" );
return;
}
void do_string( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char type[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj;
smash_tilde( argument );
argument = one_argument( argument, type );
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if ( type[0] == '\0' || arg[0] == '\0' || arg2[0] == '\0'
|| arg3[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " string char <name> <field> <string>\n\r", ch );
send_to_char( " fields: name short long desc title spec\n\r", ch );
send_to_char( " string obj <name> <field> <string>\n\r", ch );
send_to_char( " fields: name short long extended\n\r", ch );
send_to_char( " For stringing extended descriptions:\n\r", ch );
send_to_char
( " string obj <name> extended <keyword> <string>\n\r", ch );
return;
}
if ( !str_prefix( type, "character" ) || !str_prefix( type, "mobile" ) )
{
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
/* string something */
if ( !str_prefix( arg2, "name" ) )
{
if ( !IS_NPC( victim ) )
{
send_to_char( "Not on PC's.\n\r", ch );
return;
}
free_string( &victim->name );
victim->name = str_dup( arg3 );
return;
}
if ( !str_prefix( arg2, "description" ) )
{
free_string( &victim->description );
string_append( ch, &victim->description );
return;
}
if ( !str_prefix( arg2, "short" ) )
{
free_string( &victim->short_descr );
victim->short_descr = str_dup( arg3 );
return;
}
if ( !str_prefix( arg2, "long" ) )
{
free_string( &victim->long_descr );
strcat( arg3, "\n\r" );
victim->long_descr = str_dup( arg3 );
return;
}
if ( !str_prefix( arg2, "title" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
set_title( victim, arg3 );
return;
}
}
if ( !str_prefix( type, "object" ) )
{
/* string an obj */
if ( ( obj = get_obj_world( ch, arg ) ) == NULL )
{
send_to_char( "Nothing like that in heaven or earth.\n\r", ch );
return;
}
if ( !str_prefix( arg2, "name" ) )
{
free_string( &obj->name );
obj->name = str_dup( arg3 );
return;
}
if ( !str_prefix( arg2, "short" ) )
{
free_string( &obj->short_descr );
obj->short_descr = str_dup( arg3 );
return;
}
if ( !str_prefix( arg2, "long" ) )
{
free_string( &obj->description );
obj->description = str_dup( arg3 );
return;
}
if ( !str_prefix( arg2, "ed" ) || !str_prefix( arg2, "extended" ) )
{
EXTRA_DESCR_DATA *ed;
argument = one_argument( argument, arg3 );
if ( argument == NULL )
{
send_to_char
( "Syntax: oset <object> ed <keyword> <string>\n\r", ch );
return;
}
sprintf( buf, "%s\n\r", argument );
if ( extra_descr_free == NULL )
{
ed = alloc_perm( sizeof( *ed ) );
}
else
{
ed = extra_descr_free;
extra_descr_free = ed->next;
}
ed->keyword = str_dup( arg3 );
ed->description = str_dup( buf );
ed->next = obj->extra_descr;
obj->extra_descr = ed;
return;
}
}
/* echo bad use message */
do_string( ch, "" );
}
void do_oset( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
int value;
smash_tilde( argument );
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if ( arg[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " set obj <object> <field> <value>\n\r", ch );
send_to_char( " Field being one of:\n\r", ch );
send_to_char( " value0 value1 value2 value3 value4 (v1-v4)\n\r",
ch );
send_to_char( " extra wear level weight cost timer\n\r", ch );
return;
}
if ( ( obj = get_obj_world( ch, arg ) ) == NULL )
{
send_to_char( "Nothing like that in heaven or earth.\n\r", ch );
return;
}
/*
* Snarf the value (which need not be numeric).
*/
value = atoi( arg3 );
/*
* Set something.
*/
if ( !str_prefix( arg2, "value0" ) || !str_cmp( arg2, "v0" ) )
{
obj->value[0] = UMIN( 50, value );
return;
}
if ( !str_prefix( arg2, "value1" ) || !str_cmp( arg2, "v1" ) )
{
obj->value[1] = value;
return;
}
if ( !str_prefix( arg2, "value2" ) || !str_cmp( arg2, "v2" ) )
{
obj->value[2] = value;
return;
}
if ( !str_prefix( arg2, "value3" ) || !str_cmp( arg2, "v3" ) )
{
obj->value[3] = value;
return;
}
if ( !str_prefix( arg2, "value4" ) || !str_cmp( arg2, "v4" ) )
{
obj->value[3] = value;
return;
}
if ( !str_prefix( arg2, "extra" ) )
{
obj->extra_flags = value;
return;
}
if ( !str_prefix( arg2, "wear" ) )
{
obj->wear_flags = value;
return;
}
if ( !str_prefix( arg2, "level" ) )
{
obj->level = value;
return;
}
if ( !str_prefix( arg2, "weight" ) )
{
obj->weight = value;
return;
}
if ( !str_prefix( arg2, "cost" ) )
{
obj->cost = value;
return;
}
if ( !str_prefix( arg2, "timer" ) )
{
obj->timer = value;
return;
}
/*
* Generate usage message.
*/
do_oset( ch, "" );
return;
}
void do_rset( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
int value;
smash_tilde( argument );
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if ( arg[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax:\n\r", ch );
send_to_char( " set room <location> <field> <value>\n\r", ch );
send_to_char( " Field being one of:\n\r", ch );
send_to_char( " flags sector\n\r", ch );
return;
}
if ( ( location = find_location( ch, arg ) ) == NULL )
{
send_to_char( "No such location.\n\r", ch );
return;
}
/*
* Snarf the value.
*/
if ( !is_number( arg3 ) )
{
send_to_char( "Value must be numeric.\n\r", ch );
return;
}
value = atoi( arg3 );
/*
* Set something.
*/
if ( !str_prefix( arg2, "flags" ) )
{
location->room_flags = value;
return;
}
if ( !str_prefix( arg2, "sector" ) )
{
location->sector_type = value;
return;
}
/*
* Generate usage message.
*/
do_rset( ch, "" );
return;
}
/* Written by Stimpy, ported to rom2.4 by Silverhand 3/12
*
* Added the other COMM_ stuff that wasn't defined before 4/16 -Silverhand
*
* Donated to EmberMUD by Dorzak.
*/
void do_sockets( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *vch;
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
int count;
char *st;
char s[100];
char idle[10];
count = 0;
buf[0] = '\0';
buf2[0] = '\0';
strcat( buf2,
"\n\r[Num Connected_State Login@ Idle] Player Name Host\n\r" );
strcat( buf2,
"--------------------------------------------------------------------------\n\r" );
for ( d = descriptor_list; d; d = d->next )
{
if ( d->character && can_see( ch, d->character ) )
{
/* NB: You may need to edit the CON_ values */
switch ( d->connected )
{
case CON_PLAYING:
st = " PLAYING ";
break;
case CON_GET_NAME:
st = " Get Name ";
break;
case CON_GET_OLD_PASSWORD:
st = "Get Old Passwd ";
break;
case CON_CONFIRM_NEW_NAME:
st = " Confirm Name ";
break;
case CON_GET_NEW_PASSWORD:
st = "Get New Passwd ";
break;
case CON_CONFIRM_NEW_PASSWORD:
st = "Confirm Passwd ";
break;
case CON_GET_NEW_RACE:
st = " Get New Race ";
break;
case CON_GET_NEW_SEX:
st = " Get New Sex ";
break;
case CON_GET_NEW_CLASS:
st = " Get New Class ";
break;
case CON_GET_ALIGNMENT:
st = " Get New Align ";
break;
case CON_DEFAULT_CHOICE:
st = " Choosing Cust ";
break;
case CON_GEN_GROUPS:
st = " Customization ";
break;
case CON_PICK_WEAPON:
st = " Picking Weapon";
break;
case CON_READ_IMOTD:
st = " Reading IMOTD ";
break;
case CON_BREAK_CONNECT:
st = " LINKDEAD ";
break;
case CON_READ_MOTD:
st = " Reading MOTD ";
break;
case CON_GET_STATS:
st = " Rolling Stats ";
break;
case CON_GET_ANSI:
st = " Getting COLOR ";
break;
case CON_COPYOVER_RECOVER:
st = "HOTBOOT RECOVER";
break;
case CON_NOTE_TO:
st = " Note To: ";
break;
case CON_NOTE_SUBJECT:
st = " Note Subject: ";
break;
case CON_NOTE_EXPIRE:
st = " Note Expire: ";
break;
case CON_NOTE_TEXT:
st = " Typing Notes ";
break;
case CON_NOTE_FINISH:
st = "Finishing Note ";
break;
case CON_SHELL:
st = " Crash Hat On? ";
break;
default:
st = " !UNKNOWN! ";
break;
}
count++;
/* Format "login" value... */
vch = d->original ? d->original : d->character;
strftime( s, 100, "%I:%M%p", localtime( &vch->logon ) );
if ( vch->timer > 0 )
sprintf( idle, "%-3d", vch->timer );
else
sprintf( idle, " " );
sprintf( buf, "[%3d %s %7s %3s] %-12s %-32.32s\n\r",
d->descriptor,
st,
s,
idle,
( d->original ) ? d->original->name
: ( d->character ) ? d->character->name
: "(None!)", d->host );
strcat( buf2, buf );
}
}
sprintf( buf, "\n\r%d user%s\n\r", count, count == 1 ? "" : "s" );
strcat( buf2, buf );
send_to_char( buf2, ch );
return;
}
/*
* Thanks to Grodyn for pointing out bugs in this function.
*/
void do_force( CHAR_DATA * ch, char *argument )
{
char buf2[MAX_STRING_LENGTH];
char arg_target[MAX_INPUT_LENGTH];
char arg_name[MAX_INPUT_LENGTH];
char arg_command[MAX_INPUT_LENGTH];
enum Targets {
mob,
player,
all,
players,
gods
} etarget;
argument = one_argument( argument, arg_target );
if ( arg_target[0] == '\0' || argument[0] == '\0' )
{
send_to_char
( "Syntax: force [mob|char] [name] [command]\n\r force [all|players|gods] [command]\n\r",
ch );
return;
}
if ( !str_cmp( arg_target, "mob" ) )
{
etarget = mob;
argument = one_argument( argument, arg_name );
if ( arg_name[0] == '\0' || argument[0] == '\0' )
{
send_to_char
( "Syntax: force [mob|char] [name] [command]\n\r force [all|players|gods] [command]\n\r",
ch );
return;
}
}
else if ( !str_cmp( arg_target, "char" ) )
{
etarget = player;
argument = one_argument( argument, arg_name );
if ( arg_name[0] == '\0' || argument[0] == '\0' )
{
send_to_char
( "Syntax: force [mob|char] [name] [command]\n\r force [all|players|gods] [command]\n\r",
ch );
return;
}
}
else if ( !str_cmp( arg_target, "all" ) )
etarget = all;
else if ( !str_cmp( arg_target, "players" ) )
etarget = players;
else if ( !str_cmp( arg_target, "gods" ) )
etarget = gods;
else
{
send_to_char
( "Syntax: force [mob|char] [name] [command]\n\r force [all|players|gods] [command]\n\r",
ch );
return;
}
one_argument( argument, arg_command );
if ( !str_cmp( arg_command, "delete" ) )
{
send_to_char( "That will NOT be done.\n\r", ch );
return;
}
if ( is_immcmd( arg_command ) )
{
send_to_char( "Cannot force wiz commands.\n\r", ch );
return;
}
sprintf( buf2, "$n forces you to '%s'.", argument );
if ( etarget == all )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
if ( ( get_trust( ch ) < MAX_LEVEL - 3 ) && ( ch->Class != 4 ) )
{
send_to_char( "Not at your level!\n\r", ch );
return;
}
for ( vch = char_list; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if ( !IS_NPC( vch ) && get_trust( vch ) < get_trust( ch ) )
{
act( buf2, ch, NULL, vch, TO_VICT );
interpret( vch, argument );
}
}
}
else if ( etarget == players )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
if ( get_trust( ch ) < MAX_LEVEL - 2 )
{
send_to_char( "Not at your level!\n\r", ch );
return;
}
for ( vch = char_list; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if ( !IS_NPC( vch ) && get_trust( vch ) < get_trust( ch )
&& vch->level < LEVEL_HERO )
{
act( buf2, ch, NULL, vch, TO_VICT );
interpret( vch, argument );
}
}
}
else if ( etarget == gods )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
if ( get_trust( ch ) < MAX_LEVEL - 2 )
{
send_to_char( "Not at your level!\n\r", ch );
return;
}
for ( vch = char_list; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if ( !IS_NPC( vch ) && get_trust( vch ) < get_trust( ch )
&& vch->level >= LEVEL_HERO )
{
act( buf2, ch, NULL, vch, TO_VICT );
interpret( vch, argument );
}
}
}
else
{
CHAR_DATA *victim;
if ( etarget == player )
victim = get_player_world( ch, arg_name );
else
victim = get_mob_world( ch, arg_name );
if ( !victim )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "Aye aye, right away!\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "Do it yourself!\n\r", ch );
return;
}
if ( !IS_NPC( victim ) && get_trust( ch ) < MAX_LEVEL - 3 )
{
send_to_char( "Not at your level!\n\r", ch );
return;
}
act( buf2, ch, NULL, victim, TO_VICT );
interpret( victim, argument );
}
send_to_char( "Ok.\n\r", ch );
return;
}
/*
* New routines by Dionysos.
*/
void do_invis( CHAR_DATA * ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
int level;
if ( IS_NPC( ch ) )
return;
/* RT code for taking a level argument */
one_argument( argument, arg );
if ( arg[0] == '\0' )
/* take the default path */
if ( IS_SET( ch->act, PLR_WIZINVIS ) )
{
REMOVE_BIT( ch->act, PLR_WIZINVIS );
ch->invis_level = 0;
act( "$n slowly fades into existence.", ch, NULL, NULL, TO_ROOM );
send_to_char( "You slowly fade back into existence.\n\r", ch );
}
else
{
SET_BIT( ch->act, PLR_WIZINVIS );
ch->invis_level = get_trust( ch );
act( "$n slowly fades into thin air.", ch, NULL, NULL, TO_ROOM );
send_to_char( "You slowly vanish into thin air.\n\r", ch );
}
else
/* do the level thing */
{
level = atoi( arg );
if ( level < 2 || level > get_trust( ch ) )
{
send_to_char
( "Invis level must be between 2 and your level.\n\r", ch );
return;
}
else
{
ch->reply = NULL;
SET_BIT( ch->act, PLR_WIZINVIS );
ch->invis_level = level;
act( "$n slowly fades into thin air.", ch, NULL, NULL, TO_ROOM );
send_to_char( "You slowly vanish into thin air.\n\r", ch );
}
}
return;
}
void do_holylight( CHAR_DATA * ch, char *argument )
{
if ( IS_NPC( ch ) )
return;
if ( IS_SET( ch->act, PLR_HOLYLIGHT ) )
{
REMOVE_BIT( ch->act, PLR_HOLYLIGHT );
send_to_char( "Holy light mode off.\n\r", ch );
}
else
{
SET_BIT( ch->act, PLR_HOLYLIGHT );
send_to_char( "Holy light mode on.\n\r", ch );
}
return;
}
void do_chaos( CHAR_DATA * ch, char *argument )
{
extern bool chaos;
if ( !chaos )
{
do_force( ch, "all save" );
do_save( ch, "" );
}
chaos = !chaos;
if ( chaos )
{
send_to_char( "Chaos now set.\n\r", ch );
do_sendinfo( ch, "`rC`RH`YA`RO`rS`R has begun!" );
}
else
{
send_to_char( "Chaos cancelled.\n\r", ch );
do_sendinfo( ch, "`rC`RH`YA`RO`rS`R has been cancelled." );
do_force( ch, "all quit" );
}
return;
}
void do_rlist( CHAR_DATA * ch, char *argument )
{
ROOM_INDEX_DATA *pRoomIndex;
AREA_DATA *pArea;
char *dupl;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char *buffer = NULL;
bool found;
int vnum;
int avnum;
int col = 0;
one_argument( argument, arg );
found = FALSE;
if ( arg[0] == '\0' )
{
pArea = ch->in_room->area;
for ( vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++ )
{
if ( ( pRoomIndex = get_room_index( vnum ) ) )
{
found = TRUE;
dupl = remove_color( pRoomIndex->name );
sprintf( buf, "`B [`K%5d`B] `w%-30.29s`w",
pRoomIndex->vnum, dupl );
buffer = add_to_buf( buffer, buf );
if ( ++col % 2 == 0 )
buffer = add_to_buf( buffer, "\n\r" );
}
}
if ( !found )
{
send_to_char( "No rooms found in this area.\n\r", ch );
return;
}
if ( col % 2 != 0 )
buffer = add_to_buf( buffer, "\n\r" );
page_to_char( buffer, ch );
return;
}
else if ( is_number( argument ) )
{
avnum = atoi( argument );
for ( pArea = area_first; pArea; pArea = pArea->next )
{
if ( pArea->vnum == avnum )
{
found = TRUE;
break;
}
}
if ( !found )
{
send_to_char( "No such area!\n\r", ch );
return;
}
found = FALSE;
for ( vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++ )
{
if ( ( pRoomIndex = get_room_index( vnum ) ) )
{
found = TRUE;
sprintf( buf, "[%5d] %-32.31s`w",
pRoomIndex->vnum, capitalize( pRoomIndex->name ) );
buffer = add_to_buf( buffer, buf );
if ( ++col % 2 == 0 )
buffer = add_to_buf( buffer, "\n\r" );
}
}
if ( col % 2 != 0 )
buffer = add_to_buf( buffer, "\n\r" );
page_to_char( buffer, ch );
return;
}
}
/*
Object checking function, by Kyle Boyd.
This cycles through a given set of vnums and identifies problems
in the objects. Useful for quickly debugging objects in new areas.
*/
void do_objcheck( CHAR_DATA * ch, char *argument )
{
OBJ_INDEX_DATA *obj;
char arg[MAX_INPUT_LENGTH];
int lvnum, hvnum, i = 0, x = 0;
argument = one_argument( argument, arg );
if ( argument[0] == '\0' ||
arg[0] == '\0' || !is_number( arg ) || !is_number( argument ) )
{
send_to_char( "Syntax: objcheck <low vnum> <high vnum>\n\r", ch );
return;
}
lvnum = atoi( arg );
hvnum = atoi( argument );
if ( lvnum > hvnum )
{
x = lvnum;
lvnum = hvnum;
hvnum = x;
x = 0;
}
for ( x = lvnum; x < hvnum; x++ )
{
obj = get_obj_index( x );
if ( obj == NULL )
continue;
if ( i > 20 )
return;
if ( obj->weight <= 0 )
{
i++;
printf_to_char( ch, "[%5d] Weight = %d\n\r", obj->vnum,
obj->weight );
}
if ( obj->cost <= 0 )
{
i++;
printf_to_char( ch, "[%5d] Cost = %d\n\r", obj->vnum, obj->cost );
}
if ( !str_cmp( obj->name, "no name" ) || obj->name[0] == '\0' )
{
i++;
printf_to_char( ch, "[%5d] Keywords not set", obj->vnum );
}
if ( !str_cmp( obj->short_descr, "(no short description)" ) ||
obj->short_descr[0] == '\0' )
{
printf_to_char( ch, "[%5d] No short description\n\r", obj->vnum );
i++;
}
if ( !str_cmp( obj->description, "(no description)" ) ||
obj->description[0] == '\0' )
{
printf_to_char( ch, "[%5d] No long description\n\r", obj->vnum );
i++;
}
if ( !( obj->wear_flags & ITEM_TAKE )
&& obj->item_type != ITEM_FURNITURE
&& obj->item_type != ITEM_FOUNTAIN
&& obj->item_type != ITEM_CONTAINER )
{
printf_to_char( ch, "[%5d] No take flag!\n\r", obj->vnum );
i++;
}
if ( obj->item_type == ITEM_ARMOR
&& ( obj->wear_flags == 0 || obj->wear_flags == ITEM_TAKE ) )
{
printf_to_char( ch, "[%5d] Unwearable armor\n\r", obj->vnum );
i++;
}
if ( obj->item_type == ITEM_WEAPON
&& ( obj->wear_flags == 0 || obj->wear_flags == ITEM_TAKE ) )
{
printf_to_char( ch, "[%5d] Unwieldable weapon\n\r", obj->vnum );
i++;
}
if ( obj->item_type == ITEM_WEAPON
&& obj->value[1] * obj->value[2] >= 150 )
{
printf_to_char( ch, "[%5d] Huge damage dice, way too big.\n\r",
obj->vnum );
i++;
}
}
return;
}
void do_aexits( CHAR_DATA * ch, char *argument )
{
ROOM_INDEX_DATA *rid;
AREA_DATA *area;
EXIT_DATA *exit;
char arg[MAX_INPUT_LENGTH];
bool header_printed = FALSE;
long avnum, room, door;
argument = one_argument( argument, arg );
/* If user specifies no area vnum, use current area */
if ( arg[0] == '\0' )
{
area = ch->in_room->area;
}
/* Else, find the specified area */
else
{
avnum = atoi( arg );
if ( avnum == 0 )
{
send_to_char( "No such area!\n\r", ch );
return;
}
for ( area = area_first; area != NULL; area = area->next )
{
if ( area->vnum == avnum )
break;
}
}
/* If area was not found */
if ( area == NULL )
{
send_to_char( "No such area!\n\r", ch );
return;
}
/* Loop through all room vnums in the area */
for ( room = area->lvnum; room <= area->uvnum; room++ )
{
rid = get_room_index( room );
if ( rid == NULL )
continue;
/* Loop through all doors in the room */
for ( door = 0; door <= 5; door++ )
{
exit = rid->exit[door];
if ( exit == NULL )
continue;
/* If the to_room for the exit is in a different area */
/* then print out the information */
if ( exit->u1.to_room->area != area )
{
if ( !header_printed )
{
printf_to_char( ch,
"\n\r`wExits for area: `W%s`w\n\r\n\r"
"`K[ `wvnum `K] `wRoom in `W%-25.25s `K[ `wvnum `K] `wRoom in other area\n\r"
"`K-------------------------------------------------------------------------------`w\n\r",
area->name, area->filename );
header_printed = TRUE;
}
printf_to_char( ch,
"`K[`w%6d`K] `w%-25.25s %4.4s to `K[`w%6d`K] `w%-25.25s in `W%12.12s`w\n\r",
room, rid->name, dir_name[door],
exit->u1.to_room->vnum,
exit->u1.to_room->name,
exit->u1.to_room->area->filename );
}
}
}
return;
}
void do_aentrances( CHAR_DATA * ch, char *argument )
{
ROOM_INDEX_DATA *rid;
AREA_DATA *area, *other_area;
EXIT_DATA *exit;
bool header_printed = FALSE;
char arg[MAX_INPUT_LENGTH];
long avnum, room, door;
argument = one_argument( argument, arg );
/* If user specifies no area vnum, use current area */
if ( arg[0] == '\0' )
{
area = ch->in_room->area;
}
/* Else, find the specified area */
else
{
avnum = atoi( arg );
if ( avnum == 0 )
{
send_to_char( "No such area!\n\r", ch );
return;
}
for ( area = area_first; area != NULL; area = area->next )
{
if ( avnum == area->vnum )
break;
}
}
/* If area was not found */
if ( area == NULL )
{
send_to_char( "No such area!\n\r", ch );
return;
}
/* Loop through all areas EXCEPT area */
for ( other_area = area_first; other_area != NULL;
other_area = other_area->next )
{
if ( other_area == area )
continue;
/* Loop through all rooms in other_area */
for ( room = other_area->lvnum; room <= other_area->uvnum; room++ )
{
rid = get_room_index( room );
if ( rid == NULL )
continue;
for ( door = 0; door <= 5; door++ )
{
exit = rid->exit[door];
if ( exit == NULL )
continue;
/* If the to_room for the exit is in area */
/* then print out the information */
if ( exit->u1.to_room->area == area )
{
if ( !header_printed )
{
printf_to_char( ch,
"\n\r`wEntrances to area: `W%s`w\n\r\n\r"
"`K-------------------------------------------------------------------------------`w\n\r",
area->name, area->filename );
header_printed = TRUE;
}
printf_to_char( ch,
"`K[`w%6d`K] `w%5.5s from `K[`w%6d`K] `w%-25.25s in `W%12.12s`w\n\r",
exit->u1.to_room->vnum, dir_name[door],
rid->vnum, rid->name, rid->area->filename );
}
}
}
}
return;
}
/* Player load and unload added by Lancelight */
void do_pload( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *c;
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 );
/* Don't want to load a second copy of a player who's already online! */
for ( c = player_list; c != NULL; c = c->next_player )
{
if ( is_exact_name( name, c->name ) )
{
send_to_char( "That person is already 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 can't seem to find them.\n\r", ch );
return;
}
d.character->desc = NULL;
d.character->next = char_list;
char_list = d.character;
d.character->pcdata->ticks = 1;
d.character->next_player = player_list;
player_list = d.character;
d.connected = CON_PLAYING;
reset_char( d.character );
/* bring player to imm */
if ( d.character->in_room != NULL )
{
if ( d.character->was_in_room == NULL )
d.character->was_in_room = d.character->in_room;
char_from_room( d.character );
char_to_room( d.character, ch->in_room );
}
printf_to_char( ch, "You have pulled %s from the pattern!\n\r",
d.character->name );
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 );
}
}
void do_punload( CHAR_DATA * ch, char *argument )
{
CHAR_DATA *victim;
char who[MAX_INPUT_LENGTH];
argument = one_argument( argument, who );
if ( ( victim = get_player_world( ch, who ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
/** Person is legitimatly logged on... was not ploaded.
*/
if ( victim->desc != NULL )
{
send_to_char( "I don't 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_from_room( victim );
char_to_room( victim, victim->was_in_room );
if ( victim->pet != NULL )
{
char_from_room( victim->pet );
char_to_room( victim->pet, victim->was_in_room );
}
ch->was_in_room = NULL;
}
act( "You have released $N back to the Pattern.",
ch, NULL, victim, TO_CHAR );
act( "$n has released $N back to the Pattern.", ch, NULL, victim, TO_ROOM );
do_quit( victim, "" );
}
void do_wizgrant( CHAR_DATA * ch, char *argument )
{
struct cmd_type *cmd;
IMMCMD_TYPE *tmp;
CHAR_DATA *victim;
bool valid = FALSE;
char buf[MAX_INPUT_LENGTH];
if ( argument == NULL )
{
send_to_char( "Syntax:\n\r"
" wizgrant <name> <command>\n\r"
" wizgrant <name> all\n\r"
"\n\r"
"Note: The 'all' option will grant access to the wiz-commands that YOU\n\r"
" currently have access to.\n\r", ch );
return;
}
argument = one_argument( argument, buf );
/* Is argument a valid imm command? */
for ( cmd = ( struct cmd_type * ) cmd_table; *cmd->name; cmd++ )
{
if ( !str_cmp( argument, cmd->name ) )
{
if ( !cmd->imm )
{
send_to_char( "That is not a valid wiz command!\n\r", ch );
return;
}
else
{
valid = TRUE;
break;
}
}
}
if ( str_cmp( argument, "all" ) )
{
if ( !valid )
{
send_to_char( "That is not a valid wiz command!\n\r", ch );
return;
}
/* Does grantor have access to the command themselves? */
if ( !can_do_immcmd( ch, argument ) )
{
send_to_char
( "You do not have access to grant that command!\n\r", ch );
return;
}
}
victim = get_player_world( ch, buf );
if ( victim == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
/* Does victim already have access to the command? */
if ( can_do_immcmd( victim, argument ) )
{
send_to_char( "They already have access to that command!\n\r", ch );
return;
}
/* Grant access to all commands */
if ( !str_cmp( argument, "all" ) )
{
IMMCMD_TYPE *orig;
/* Copy all of ch's commands to victim */
for ( orig = ch->pcdata->immcmdlist; orig != NULL; orig = orig->next )
{
if ( can_do_immcmd( victim, orig->cmd ) )
continue;
tmp = malloc( sizeof( IMMCMD_TYPE ) );
tmp->cmd = str_dup( orig->cmd );
tmp->next = victim->pcdata->immcmdlist;
victim->pcdata->immcmdlist = tmp;
sprintf( buf, "%s now has access to the %s command.\n\r",
victim->name, tmp->cmd );
send_to_char( buf, ch );
sprintf( buf,
"%s has granted you access to the %s command!\n\r",
ch->name, tmp->cmd );
send_to_char( buf, victim );
}
return;
}
/* Grant access to a single command */
tmp = malloc( sizeof( IMMCMD_TYPE ) );
tmp->cmd = str_dup( argument );
tmp->next = victim->pcdata->immcmdlist;
victim->pcdata->immcmdlist = tmp;
sprintf( buf, "%s now has access to the %s command.\n\r",
victim->name, tmp->cmd );
send_to_char( buf, ch );
sprintf( buf, "%s has granted you access to the %s command!\n\r",
ch->name, tmp->cmd );
send_to_char( buf, victim );
return;
}
void do_wizrevoke( CHAR_DATA * ch, char *argument )
{
IMMCMD_TYPE *tmp, *tmp2;
CHAR_DATA *victim;
char buf[MAX_INPUT_LENGTH];
if ( argument == NULL )
{
send_to_char( "Syntax:\n\r " " wizrevoke <name> <command>\n\r", ch );
return;
}
argument = one_argument( argument, buf );
if ( argument == NULL )
{
send_to_char( "Syntax:\n\r " " wizrevoke <name> <command>\n\r", ch );
return;
}
victim = get_player_world( ch, buf );
if ( victim == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "You cannot revoke access to yourself.\n\r", ch );
return;
}
if ( !can_do_immcmd( victim, argument ) )
{
send_to_char
( "You cannot revoke access to a command that they don't have access to.\n\r",
ch );
return;
}
if ( get_trust( ch ) <= get_trust( victim ) )
{
send_to_char
( "That person is too powerful for you to wizrevoke!\n\r", ch );
return;
}
/* Revoke access to the command */
/* If the command is their only command... */
if ( victim->pcdata->immcmdlist->next == NULL )
{
free_string( &victim->pcdata->immcmdlist->cmd );
free( victim->pcdata->immcmdlist );
sprintf( buf, "%s no longer has access to the %s command.\n\r",
victim->name, argument );
send_to_char( buf, ch );
sprintf( buf, "Your access to the %s command has been revoked!\n\r",
argument );
send_to_char( buf, victim );
victim->pcdata->immcmdlist = NULL;
return;
}
tmp2 = NULL;
for ( tmp = victim->pcdata->immcmdlist; tmp != NULL; tmp = tmp->next )
{
if ( !str_cmp( argument, tmp->cmd ) )
{
if ( tmp2 == NULL )
{
victim->pcdata->immcmdlist = tmp->next;
free_string( &tmp->cmd );
free( tmp );
break;
}
else
{
tmp2->next = tmp->next;
free_string( &tmp->cmd );
free( tmp );
break;
}
}
tmp2 = tmp;
}
sprintf( buf, "%s no longer has access to the %s command.\n\r",
victim->name, argument );
send_to_char( buf, ch );
sprintf( buf, "Your access to the %s command has been revoked!\n\r",
argument );
send_to_char( buf, victim );
return;
}
void do_olevel( CHAR_DATA * ch, char *argument )
{
char buf[MAX_INPUT_LENGTH];
char level[MAX_INPUT_LENGTH];
char name[MAX_INPUT_LENGTH];
BUFFER *buffer;
OBJ_DATA *obj;
OBJ_DATA *in_obj;
bool found;
int number = 0, max_found;
found = FALSE;
number = 0;
max_found = 200;
buffer = new_buf( );
argument = one_argument( argument, level );
if ( level[0] == '\0' )
{
send_to_char( "Syntax: olevel <level>\n\r", ch );
send_to_char( " olevel <level> <name>\n\r", ch );
return;
}
argument = one_argument( argument, name );
for ( obj = object_list; obj != NULL; obj = obj->next )
{
if ( obj->level != atoi( level ) )
continue;
if ( name[0] != '\0' && !is_name( name, obj->name ) )
continue;
found = TRUE;
number++;
for ( in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj );
if ( in_obj->carried_by != NULL && can_see( ch, in_obj->carried_by )
&& in_obj->carried_by->in_room != NULL )
sprintf( buf, "%3d) %s is carried by %s [Room %d]\n\r",
number, obj->short_descr, PERS( in_obj->carried_by,
ch ),
in_obj->carried_by->in_room->vnum );
else if ( in_obj->in_room != NULL
&& can_see_room( ch, in_obj->in_room ) )
sprintf( buf, "%3d) %s is in %s [Room %d]\n\r", number,
obj->short_descr, in_obj->in_room->name,
in_obj->in_room->vnum );
else
sprintf( buf, "%3d) %s is somewhere\n\r", number,
obj->short_descr );
buf[0] = UPPER( buf[0] );
add_buf( buffer, buf );
if ( number >= max_found )
break;
}
if ( !found )
send_to_char( "Nothing like that in heaven or earth.\n\r", ch );
else
page_to_char( buf_string( buffer ), ch );
free_buf( buffer );
}
void do_mlevel( CHAR_DATA * ch, char *argument )
{
char buf[MAX_INPUT_LENGTH];
BUFFER *buffer;
CHAR_DATA *victim;
bool found;
int count = 0;
if ( argument[0] == '\0' )
{
send_to_char( "Syntax: mlevel <level>\n\r", ch );
return;
}
found = FALSE;
buffer = new_buf( );
for ( victim = char_list; victim != NULL; victim = victim->next )
{
if ( victim->in_room != NULL && atoi( argument ) == victim->level )
{
found = TRUE;
count++;
sprintf( buf, "%3d) [%5d] %-28s [%5d] %s\n\r", count,
IS_NPC( victim ) ? victim->pIndexData->vnum : 0,
IS_NPC( victim ) ? victim->short_descr : victim->name,
victim->in_room->vnum, victim->in_room->name );
add_buf( buffer, buf );
}
}
if ( !found )
act( "You didn't find any mob of level $T.", ch, NULL, argument,
TO_CHAR );
else
page_to_char( buf_string( buffer ), ch );
free_buf( buffer );
return;
}
#ifdef CFG_SHELL_ENABLED
#if defined(WIN32)
void do_shell( CHAR_DATA * ch, char *argument )
{
send_to_char
( "Sorry -- shell is not currently available under Windows.\n\r", ch );
return;
}
#else
void do_shell( CHAR_DATA * ch, char *argument )
{
DESCRIPTOR_DATA *d;
CHAR_DATA *tmpch;
pid_t pid;
char ptyname[12];
char ttyname[12];
int tmp_fds[2];
int master_fd, slave_fd;
if ( IS_NPC( ch ) )
{
send_to_char( "Not for NPCs\n\r", ch );
return;
}
#ifdef CFG_SHELL_LEVEL
if ( ch->level < CFG_SHELL_LEVEL )
{
send_to_char( "Huh?\n\r", ch );
return;
}
#endif
/* Remove the char from player_list and char_list and add them to
* shell_char_list */
if ( ch == char_list )
{
char_list = ch->next;
}
else
{
for ( tmpch = char_list; tmpch && tmpch->next != ch;
tmpch = tmpch->next );
if ( tmpch )
{
tmpch->next = ch->next;
}
else
{
bug( "do_shell: current char not found in char_list!", 0 );
return;
}
}
if ( ch == player_list )
{
player_list = ch->next_player;
}
else
{
for ( tmpch = player_list; tmpch && tmpch->next_player != ch;
tmpch = tmpch->next );
if ( tmpch )
{
tmpch->next_player = ch->next_player;
}
else
{
bug( "do_shell: current char not found in the player_list!", 0 );
return;
}
}
ch->next_in_shell = shell_char_list;
shell_char_list = ch;
ch->next_player = NULL;
ch->next = NULL;
/* Set their connected state to CON_SHELL */
ch->desc->connected = CON_SHELL;
/* Create a pipe and associate it with ch so that when the
* pipe is closed after the shell terminates, we can put them
* back into the game. */
if ( pipe( tmp_fds ) < 0 )
{
perror( "do_shell: pipe: " );
return;
}
ch->fdpair[0] = tmp_fds[0];
ch->fdpair[1] = tmp_fds[1];
fcntl( ch->fdpair[0], F_SETFL, O_NONBLOCK );
/* fork */
if ( ( pid = fork( ) ) > 0 )
{
/* Parent - close the "out" end of the pipe and return
* to normal MUD business. */
close( ch->fdpair[1] );
fcntl( ch->fdpair[0], F_SETFL, O_NONBLOCK );
return;
}
else if ( pid < 0 )
{
/* Error - close both ends of the pipe so that the MUD
* will stick the player back into the game. */
perror( "do_shell: fork:" );
send_to_char( "system error forking shell.\n\r", ch );
close( ch->fdpair[1] );
close( ch->fdpair[0] );
return;
}
/* Child */
/* Close all the open descriptors that we're not using */
close( control );
for ( d = descriptor_list; d; d = d->next )
{
if ( d == ch->desc )
continue;
close( d->descriptor );
}
/* Close the "in" end of the pipe. */
close( ch->fdpair[0] );
/* Open the master pty. */
master_fd = master_pty( ptyname );
if ( master_fd < 0 )
{
write_to_descriptor( ch->desc->descriptor,
"Failed to open pty master for shell.\n\r", 28,
FALSE );
close( ch->fdpair[1] );
return;
}
/* fork again */
pid = fork( );
/* Child */
if ( pid == 0 )
{
/* Remove the sigchld handler - let the main MUD handle that */
struct sigaction sa;
sa.sa_flags = SA_RESETHAND;
sa.sa_handler = 0;
if ( sigaction( SIGCHLD, &sa, 0 ) < 0 )
{
perror( "do_shell: sigaction: can't reset SIGCHLD" );
close( ch->fdpair[1] );
exit( 0 );
}
/* Open slave end of the pty. */
slave_fd = slave_tty( ptyname, ttyname );
if ( slave_fd < 0 )
{
perror( "do_shell: slave_tty:" );
close( ch->fdpair[1] );
exit( 0 );
}
/* Close the master pty. */
close( master_fd );
/* Close stdin, stdout, and stderr */
close( 0 );
close( 1 );
close( 2 );
/* dupage */
if ( dup2( slave_fd, STDIN_FILENO ) != STDIN_FILENO
|| dup2( slave_fd, STDOUT_FILENO ) != STDOUT_FILENO
|| dup2( slave_fd, STDERR_FILENO ) != STDERR_FILENO )
{
fprintf( stderr, "do_shell: dup2 failed!\n" );
close( ch->fdpair[1] );
exit( 0 );
}
/* Close the slave tty <shrug> */
close( slave_fd );
/* Exec the shell! YES! */
execl( SHELL_PATH, "MUDSHELL", ( char * ) 0 );
/* If we get here, something went wrong with the exec. */
close( ch->fdpair[1] );
exit( 0 );
}
else if ( pid < 0 )
{
/* Error */
}
/* Parent */
/* Set the pty and socket to non-block */
fcntl( master_fd, F_SETFL, O_NONBLOCK );
fcntl( ch->desc->descriptor, F_SETFL, O_NONBLOCK );
/* Set the socket to non-local-echo and char-by-char-mode. */
write( ch->desc->descriptor, echo_off_str, 3 );
write( ch->desc->descriptor, will_suppress_ga_str, 3 );
/* Route I/O between the socket and the pty. */
route_io( ch->desc->descriptor, master_fd );
/* Set the socket back to local echo and line-mode. */
write( ch->desc->descriptor, echo_on_str, 3 );
write( ch->desc->descriptor, wont_suppress_ga_str, 3 );
/* Close the "out" end of the pipe to notify the MUD of
* who to put back in the game. */
close( ch->fdpair[1] );
/* Exit this process. MUD will take the user over from here. */
exit( 0 );
}
#endif
#endif