/***************************************************************************
* 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. *
* *
* _/ _/_/_/ _/ _/ _/ ACK! MUD is modified *
* _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code *
* _/ _/ _/ _/_/ _/ (c)Stephen Dooley 1994 *
* _/_/_/_/ _/ _/ _/ "This mud has not been *
* _/ _/ _/_/_/ _/ _/ _/ tested on animals." *
* *
* *
* 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(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
/* For forks etc. */
#include <unistd.h>
#include <fcntl.h>
#include "merc.h"
#include "tables.h"
void do_wizhelp( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
int cmd;
int col;
buf1[0] = '\0';
col = 0;
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if ( cmd_table[cmd].level >= LEVEL_HERO
&& cmd_table[cmd].level <= get_trust( ch ) )
{
sprintf( buf, "%-12s", cmd_table[cmd].name );
strcat( buf1, buf );
if ( ++col % 6 == 0 )
strcat( buf1, "\n\r" );
}
}
if ( col % 6 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
/*
void do_wizhelp( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
int cmd;
int col;
rch = get_char( ch );
if ( !authorized( rch, "wizhelp" ) )
return;
buf1[0] = '\0';
col = 0;
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if ( cmd_table[cmd].level < LEVEL_HERO
|| str_infix( cmd_table[cmd].name, rch->pcdata->immskll ) )
continue;
sprintf( buf, "%-10s", cmd_table[cmd].name );
strcat( buf1, buf );
if ( ++col % 8 == 0 )
strcat( buf1, "\n\r" );
}
if ( col % 8 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
*/
void do_bamfin( CHAR_DATA *ch, char *argument )
{
if ( !IS_NPC(ch) )
{
smash_tilde( argument );
free_string( ch->pcdata->bamfin );
ch->pcdata->bamfin = str_dup( argument );
send_to_char( "Ok.\n\r", ch );
}
return;
}
void do_bamfout( CHAR_DATA *ch, char *argument )
{
if ( !IS_NPC(ch) )
{
smash_tilde( argument );
free_string( ch->pcdata->bamfout );
ch->pcdata->bamfout = str_dup( argument );
send_to_char( "Ok.\n\r", 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 );
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_char_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 = first_desc; d != NULL; d = d->next )
{
if ( d == victim->desc )
{
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_pardon( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
send_to_char( "Syntax: pardon <character> <killer|thief>.\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == 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;
if ( argument[0] == '\0' )
{
send_to_char( "Echo what?\n\r", ch );
return;
}
for ( d = first_desc; d; d = d->next )
{
if ( d->connected == CON_PLAYING )
{
send_to_char( argument, d->character );
send_to_char( "@@g\n\r", d->character );
}
}
return;
}
void do_recho( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA *d;
if ( argument[0] == '\0' )
{
send_to_char( "Recho what?\n\r", ch );
return;
}
for ( d = first_desc; d; d = d->next )
{
if ( d->connected == CON_PLAYING
&& d->character->in_room == ch->in_room )
{
send_to_char( argument, d->character );
send_to_char( "@@g\n\r", d->character );
}
}
return;
}
ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, char *arg )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
if ( is_number(arg) )
return get_room_index( atoi( arg ) );
if ( ( victim = get_char_world( ch, arg ) ) != NULL )
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 arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0' )
{
send_to_char( "Transfer whom (and where)?\n\r", ch );
return;
}
if ( !str_cmp( arg1, "all" ) )
{
for ( d = first_desc; d != NULL; d = d->next )
{
if ( d->connected == CON_PLAYING
&& d->character != ch
&& d->character->in_room != NULL
&& !IS_IMMORTAL( d->character )
&& can_see( ch, d->character ) )
{
char buf[MAX_STRING_LENGTH];
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 ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\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 is snatched by the Gods!", 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;
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 ) && ( ch->level != 85 ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
original = ch->in_room;
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 = first_char; wch != NULL; wch = wch->next )
{
if ( wch == ch )
{
char_from_room( ch );
char_to_room( ch, original );
break;
}
}
return;
}
void do_goto( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Goto where?\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 ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
if ( ch->fighting != NULL )
stop_fighting( ch, TRUE );
/* if ( !IS_SET(ch->act, PLR_WIZINVIS) ) */
{
act( "$L$n $T.", ch, NULL,
(ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0')
? ch->pcdata->bamfout : "leaves in a swirling mist", TO_ROOM );
}
char_from_room( ch );
char_to_room( ch, location );
/* if ( !IS_SET(ch->act, PLR_WIZINVIS) ) */
{
act( "$L$n $T.", ch, NULL,
(ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
? ch->pcdata->bamfin : "appears in a swirling mist", TO_ROOM );
}
do_look( ch, "auto" );
return;
}
void do_rstat( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
ROOM_AFFECT_DATA *raf;
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 ) && ( ch->level != 85 ) )
{
send_to_char( "That room is private right now.\n\r", ch );
return;
}
buf1[0] = '\0';
sprintf( buf, "Name: '%s.'\n\rArea: '%s'.\n\r",
location->name,
location->area->name );
strcat( buf1, buf );
sprintf( buf,
"Vnum: %d. Light: %d. Sector: %s.\n\r",
location->vnum,
location->light,
rev_table_lookup( tab_sector_types, location->sector_type ) );
strcat( buf1, buf );
sprintf( buf,
"Room flags: %s.\n\rDescription:\n\r%s",
bit_table_lookup( tab_room_flags, location->room_flags ),
location->description );
strcat( buf1, buf );
if ( location->first_exdesc != NULL )
{
EXTRA_DESCR_DATA *ed;
strcat( buf1, "Extra description keywords: '" );
for ( ed = location->first_exdesc; ed; ed = ed->next )
{
strcat( buf1, ed->keyword );
if ( ed->next != NULL )
strcat( buf1, " " );
}
strcat( buf1, "'.\n\r" );
}
strcat( buf1, "Characters:" );
for ( rch = location->first_person; rch; rch = rch->next_in_room )
{
strcat( buf1, " " );
one_argument( rch->name, buf );
strcat( buf1, buf );
}
strcat( buf1, ".\n\rObjects: " );
for ( obj = location->first_content; obj; obj = obj->next_in_room )
{
strcat( buf1, " " );
one_argument( obj->name, buf );
strcat( buf1, buf );
}
strcat( buf1, ".\n\r" );
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->to_room != NULL ? pexit->to_room->vnum : 0,
pexit->key,
pexit->exit_info,
pexit->keyword,
pexit->description[0] != '\0'
? pexit->description : "(none).\n\r" );
strcat( buf1, buf );
}
}
if ( location->first_room_affect != NULL )
{
for ( raf = location->first_room_affect; raf != NULL; raf = raf->next )
{
sprintf( buf, "Room_Affect: '%s', level %d, duration %d\n\r",
skill_table[raf->type].name, raf->level, raf->duration );
strcat( buf1, buf );
}
}
send_to_char( buf1, ch );
return;
}
void do_ostat( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
AFFECT_DATA *paf;
OBJ_DATA *obj;
int cnt;
int fubar;
char *foo;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Ostat what?\n\r", ch );
return;
}
buf1[0] = '\0';
if ( ( obj = get_obj_world( ch, arg ) ) == NULL )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
sprintf( buf, "Name: %s.\n\r",
obj->name );
strcat( buf1, buf );
sprintf( buf, "Vnum: %d. Type: %s.\n\r",
obj->pIndexData->vnum, item_type_name( obj ) );
strcat( buf1, buf );
sprintf( buf, "Short description: %s.\n\rLong description: %s\n\r",
obj->short_descr, obj->description );
strcat( buf1, buf );
sprintf( buf, "Wear bits: %s.\n\rExtra bits: %s.\n\r",
bit_table_lookup( tab_wear_flags, obj->wear_flags ),
extra_bit_name( obj->extra_flags ) );
strcat( buf1, buf );
sprintf( buf, "ITEM_APPLY: %d.\n\r", obj->item_apply );
strcat( buf1, buf );
sprintf( buf, "Number: %d/%d. Weight: %d/%d.\n\r",
1, get_obj_number( obj ),
obj->weight, get_obj_weight( obj ) );
strcat( buf1, buf );
sprintf( buf, "Cost: %d. Timer: %d. Level: %d.\n\r",
obj->cost, obj->timer, obj->level );
strcat( buf1, buf );
sprintf( buf, "Condition: %d%%.\n\r", obj->condition );
strcat( buf1, buf );
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)" : obj->carried_by->name,
obj->wear_loc );
strcat( buf1, buf );
strcat( buf1, "Item Values:\n\r" );
for ( cnt = 0; cnt < 4; cnt++ )
{
sprintf( buf, "@@W[Value%d : @@y%6d@@W] %s",
cnt, obj->value[cnt],
rev_table_lookup( tab_value_meanings, (obj->item_type *10 ) + cnt ) );
strcat( buf1, buf );
if ( is_name( "Spell", rev_table_lookup( tab_value_meanings, ( obj->item_type * 10 ) + cnt ) ) )
{
fubar = obj->value[cnt];
if ( fubar < 0 || fubar > MAX_SKILL )
sprintf( buf, " @@R(?????)@@g\n\r" );
else
sprintf( buf, " @@y(%s)@@g\n\r",
skill_table[fubar].name );
}
else if ( is_name( "Liquid", rev_table_lookup( tab_value_meanings, ( obj->item_type * 10 ) + cnt ) ) )
{
foo = str_dup(rev_table_lookup( tab_drink_types, obj->value[cnt] ) );
if ( foo[0] == '\0' )
sprintf( buf, " @@R(INVALID!)@@g\n\r" );
else
sprintf( buf, " @@y(%s)@@g\n\r", foo );
}
else if ( is_name( "Weapon", rev_table_lookup( tab_value_meanings, ( obj->item_type * 10 ) + cnt ) ) )
{
foo = rev_table_lookup( tab_weapon_types, obj->value[cnt] );
if ( foo[0] == '\0' )
sprintf( buf, " @@R(INVALID!)@@g\n\r" );
else
sprintf( buf, " @@y(%s)@@g\n\r", foo );
}
else
sprintf( buf, "@@g\n\r" );
strcat( buf1, buf );
}
/*
sprintf( buf, "Values: %d %d %d %d.\n\r",
obj->value[0], obj->value[1], obj->value[2], obj->value[3] );
strcat( buf1, buf );
*/
if ( obj->first_exdesc != NULL || obj->pIndexData->first_exdesc != NULL )
{
EXTRA_DESCR_DATA *ed;
strcat( buf1, "Extra description keywords: '" );
for ( ed = obj->first_exdesc; ed != NULL; ed = ed->next )
{
strcat( buf1, ed->keyword );
if ( ed->next != NULL )
strcat( buf1, " " );
}
for ( ed = obj->pIndexData->first_exdesc; ed != NULL; ed = ed->next )
{
strcat( buf1, ed->keyword );
if ( ed->next != NULL )
strcat( buf1, " " );
}
strcat( buf1, "'.\n\r" );
}
for ( paf = obj->first_apply; paf != NULL; paf = paf->next )
{
sprintf( buf, "Affects %s by %d.\n\r",
affect_loc_name( paf->location ), paf->modifier );
strcat( buf1, buf );
}
send_to_char( buf1, ch );
return;
}
void do_mstat( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
AFFECT_DATA *paf;
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Mstat whom?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
buf1[0] = '\0';
sprintf( buf, "Name: %s.\n\r",
victim->name );
strcat( buf1, buf );
sprintf( buf, "Vnum: %d. Sex: %s. Room: %d.\n\r",
IS_NPC(victim) ? victim->pIndexData->vnum : 0,
victim->sex == SEX_MALE ? "male" :
victim->sex == SEX_FEMALE ? "female" : "neutral",
victim->in_room == NULL ? 0 : victim->in_room->vnum
);
strcat( buf1, buf );
if ( IS_NPC( victim ) )
{
sprintf( buf, "Str: %d. Int: %d. Wis: %d. Dex: %d. Con: %d.\n\r",
get_curr_str(victim),
get_curr_int(victim),
get_curr_wis(victim),
get_curr_dex(victim),
get_curr_con(victim) );
strcat( buf1, buf );
}
else
{
sprintf( buf, "Str:%d/%d Int:%d/%d Wis:%d/%d Dex:%d/%d Con:%d/%d.\n\r",
get_curr_str(victim), victim->pcdata->max_str,
get_curr_int(victim), victim->pcdata->max_int,
get_curr_wis(victim), victim->pcdata->max_wis,
get_curr_dex(victim), victim->pcdata->max_dex,
get_curr_con(victim), victim->pcdata->max_con );
strcat( buf1, buf );
}
if ( !IS_NPC( victim ) )
{
sprintf( buf,
"Mag: %d Cle: %d Thi:%d War:%d Psi:%d\n\r",
victim->lvl[0],victim->lvl[1],victim->lvl[2],victim->lvl[3],
victim->lvl[4] );
strcat( buf1, buf );
sprintf( buf, "Age: " );
my_get_age( ch, buf );
strcat( buf1, buf );
sprintf( buf, " (%d Hours RL play).\n\r", my_get_hours( ch ) );
strcat( buf1, buf );
sprintf( buf, "Class Order: %s %s %s %s %s\n\r",
class_table[victim->pcdata->order[0]].who_name,
class_table[victim->pcdata->order[1]].who_name,
class_table[victim->pcdata->order[2]].who_name,
class_table[victim->pcdata->order[3]].who_name,
class_table[victim->pcdata->order[4]].who_name );
strcat( buf1, buf );
}
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,
victim->practice );
strcat( buf1, buf );
sprintf( buf,
"Lv: %d. Class: %d. Align: %d. AC: %d. Gold: %d. Exp: %d.\n\r",
victim->level, victim->class, victim->alignment,
GET_AC(victim), victim->gold, victim->exp );
strcat( buf1, buf );
if ( !IS_NPC( victim ) )
{
sprintf( buf, "Race: %d (%s)%s. Clan: %d (%s). Balance: %d.\n\r",
victim->race,
race_table[victim->race].race_name,
IS_VAMP(victim) ? "[VAMPIRE]" : "",
victim->pcdata->clan,
clan_table[victim->pcdata->clan].clan_abbr,
victim->balance );
strcat( buf1, buf );
}
sprintf( buf, "Hitroll: %d. Damroll: %d. Position: %d. Wimpy: %d.\n\r",
GET_HITROLL(victim), GET_DAMROLL(victim),
victim->position, victim->wimpy );
strcat( buf1, buf );
if ( IS_NPC( victim ) )
{
sprintf( buf, "MODIFIERS: AC: %d. Hitroll: %d. Damroll: %d.\n\r",
victim->ac_mod,
victim->hr_mod,
victim->dr_mod );
strcat( buf1, buf );
sprintf( buf, "TARGET: %s\n\r", victim->target );
strcat( buf1, buf );
sprintf( buf, "TIMER: %d\n\r", victim->extract_timer );
strcat( buf1, buf );
}
if ( !IS_NPC( victim ) )
{
sprintf( buf, "Page Lines: %d.\n\r", victim->pcdata->pagelen );
strcat( buf1, buf );
}
sprintf( buf, "Fighting: %s.\n\r",
victim->fighting ? victim->fighting->name : "(none)" );
strcat( buf1, buf );
if ( !IS_NPC(victim) )
{
sprintf( buf, "@@RBLOODLUST@@g: %d\n\r", ch->pcdata->bloodlust );
strcat( buf1, buf );
sprintf( buf,
"Thirst: %d. Full: %d. Drunk: %d. Saving throw: %d.\n\r",
victim->pcdata->condition[COND_THIRST],
victim->pcdata->condition[COND_FULL],
victim->pcdata->condition[COND_DRUNK],
victim->saving_throw );
strcat( buf1, buf );
}
sprintf( buf, "Carry number: %d. Carry weight: %d. @@aQuest Points@@W: @@y%3d\n\r",
victim->carry_number, victim->carry_weight, victim->quest_points );
strcat( buf1, buf );
sprintf( buf, "Age: %d. Played: %d. Timer: %d. Act: %d.\n\r",
get_age( victim ), (int) victim->played, victim->timer, victim->act );
strcat( buf1, buf );
sprintf( buf, "Master: %s. Leader: %s. Affected by: %s.\n\r",
victim->master ? victim->master->name : "(none)",
victim->leader ? victim->leader->name : "(none)",
affect_bit_name( victim->affected_by ) );
strcat( buf1, buf );
sprintf( buf, "Short description: %s.\n\rLong description: %s",
victim->short_descr,
victim->long_descr[0] != '\0' ? victim->long_descr : "(none).\n\r" );
strcat( buf1, buf );
if ( IS_NPC(victim) && victim->spec_fun != 0 )
strcat( buf1, "Mobile has spec fun.\n\r" );
/* if ( IS_NPC( victim )
&& IS_SET( victim->act_hunt, ACT_HUNT_MOVE )
&& victim->move_to != NO_VNUM )
{
sprintf( buf, "@@GMoving to room vnum: (%d) %s.@@g\n\r", victim->move_to,
victim->movename );
strcat( buf1, buf );
}*/
strcpy(buf, "@@GMoving to room vnum: (%d) %s.@@g\n\r");
if ( victim->hunting )
sprintf(buf1+strlen(buf1), buf, victim->hunting->in_room->vnum,
victim->hunting->in_room->name);
else if ( victim->hunt_obj && victim->hunt_obj->in_room )
sprintf(buf1+strlen(buf1), buf, victim->hunt_obj->in_room->vnum,
victim->hunt_obj->in_room->name);
/* if ( IS_NPC(victim) && victim->hunting != NULL)
{
switch( (int) victim->hunting)
{
case -1:
sprintf(buf, "Hunting victim: %s (waiting)\n\r",victim->huntname);
strcat(buf1,buf);
break;
case -2:
sprintf(buf, "Returning home\n\r");
strcat(buf1,buf);
break;
default:
sprintf(buf, "Hunting victim: %s (%s)\n\r",
IS_NPC(victim->hunting) ? victim->hunting->short_descr
: victim->hunting->name,
IS_NPC(victim->hunting) ? "MOB" : "PLAYER" );
strcat(buf1, buf);
if (victim->huntdirs != NULL)
{
sprintf(buf,"Steps to victim: %i\n\r",
strlen(victim->huntdirs)-victim->huntdirno);
strcat(buf1,buf);
}
}
}*/
if ( victim->hunting || victim->hunt_obj )
{
buf[0] = '\0';
if ( victim->hunting ) sprintf(buf+strlen(buf), " hunting for (%s) %s",
(IS_NPC(victim->hunting) ? "mobile" : "player"),
NAME(victim->hunting));
if ( victim->hunt_obj )
{
if ( victim->hunting && IS_SET(victim->hunt_flags, HUNT_CR) &&
victim->hunt_obj->item_type == ITEM_CORPSE_PC )
strcat(buf, " to return a corpse");
else
sprintf(buf+strlen(buf), " looking for (object) %s",
victim->hunt_obj->short_descr);
}
if ( IS_NPC(victim) && IS_SET(victim->hunt_flags, HUNT_MERC|HUNT_CR) &&
victim->hunt_for )
sprintf(buf+strlen(buf), ", employed by %s", NAME(victim->hunt_for));
strcat(buf, ".\n\r");
buf[1] = UPPER(buf[1]);
strcat(buf1, buf+1);
}
else if ( victim->searching )
{
sprintf(buf, "Searching for %s.\n\r", victim->searching);
strcat(buf1, buf);
}
for ( paf = victim->first_affect; paf != NULL; paf = paf->next )
{
sprintf( buf,
"Spell: '%s' modifies %s by %d for %d hours with bits %s.\n\r",
skill_table[(int) paf->type].name,
affect_loc_name( paf->location ),
paf->modifier,
paf->duration,
affect_bit_name( paf->bitvector )
);
strcat( buf1, buf );
}
send_to_char( buf1, ch );
return;
}
void do_olmsg( CHAR_DATA *ch, char *argument )
{
if ( !IS_NPC(ch) )
{
smash_tilde( argument );
free_string( ch->pcdata->load_msg );
ch->pcdata->load_msg = str_dup( argument );
send_to_char( "Ok.\n\r", ch );
}
return;
}
void do_ofindlev( CHAR_DATA *ch, char *argument )
{
extern int top_obj_index;
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
int vnum;
int nMatch;
bool fAll;
bool found;
int level;
int objlev;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Ofindlev what lev.?\n\r", ch );
return;
}
buf1[0] = '\0';
fAll = !str_cmp( arg, "all" );
found = FALSE;
nMatch = 0;
level = is_number(arg) ? atoi(arg) : 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_obj_index; vnum++ )
{
if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
{
nMatch++;
if ( fAll || pObjIndex->level == level )
{
found = TRUE;
objlev=pObjIndex->level;
if ( IS_SET( pObjIndex->extra_flags, ITEM_REMORT ) )
{
sprintf( buf, "(REMORTAL) [%5d] %s\n\r",
pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
safe_strcat(MAX_STRING_LENGTH, buf1, buf);
} else {
sprintf( buf, "( MORTAL) [%5d] %s\n\r",
pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
safe_strcat(MAX_STRING_LENGTH, buf1, buf);
}
}
}
}
if ( !found )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
send_to_char( buf1, ch );
return;
}
void do_mfind( CHAR_DATA *ch, char *argument )
{
extern int top_mob_index;
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
MOB_INDEX_DATA *pMobIndex;
int vnum;
int nMatch;
bool fAll;
bool found;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Mfind whom?\n\r", ch );
return;
}
buf1[0] = '\0';
fAll = !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( arg, pMobIndex->player_name ) )
{
found = TRUE;
sprintf( buf, "[%5d] %s\n\r",
pMobIndex->vnum, capitalize( pMobIndex->short_descr ) );
safe_strcat(MAX_STRING_LENGTH, buf1, buf);
}
}
}
if ( !found )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
send_to_char( buf1, ch );
return;
}
void do_mfindlev( CHAR_DATA *ch, char *argument )
{
extern int top_mob_index;
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
MOB_INDEX_DATA *pMobIndex;
int vnum;
int nMatch;
bool fAll;
bool found;
int level;
int perkills,moblev;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Mfindlev what lev.?\n\r", ch );
return;
}
buf1[0] = '\0';
fAll = !str_cmp( arg, "all" );
found = FALSE;
nMatch = 0;
level = is_number(arg) ? atoi(arg) : 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 || pMobIndex->level == level )
{
found = TRUE;
moblev=pMobIndex->level;
if (kill_table[moblev].killed==0)
perkills=0;
else
perkills=(pMobIndex->killed * 100) / (kill_table[moblev].killed);
sprintf( buf, "(%3d) [%5d] %s\n\r",
perkills,
pMobIndex->vnum, capitalize( pMobIndex->short_descr ) );
safe_strcat(MAX_STRING_LENGTH, buf1, buf);
}
}
}
if ( !found )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
send_to_char( buf1, ch );
return;
}
void do_ofind( CHAR_DATA *ch, char *argument )
{
extern int top_obj_index;
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
int vnum;
int nMatch;
bool fAll;
bool found;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Ofind what?\n\r", ch );
return;
}
buf1[0] = '\0';
fAll = !str_cmp( arg, "all" );
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( arg, pObjIndex->name ) )
{
found = TRUE;
sprintf( buf, "[%5d] %s\n\r",
pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
safe_strcat(MAX_STRING_LENGTH, buf1, buf);
}
}
}
if ( !found )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
send_to_char( buf1, ch );
return;
}
void do_mwhere( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
bool found;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Mwhere whom? or int to see the intelligent mobs.\n\r", ch );
return;
}
if ( !str_cmp( arg, "int" ) )
{
for ( victim = first_char; victim != NULL; victim = victim->next )
{
if ( IS_NPC(victim)
&& victim->in_room != NULL
&& IS_SET( victim->act, ACT_INTELLIGENT ) )
{
sprintf( buf, "[%5d] %-20s [%5d] %-30s\n\r",
victim->pIndexData->vnum,
victim->short_descr,
victim->in_room->vnum,
victim->in_room->name );
send_to_char(buf, ch);
}
}
return;
}
found = FALSE;
for ( victim = first_char; victim != NULL; victim = victim->next )
{
if ( IS_NPC(victim)
&& victim->in_room != NULL
&& is_name( arg, victim->name ) )
{
found = TRUE;
sprintf( buf, "[%5d] %-20s [%5d] %-30s\n\r",
victim->pIndexData->vnum,
victim->short_descr,
victim->in_room->vnum,
victim->in_room->name );
send_to_char(buf, ch);
}
}
if ( !found )
{
send_to_char( "Nope, couldn't find it.\n\r", ch );
return;
}
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;
extern int saving_area;
build_save_flush();
if (saving_area)
{
send_to_char("Please wait until area saving complete.\n",ch);
return;
}
sprintf( buf, "Reboot by %s.", ch->name );
do_echo( ch, buf );
merc_down = TRUE;
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];
extern bool merc_down;
extern int saving_area;
build_save_flush();
if (saving_area)
{
send_to_char("Please wait until area saving complete.\n",ch);
return;
}
sprintf( buf, "Shutdown by %s.", ch->name );
append_file( ch, SHUTDOWN_FILE, buf );
strcat( buf, "\n\r" );
do_echo( ch, buf );
merc_down = TRUE;
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 = first_desc; 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 ( victim == ch )
{
send_to_char( "Ok.\n\r", ch );
return;
}
/*
* Pointed out by Da Pub (What Mud)
*/
if ( !IS_NPC( victim ) )
{
send_to_char( "You cannot switch into a player!\n\r", ch );
return;
}
if ( victim->desc != NULL )
{
send_to_char( "Character in use.\n\r", ch );
return;
}
ch->desc->character = victim;
ch->desc->original = ch;
victim->desc = ch->desc;
ch->desc = NULL;
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;
}
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;
}
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: mload <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 arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
int level;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0' || !is_number( arg1 ) )
{
send_to_char( "Syntax: oload <vnum> <level>.\n\r", ch );
return;
}
if ( arg2[0] == '\0' )
{
level = get_trust( ch );
}
else
{
/*
* New feature from Alander.
*/
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( "Limited to your trust level.\n\r", ch );
return;
}
}
if ( ( pObjIndex = get_obj_index( atoi( arg1 ) ) ) == NULL )
{
send_to_char( "No object has that vnum.\n\r", ch );
return;
}
if ( IS_SET( pObjIndex->extra_flags, ITEM_CLAN_EQ ) && ( ch->level != MAX_LEVEL ) )
{
send_to_char( "Only Creators can OLOAD clan equipment.\n\r", ch );
return;
}
obj = create_object( pObjIndex, level );
if ( CAN_WEAR(obj, ITEM_TAKE) )
{
act( "$n @@mgestures majestically, and@@N $p @@mappears with a crash of @@WTHUNDER!!@@N", ch, obj, NULL, TO_ROOM );
obj_to_char( obj, ch );
}
else
{
obj_to_room( obj, ch->in_room );
act( "$n @@mgestures, and a @@N$p@@M appears with a thunderous crash@@N!!!", 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_DATA *victim;
OBJ_DATA *obj;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
/* 'purge' */
CHAR_DATA *vnext;
OBJ_DATA *obj_next;
for ( victim = ch->in_room->first_person; victim != NULL; victim = vnext )
{
vnext = victim->next_in_room;
if ( IS_NPC(victim) && victim != ch )
extract_char( victim, TRUE );
}
for ( obj = ch->in_room->first_content; obj != NULL; obj = obj_next )
{
obj_next = obj->next_in_room;
extract_obj( obj );
}
act( "$n cleanses the room with Holy fire!", ch, NULL, NULL, TO_ROOM);
send_to_char( "Your burst of Holy fire cleanses the room!\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 PC's.\n\r", ch );
return;
}
act( "$n obliterates $N with Holy fire!", ch, NULL, victim, TO_NOTVICT );
act( "You obliterate $N with Holy fire!", ch, NULL, victim, TO_CHAR );
extract_char( victim, TRUE );
return;
}
void do_advance( CHAR_DATA *ch, char *argument )
{
send_to_char( "Use setclass instead. Advance no longer works here.\n\r", ch );
return;
}
void do_trust( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int level;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[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, arg1 ) ) == NULL )
{
send_to_char( "That player is not here.\n\r", ch);
return;
}
if ( ( level = atoi( arg2 ) ) < 0 || level > MAX_LEVEL )
{
sprintf( buf, "Level must be 0 (reset) or 1 to %d.\n\r", MAX_LEVEL );
send_to_char( buf, 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;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Restore whom?\n\r", ch );
return;
}
if ( !str_cmp( arg, "all" ) )
{
/* then loop through all players and restore them */
CHAR_DATA *vch;
CHAR_DATA *vch_next;
for ( vch = first_char; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if ( !IS_NPC( vch ) && vch->level < 82 )
{
vch->hit = vch->max_hit;
vch->mana = vch->max_mana;
vch->move = vch->max_move;
update_pos( vch );
act( "$n kindly restores you.", ch, NULL, vch, TO_VICT );
}
}
send_to_char ( "Everyone has been restored.\n\r", ch);
return;
}
if ( (victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here!\n\r", ch );
return;
}
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
update_pos( victim );
act( "$n kindly restores 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 buf[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 );
sprintf( buf, "You have been FROZEN by %s!!\n\r", ch->name );
send_to_char( buf, victim );
send_to_char( "Freeze set.\n\r", ch );
sprintf( buf, "%s has been FROZEN by %s.\n\r",
victim->name, ch->name );
notify( buf, ch->level + 1 );
}
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->act, PLR_NO_EMOTE) )
{
REMOVE_BIT(victim->act, PLR_NO_EMOTE);
send_to_char( "You can emote again.\n\r", victim );
send_to_char( "NO_EMOTE removed.\n\r", ch );
}
else
{
SET_BIT(victim->act, PLR_NO_EMOTE);
send_to_char( "Your ability to emote has been removed!\n\r", victim );
send_to_char( "NO_EMOTE 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->act, PLR_NO_TELL) )
{
REMOVE_BIT(victim->act, PLR_NO_TELL);
send_to_char( "You can tell again.\n\r", victim );
send_to_char( "NO_TELL removed.\n\r", ch );
}
else
{
SET_BIT(victim->act, PLR_NO_TELL);
send_to_char( "You now can not use the tell command!\n\r", victim );
send_to_char( "NO_TELL set.\n\r", ch );
}
return;
}
void do_silence( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Silence 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->act, PLR_SILENCE) )
{
REMOVE_BIT(victim->act, PLR_SILENCE);
send_to_char( "You can use channels again.\n\r", victim );
send_to_char( "SILENCE removed.\n\r", ch );
}
else
{
SET_BIT(victim->act, PLR_SILENCE);
send_to_char( "You can't use channels!\n\r", victim );
send_to_char( "SILENCE set.\n\r", ch );
}
return;
}
void do_nopray( CHAR_DATA *ch, char *argument )
{
/* Remove victim's ability to use pray channel.. -S- */
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "NoPray 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->act, PLR_NO_PRAY) )
{
REMOVE_BIT(victim->act, PLR_NO_PRAY);
send_to_char( "You can use 'PRAY' again.\n\r", victim );
send_to_char( "NOPRAY removed.\n\r", ch );
}
else
{
SET_BIT(victim->act, PLR_NO_PRAY);
send_to_char( "You can't use 'PRAY'!\n\r", victim );
send_to_char( "NOPRAY set.\n\r", ch );
}
return;
}
void do_peace( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
for ( rch = ch->in_room->first_person; rch != NULL; rch = rch->next_in_room )
{
if ( rch->fighting != NULL )
stop_fighting( rch, TRUE );
}
send_to_char( "Ok.\n\r", ch );
return;
}
void do_ban( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
char arg2[MSL];
char buf2[MSL];
BAN_DATA *pban;
buf[0] = '\0';
buf2[0] = '\0';
if ( IS_NPC(ch) )
return;
argument = one_argument( argument, arg );
one_argument( argument, arg2 );
if ( arg[0] == '\0' )
{
strcpy( buf, "Banned sites:\n\r" );
for ( pban = first_ban; pban != NULL; pban = pban->next )
{
strcat( buf, pban->name );
sprintf( buf2, ( pban->newbie ? " Newbies" : " All" ) );
safe_strcat( MSL, buf, buf2 );
sprintf( buf2, " Banned by: %s", pban->banned_by );
safe_strcat( MSL, buf, buf2 );
strcat( buf, "\n\r" );
}
send_to_char( buf, ch );
return;
}
for ( pban = first_ban; pban != NULL; pban = pban->next )
{
if ( !str_cmp( arg, pban->name ) )
{
send_to_char( "That site is already banned!\n\r", ch );
return;
}
}
GET_FREE(pban, ban_free);
if ( !str_cmp( arg2, "newbie" ) )
pban->newbie = TRUE;
else
pban->newbie = FALSE;
pban->name = str_dup( arg );
pban->banned_by = str_dup( ch->name );
LINK(pban, first_ban, last_ban, next, prev);
save_bans( );
send_to_char( "Ok.\n\r", ch );
return;
}
void do_allow( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
BAN_DATA *curr;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Remove which site from the ban list?\n\r", ch );
return;
}
for ( curr = first_ban; curr != NULL; curr = curr->next )
{
if ( !str_cmp( arg, curr->name ) )
{
UNLINK(curr, first_ban, last_ban, next, prev);
free_string( curr->name );
free_string( curr->banned_by );
PUT_FREE(curr, ban_free);
send_to_char( "Ok.\n\r", ch );
save_bans( );
return;
}
}
send_to_char( "Site is not banned.\n\r", ch );
return;
}
void do_deathmatc( CHAR_DATA *ch, char *argument )
{
send_to_char( "If you want to start or end a DEATHMATCH, say it in full!\n\r", ch );
return;
}
void do_deathmatch( CHAR_DATA *ch, char *argument )
{
/* This basically locks the mud, and stops saving.
* PKing is allowed with no limits ;)
* Only allow HIGHEST level imms to use...
*/
extern bool deathmatch;
deathmatch = !deathmatch;
if ( IS_NPC( ch ) )
{
send_to_char( "Deathmatch is not a NPC command.\n\r", ch );
return;
}
if ( deathmatch )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
for ( vch = first_char; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if ( !IS_NPC( vch ) )
do_help( vch, "dm" );
}
}
else
{
send_to_char( "Deathmatch ended...\n\r", ch );
info( "+=========================+", 1 );
info( "| DEATHMATCH HAS ENDED!!! |", 1 );
info( "+=========================+", 1 );
}
return;
}
void do_wizlock( CHAR_DATA *ch, char *argument )
{
char buf[MAX_INPUT_LENGTH];
extern bool wizlock;
wizlock = !wizlock;
if ( wizlock )
{
send_to_char( "Game wizlocked.\n\r", ch );
sprintf( buf, "%s wizlocks ACK! Mud.\n\r", ch->name );
}
else
{
send_to_char( "Game un-wizlocked.\n\r", ch );
sprintf( buf, "%s un-wizlocks ACK! Mud.\n\r", ch->name );
}
notify( buf, ch->level );
return;
}
void do_slookup( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
int sn;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Slookup what?\n\r", ch );
return;
}
if ( !str_cmp( arg, "all" ) )
{
buf1[0] = '\0';
for ( sn = 0; sn < MAX_SKILL; sn++ )
{
if ( skill_table[sn].name == NULL )
break;
sprintf( buf, "Sn: %4d Slot: %4d Skill/spell: '%s'\n\r",
sn, skill_table[sn].slot, skill_table[sn].name );
strcat( buf1, buf );
}
send_to_char( buf1, ch );
}
else
{
if ( ( sn = skill_lookup( arg ) ) < 0 )
{
send_to_char( "No such skill or spell.\n\r", ch );
return;
}
sprintf( buf, "Sn: %4d Slot: %4d Skill/spell: '%s'\n\r",
sn, skill_table[sn].slot, skill_table[sn].name );
send_to_char( buf, ch );
}
return;
}
void do_sset( CHAR_DATA *ch, char *argument )
{
char arg1 [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, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax: sset <victim> <skill> <value>\n\r", ch );
send_to_char( "or: sset <victim> all <value>\n\r", ch );
send_to_char( "Skill being any skill or spell.\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == 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" );
if ( fAll && ch->level != 85 )
{
send_to_char( "Only Creators may SSET all.\n\r", ch );
return;
}
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 > 99 )
{
send_to_char( "Value range is 0 to 99.\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 arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
CHAR_DATA *victim;
int value, max;
smash_tilde( argument );
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( str_cmp( arg1, "order" ) )
strcpy( arg3, argument );
if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax: mset <victim> <field> <value>\n\r", ch );
send_to_char( "or: mset <victim> <string> <value>\n\r", ch );
send_to_char( "\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( " gold hp mana move practice align\n\r", ch );
send_to_char( " thirst drunk full race hunt flags aff recall\n\r", ch );
send_to_char( " order (Sumpremes and higher only)\n\r", ch );
send_to_char( "\n\r", ch );
send_to_char( "String being one of:\n\r", ch );
send_to_char( " name short long description title spec\n\r", ch );
send_to_char( " entry exit rulerrank\n\r" , ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
/*
* Snarf the value (which need not be numeric).
*/
value = is_number( arg3 ) ? atoi( arg3 ) : -1;
/*
* Set something.
*/
if ( !str_cmp( arg2, "order" ) )
{
int cnt;
int class[MAX_CLASS];
int parity[MAX_CLASS];
int index[MAX_CLASS];
int foo;
bool ok=TRUE;
char arg[MAX_STRING_LENGTH];
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPCs!\n\r", ch );
return;
}
if ( get_trust(ch) < 84 )
{
send_to_char( "Only a Supreme or above may use this option.\n\r", ch );
return;
}
for ( cnt = 0; cnt < MAX_CLASS; cnt ++ )
parity[cnt] = -1;
for ( cnt = 0; cnt < MAX_CLASS; cnt ++ )
{
argument = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
ok = FALSE;
break;
}
for ( foo = 0; foo < MAX_CLASS; foo++ )
if ( !str_cmp( arg, class_table[foo].who_name ) )
{
class[cnt] = foo;
index[foo] = ( cnt );
parity[foo] = 1;
break;
}
if ( foo == MAX_CLASS )
{
ok = FALSE;
break;
}
}
for ( cnt = 0; cnt < MAX_CLASS; cnt++ )
if ( parity[cnt] == -1 )
ok = FALSE;
if ( !ok )
{
send_to_char( "Must be 5 3-letter abbrev for different classes.\n\r", ch );
return;
}
/* Copy classes to pcdata */
for ( cnt = 0; cnt < MAX_CLASS; cnt++)
{
victim->pcdata->order[cnt] = class[cnt];
victim->pcdata->index[cnt] = index[cnt];
}
send_to_char( "Your classes have been re-ordered.\n\r", victim );
send_to_char( "Done.\n\r", ch );
return;
}
if ( !str_cmp( arg2, "intel") )
{
if (!IS_NPC(victim))
{
send_to_char("Not on PCs.\n\r",ch);
return;
}
if (IS_SET(victim->act,ACT_INTELLIGENT))
{
send_to_char("Removing intelligence.\n\r",ch);
REMOVE_BIT(victim->act,ACT_INTELLIGENT);
}
else
{
send_to_char("Adding intelligence.\n\r",ch);
SET_BIT(victim->act,ACT_INTELLIGENT);
}
}
if ( !str_cmp( arg2, "str" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
max = victim->pcdata->max_str;
if ( value < 3 || value > max )
{
sprintf( buf, "Strength range is 3 to %d.\n\r", max );
send_to_char( buf, ch );
return;
}
victim->pcdata->perm_str = value;
return;
}
if ( !str_cmp( arg2, "int" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
max = victim->pcdata->max_int;
if ( value < 3 || value > max )
{
sprintf( buf, "Intelligence range is 3 to %d.\n\r", max );
send_to_char( buf, ch );
return;
}
victim->pcdata->perm_int = value;
return;
}
if ( !str_cmp( arg2, "wis" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
max = victim->pcdata->max_wis;
if ( value < 3 || value > max )
{
sprintf( buf, "Wisdom range is 3 to %d.\n\r", max );
send_to_char( buf, ch );
return;
}
victim->pcdata->perm_wis = value;
return;
}
if ( !str_cmp( arg2, "dex" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
max = victim->pcdata->max_dex;
if ( value < 3 || value > max )
{
sprintf( buf, "Dexterity range is 3 to %d.\n\r", max );
send_to_char( buf, ch );
return;
}
victim->pcdata->perm_dex = value;
return;
}
if ( !str_cmp( arg2, "con" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
max = victim->pcdata->max_con;
if ( value < 3 || value > max )
{
sprintf( buf, "Constitution range is 3 to %d.\n\r", max );
send_to_char( buf, ch );
return;
}
victim->pcdata->perm_con = value;
return;
}
if ( !str_cmp( arg2, "sex" ) )
{
if ( value < 0 || value > 2 )
{
send_to_char( "Sex range is 0 to 2.\n\r", ch );
return;
}
victim->sex = value;
victim->login_sex = value;
return;
}
if ( !str_cmp( arg2, "class" ) )
{
if ( value < 0 || value >= MAX_CLASS )
{
char buf[MAX_STRING_LENGTH];
sprintf( buf, "Class range is 0 to %d.\n", MAX_CLASS-1 );
send_to_char( buf, ch );
return;
}
victim->class = value;
return;
}
if ( !str_cmp( arg2, "race" ) )
{
if ( value < 0 || value >= MAX_RACE )
{
char buf[MAX_STRING_LENGTH];
sprintf( buf, "Race range is 0 to %d.\n", MAX_RACE-1 );
send_to_char( buf, ch );
return;
}
victim->race = value;
return;
}
if ( !str_cmp( arg2, "rulerrank" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on Npcs.\n\r", ch );
return;
}
if ( value < 0 || value > 5 )
{
char buf[MAX_STRING_LENGTH];
sprintf( buf,"%s", "Ruler Rank is 1 to 5.\n\r" );
send_to_char( buf, ch );
return;
}
victim->pcdata->ruler_rank = value;
return;
}
if (!str_cmp(arg2, "hunt"))
{
CHAR_DATA *hunted = 0;
if ( ch->level < 84 )
{
send_to_char( "Currently restricted to reduce abuses.\n\r", ch );
return;
}
if ( !IS_NPC(victim) )
{
send_to_char( "Not on PC's.\n\r", ch );
return;
}
if ( str_cmp( arg3, "." ) )
{
if ( (hunted = get_char_world(victim, arg3)) == NULL )
{
send_to_char("Mob couldn't locate the victim to hunt.\n\r", ch);
return;
}
if ( !set_hunt(victim, NULL, hunted, NULL, 0, 0) )
/* if ( ! make_hunt(victim,hunted) )*/
send_to_char("Mob could not hunt victim.\n\r",ch);
}
else
{
victim->hunting = NULL;
victim->hunt_obj = NULL;
victim->hunt_for = NULL;
if ( victim->searching )
{
free_string(victim->searching);
victim->searching = NULL;
}
victim->hunt_flags = victim->pIndexData->hunt_flags;
}
return;
}
if ( !str_cmp( arg2, "level" ) )
{
if ( !IS_NPC(victim) )
{
send_to_char( "Not on PC's.\n\r", ch );
return;
}
if ( value < 0 || value > 100 )
{
send_to_char( "Level range is 0 to 100.\n\r", ch );
return;
}
victim->level = value;
return;
}
if ( !str_cmp( arg2, "timer" ) )
{
if ( !IS_NPC(victim) )
{
send_to_char( "Not on PC's.\n\r", ch );
return;
}
victim->extract_timer = value;
return;
}
if ( !str_cmp( arg2, "gold" ) )
{
victim->gold = value;
return;
}
if ( !str_cmp( 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;
return;
}
if ( !str_cmp( 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;
return;
}
if ( !str_cmp( arg2, "move" ) )
{
if ( value < 0 || value > 2000 )
{
send_to_char( "Move range is 0 to 30,000 move points.\n\r", ch );
return;
}
victim->max_move = value;
return;
}
if ( !str_cmp( arg2, "practice" ) )
{
if ( value < 0 || value > 100 )
{
send_to_char( "Practice range is 0 to 100 sessions.\n\r", ch );
return;
}
victim->practice = value;
return;
}
if ( !str_cmp( 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_cmp( arg2, "supermana" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPCs.\n\r", ch );
return;
}
if ( IS_VAMP( victim ) || IS_WOLF( victim ) )
{
send_to_char( "@@eDone!!!@@N\n\r", ch );
victim->pcdata->bloodlust_max = value;
}
else
send_to_char( "They are not a supernatural!!\n\r", ch );
return;
}
if ( !str_cmp( arg2, "thirst" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPCs.\n\r", ch );
return;
}
if ( value < 0 || value > 100 )
{
send_to_char( "Thirst range is 0 to 100.\n\r", ch );
return;
}
victim->pcdata->condition[COND_THIRST] = value;
return;
}
if ( !str_cmp( arg2, "drunk" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( value < 0 || value > 100 )
{
send_to_char( "Drunk range is 0 to 100.\n\r", ch );
return;
}
victim->pcdata->condition[COND_DRUNK] = value;
return;
}
if ( !str_cmp( arg2, "full" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( value < 0 || value > 100 )
{
send_to_char( "Full range is 0 to 100.\n\r", ch );
return;
}
victim->pcdata->condition[COND_FULL] = value;
return;
}
if ( !str_cmp(arg2, "flags" ) )
{
int neg=0;
char * lookupstr=arg3;
if (get_trust(ch) < MAX_LEVEL-1)
{
send_to_char("Only supreme or creator level immortals may use this.\n\r",ch);
return;
}
if (lookupstr[0]=='-')
{
neg=1; lookupstr++;
}
if (lookupstr[0]=='+')
lookupstr++;
value=table_lookup(tab_player_flags,lookupstr);
if (value<1)
{
sprintf(buf,"Valid player flags are :\n\r");
table_printout(tab_player_flags,buf+strlen(buf));
send_to_char(buf,ch);
return;
}
if ( value == PFLAG_VAMP )
{
send_to_char( "@@eNO WAY!!!@@N\n\r", ch );
return;
}
if (neg)
REMOVE_BIT(victim->pcdata->pflags,value);
else
SET_BIT(victim->pcdata->pflags,value);
return;
}
if ( !str_cmp( arg2, "aff" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPCs.\n\r", ch );
return;
}
victim->affected_by = 0;
return;
}
if ( !str_cmp( 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_cmp( arg2, "short" ) )
{
free_string( victim->short_descr );
sprintf ( buf, "%s", arg3 );
victim->short_descr = str_dup( buf );
return;
}
if ( !str_cmp( arg2, "long" ) )
{
free_string( victim->long_descr );
sprintf ( buf, "%s\n\r", arg3 );
victim->long_descr = str_dup( buf );
return;
}
if ( !str_cmp( arg2, "title" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( ch->level < 85 )
{
send_to_char( "This option only available to Creators.\n\r", ch );
return;
}
set_title( victim, arg3 );
return;
}
if ( !str_cmp( arg2, "entry" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
/* if ( ch->level < 85 )
{
send_to_char( "This option only available to Creators.\n\r", ch );
return;
}
*/
free_string( victim->pcdata->room_enter );
sprintf ( buf, "%s", arg3 );
victim->pcdata->room_enter = str_dup( buf );
return;
}
if ( !str_cmp( arg2, "exit" ) )
{
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
/* if ( ch->level < 85 )
{
send_to_char( "This option only available to Creators.\n\r", ch );
return;
}
*/
free_string( victim->pcdata->room_exit );
sprintf ( buf, "%s", arg3 );
victim->pcdata->room_exit = str_dup( buf );
return;
}
if ( !str_cmp( arg2, "recall" ) )
{
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPCs.\n\r", ch );
return;
}
else
{
victim->pcdata->recall_vnum = victim->in_room->vnum;
send_to_char( "Done!\n\r", ch );
send_to_char( "You will now recall to....HERE!\n\r", victim );
}
return;
}
if ( !str_cmp( arg2, "spec" ) )
{
if ( !IS_NPC(victim) )
{
send_to_char( "Not on PC's.\n\r", ch );
return;
}
if ( ( victim->spec_fun = spec_lookup( arg3 ) ) == 0 )
{
send_to_char( "No such spec fun.\n\r", ch );
return;
}
return;
}
/*
* Generate usage message.
*/
do_mset( ch, "" );
return;
}
void do_oset( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
char buf [MAX_STRING_LENGTH];
OBJ_DATA *obj;
int value;
int num;
char *argn;
smash_tilde( argument );
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax: oset <object> <field> <value>\n\r", ch );
send_to_char( "or: oset <object> <string> <value>\n\r", ch );
send_to_char( "\n\r", ch );
send_to_char( "Field being one of:\n\r", ch );
send_to_char( " value0 value1 value2 value3 [v0,v1,v2,v3]\n\r",ch );
send_to_char( " extra wear level weight cost timer condition\n\r", ch );
send_to_char( "\n\r", ch );
send_to_char( "String being one of:\n\r", ch );
send_to_char( " name short long ed\n\r", ch );
return;
}
if ( ( obj = get_obj_world( ch, arg1 ) ) == NULL )
{
send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
return;
}
if ( IS_SET( obj->extra_flags, ITEM_CLAN_EQ ) && ch->level != MAX_LEVEL )
{
send_to_char( "Only creators can OSET Clan equipment!\n\r", ch );
return;
}
/*
* Snarf the value (which need not be numeric).
*/
value = atoi( arg3 );
/*
* Set something.
*/
if ( !str_cmp( arg2, "value0" ) || !str_cmp( arg2, "v0" ) )
{
if ( ch->level < 85 )
return;
obj->value[0] = value;
return;
}
if ( !str_cmp( arg2, "value1" ) || !str_cmp( arg2, "v1" ) )
{
if ( ch->level < 85 )
return;
obj->value[1] = value;
return;
}
if ( !str_cmp( arg2, "value2" ) || !str_cmp( arg2, "v2" ) )
{
if ( ch->level < 85 )
return;
obj->value[2] = value;
return;
}
if ( !str_cmp( arg2, "value3" ) || !str_cmp( arg2, "v3" ) )
{
if ( ch->level < 85 )
return;
obj->value[3] = value;
return;
}
if ( !str_cmp( arg2, "condition" ) || !str_cmp( arg2, "cond" ) )
{
if ( value < 0 || value > 100 )
{
send_to_char( "Condition must be a value between 0 and 100.\n\r", ch );
return;
}
obj->condition = value;
return;
}
if ( !str_cmp( arg2, "extra" ) )
{
num=1;
argn=arg3;
if (argn[0]=='+')
{
num=1;
argn++;
}
if (argn[0]=='-')
{
num=0;
argn++;
}
value=table_lookup(tab_obj_flags,argn);
if (value==0)
{
sprintf(buf,"Values for extra flags are +/- :\n\r");
wide_table_printout(tab_obj_flags,buf+strlen(buf));
send_to_char(buf,ch);
return;
}
if ( !ok_to_use( ch, value ) )
return;
if (num==1)
SET_BIT(obj->extra_flags,value);
else
REMOVE_BIT(obj->extra_flags,value);
return;
}
if ( !str_cmp( arg2, "wear" ) )
{
num=1;
argn=arg3;
if (argn[0]=='+')
{
num=1;
argn++;
}
if (argn[0]=='-')
{
num=0;
argn++;
}
value=table_lookup(tab_wear_flags,argn);
if (value==0)
{
sprintf(buf,"Values for wear flags are +/- :\n\r");
wide_table_printout(tab_wear_flags,buf+strlen(buf));
send_to_char(buf,ch);
return;
}
if ( !ok_to_use( ch, value ) )
return;
if (num==1)
SET_BIT(obj->wear_flags,value);
else
REMOVE_BIT(obj->wear_flags,value);
return;
}
if ( !str_cmp( arg2, "level" ) )
{
if ( ch->level < 85 )
return;
obj->level = value;
return;
}
if ( !str_cmp( arg2, "weight" ) )
{
obj->weight = value;
return;
}
if ( !str_cmp( arg2, "cost" ) )
{
obj->cost = value;
return;
}
if ( !str_cmp( arg2, "timer" ) )
{
obj->timer = value;
return;
}
if ( !str_cmp( arg2, "name" ) )
{
free_string( obj->name );
obj->name = str_dup( arg3 );
return;
}
if ( !str_cmp( arg2, "short" ) )
{
free_string( obj->short_descr );
obj->short_descr = str_dup( arg3 );
return;
}
if ( !str_cmp( arg2, "long" ) )
{
free_string( obj->description );
obj->description = str_dup( arg3 );
return;
}
if ( !str_cmp( arg2, "ed" ) )
{
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;
}
GET_FREE(ed, exdesc_free);
ed->keyword = str_dup( arg3 );
ed->description = str_dup( argument );
LINK(ed, obj->first_exdesc, obj->last_exdesc, next, prev);
return;
}
/*
* Generate usage message.
*/
do_oset( ch, "" );
return;
}
void do_rset( CHAR_DATA *ch, char *argument )
{
char arg1 [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, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
send_to_char( "Syntax: rset <location> <field> value\n\r", ch );
send_to_char( "\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, arg1 ) ) == 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_cmp( arg2, "flags" ) )
{
location->room_flags = value;
return;
}
if ( !str_cmp( arg2, "sector" ) )
{
location->sector_type = value;
return;
}
/*
* Generate usage message.
*/
do_rset( ch, "" );
return;
}
void do_users( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
int count;
count = 0;
buf[0] = '\0';
buf2[0] = '\0';
send_to_char( "\n\r Desc. Connection State. Player Name. Login Site.", ch );
if ( get_trust( ch ) == 85 )
send_to_char(" Port.\n\r", ch );
else
send_to_char( "\n\r", ch );
for ( d = first_desc; d != NULL; d = d->next )
{
if ( d->character != NULL )
{
count++;
switch ( d->connected )
{
case CON_PLAYING:
sprintf( buf3, "%s", "Playing "); break;
case CON_GET_NAME:
sprintf( buf3, "%s", "Get Name "); break;
case CON_GET_OLD_PASSWORD:
sprintf( buf3, "%s", "Get Old Passwd "); break;
case CON_CONFIRM_NEW_NAME:
sprintf( buf3, "%s", "Cnrm New Name "); break;
case CON_GET_NEW_PASSWORD:
sprintf( buf3, "%s", "Get New Passwd "); break;
case CON_CONFIRM_NEW_PASSWORD:
sprintf( buf3, "%s", "Cnfm New Passwd "); break;
case CON_GET_NEW_SEX:
sprintf( buf3, "%s", "Get New Sex "); break;
case CON_GET_NEW_CLASS:
sprintf( buf3, "%s", "Get New Class "); break;
case CON_GET_RACE:
sprintf( buf3, "%s", "Get New Race "); break;
case CON_READ_MOTD:
sprintf( buf3, "%s", "Reading MOTD "); break;
default:
sprintf( buf3, "%s", "Unknown... "); break;
}
sprintf( buf + strlen(buf), "[%3d %2d %18s] %-12s %-30s",
d->descriptor,
d->connected,
buf3,
d->original ? d->original->name :
d->character ? d->character->name : "(none)",
d->host
);
if ( get_trust( ch ) == 85 )
sprintf( buf + strlen(buf), " %5d\n\r", d->remote_port );
else
sprintf( buf + strlen(buf), "\n\r" );
}
}
sprintf( buf2, "%d user%s\n\r", count, count == 1 ? "" : "s" );
strcat( buf, buf2 );
sprintf( buf2, "%s%s%s", colour_string( ch, "stats" ), buf,
colour_string( ch, "normal" ) );
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 arg[MAX_INPUT_LENGTH];
int trust;
int cmd;
argument = one_argument( argument, arg );
if ( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "Force whom to do what?\n\r", ch );
return;
}
/*
* Look for command in command table.
*/
trust = get_trust( ch );
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if ( argument[0] == cmd_table[cmd].name[0]
&& !str_prefix( argument, cmd_table[cmd].name )
&& ( cmd_table[cmd].level > trust
&& cmd_table[cmd].level != 41 ) )
{
send_to_char( "You can't even do that yourself!\n\r", ch );
return;
}
}
/*
* Allow force to be used on ALL mobs....
* Only highest level players to use this... it can cause trouble!!!
* Good for mob "invasions"
* This could get interesting ;)
* -- Stephen
*/
if ( !str_cmp( arg, "everymob" ) )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
if ( ch->level < MAX_LEVEL )
{
send_to_char( "This option is only available to true Gods.\n\r", ch );
return;
}
for ( vch = first_char; vch != NULL; vch = vch=vch_next )
{
vch_next = vch->next;
if ( IS_NPC( vch ) )
{
interpret( vch, argument );
}
}
return;
}
/* Like above but for mobs in same area as ch */
if ( !str_cmp( arg, "localmobs" ) )
{
CHAR_DATA *vim;
CHAR_DATA *vim_next;
for ( vim = first_char; vim != NULL; vim = vim=vim_next )
{
vim_next = vim->next;
if ( IS_NPC( vim )
&& ( vim->in_room->area == ch->in_room->area ) )
{
interpret( vim, argument );
}
}
return;
}
if ( !str_cmp( arg, "all" ) )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
for ( vch = first_char; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if ( !IS_NPC(vch) && !IS_IMMORTAL( vch ) )
{
MOBtrigger = FALSE;
act( "$n forces you to '$t'.", ch, argument, vch, TO_VICT );
interpret( vch, argument );
}
}
}
else
{
CHAR_DATA *victim;
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
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;
}
MOBtrigger = FALSE;
act( "$n forces you to '$t'.", ch, argument, 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 )
{
sh_int level;
char buf[MAX_STRING_LENGTH];
level = -1;
if ( argument[0] != '\0' )
/* Then we have a level argument */
{
if ( !is_number( argument ) )
{
level = get_trust( ch );
}
level = UMAX( 1, atoi( argument ) );
level = UMIN( ch->level, level );
if (IS_SET(ch->act, PLR_WIZINVIS) )
{
ch->invis = level;
sprintf( buf, "Wizinvis changed to level: %d\n\r", level );
send_to_char( buf, ch );
return;
}
}
if ( level == -1 )
level = get_trust( ch );
ch->invis = level;
if ( IS_NPC(ch) )
return;
if ( IS_SET(ch->act, PLR_WIZINVIS) )
{
REMOVE_BIT(ch->act, PLR_WIZINVIS);
act( "Small, dazzling spots of light focus into the shape of $n!", ch, NULL, NULL, TO_ROOM );
send_to_char( "Your body becomes solid again.\n\r", ch );
}
else
{
SET_BIT(ch->act, PLR_WIZINVIS);
act( "$n dissolves into a storm of dazzling points of light!", ch, NULL, NULL, TO_ROOM );
send_to_char( "You slowly vanish into thin air.\n\r", ch );
sprintf( buf, "Setting Wizinvis to level: %d.\n\r", level );
send_to_char( buf, 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;
}
/* Wizify and Wizbit sent in by M. B. King */
void do_wizify( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0' )
{
send_to_char( "Syntax: wizify <name>\n\r" , ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r" , ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on mobs.\n\r", ch );
return;
}
victim->wizbit = !victim->wizbit;
if ( victim->wizbit )
{
act( "$N wizified.\n\r", ch, NULL, victim, TO_CHAR );
act( "$n has wizified you!\n\r", ch, NULL, victim, TO_VICT );
}
else
{
act( "$N dewizzed.\n\r", ch, NULL, victim, TO_CHAR );
act( "$n has dewizzed you!\n\r", ch, NULL, victim, TO_VICT );
}
do_save( victim, "");
return;
}
/* Idea from Talen of Vego's do_where command */
void do_owhere( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
bool found = FALSE;
OBJ_DATA *obj;
OBJ_DATA *in_obj;
int obj_counter = 1;
extern OBJ_DATA * auction_item;
one_argument( argument, arg );
if( arg[0] == '\0' )
{
send_to_char( "Syntax: owhere <object>.\n\r", ch );
return;
}
else
{
for ( obj = first_obj; obj != NULL; obj = obj->next )
{
if ( !can_see_obj( ch, obj ) || !is_name( arg, obj->name ) )
continue;
if ( obj == auction_item )
continue;
found = TRUE;
for ( in_obj = obj; in_obj->in_obj != NULL;
in_obj = in_obj->in_obj )
;
if ( in_obj->carried_by != NULL )
{
sprintf( buf, "[%2d] %s carried by %s [Room:%d].\n\r",
obj_counter,
obj->short_descr,
PERS( in_obj->carried_by, ch ),
in_obj->carried_by->in_room->vnum );
}
else
{
sprintf( buf, "[%2d] %s in %s [Room:%d].\n\r",
obj_counter,
obj->short_descr, ( in_obj->in_room == NULL ) ?
"somewhere" : in_obj->in_room->name,
in_obj->in_room->vnum );
}
obj_counter++;
buf[0] = UPPER( buf[0] );
send_to_char( buf, ch );
}
}
if ( !found )
send_to_char(
"Nothing like that in hell, earth, or heaven.\n\r" , ch );
return;
}
void do_mpcr( CHAR_DATA *ch, char *victim )
{
/* A Function to perform Corpse Retrivals (CRs)
* Gets first corpse (if any) matching argument.
* Will NOT get corpses from the room ch is in, allowing the
* (N)PC to keep calling this function, and to 'pile up' all the
* corpses.
* -- Stephen
*/
OBJ_DATA *obj;
bool found = FALSE;
char arg[MAX_INPUT_LENGTH];
one_argument( victim, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Retrive WHICH corpse??\n\r", ch );
return;
}
for ( obj = first_obj; obj != NULL; obj = obj->next )
{
if ( ( ( obj->pIndexData->vnum ) == OBJ_VNUM_CORPSE_PC )
&& ( !str_cmp( arg, obj->owner ) )
&& ( !( obj->in_room == ch->in_room ) ) ) /*don't work!*/
{
found = TRUE;
obj_from_room( obj );
obj_to_room( obj, ch->in_room );
act( "Got the blighter!", ch, NULL, NULL, TO_CHAR );
}
}
/* act used to enable mobiles to check for CR triggers... */
if ( !found )
{
act( "Couldn't find it.", ch, NULL, NULL, TO_CHAR );
}
return;
}
void do_resetpassword( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
/* char buf[MAX_STRING_LENGTH]; */
CHAR_DATA *victim;
char *pwdnew;
if ( IS_NPC(ch) )
return;
argument=one_argument( argument, arg1 );
argument=one_argument( argument, arg2 );
victim = get_char_world(ch, arg1);
if( victim == '\0' )
{
send_to_char( "This character is not playing at this time\n\r", ch);
return;
}
if ( ( ch->level != L_GOD ) && ch->level < victim->level )
{
send_to_char( "You cannot change the password of immortals!\n\r",ch);
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "You cannot change the password of NPCs!\n\r",ch);
return;
}
if ( ( ch->pcdata->pwd != '\0' )
&& ( arg1[0] == '\0' || arg2[0] == '\0') )
{
send_to_char( "Syntax: password <char> <new>.\n\r", ch );
return;
}
if ( strlen(arg2) < 5 )
{
send_to_char(
"New password must be at least five characters long.\n\r", ch );
return;
}
pwdnew = crypt( arg2, victim->name );
free_string( victim->pcdata->pwd );
victim->pcdata->pwd = str_dup( pwdnew );
save_char_obj( victim );
send_to_char( "Ok.\n\r", ch );
return;
}
void do_iscore( CHAR_DATA *ch, char *argument )
{
/* Show the imm bamfin/out if invis, and if wizlock/deathmatch
* iscore = immortal 'score' --Stephen
*/
char buf[MAX_STRING_LENGTH];
extern bool deathmatch;
extern bool wizlock;
sprintf( buf, "(wiz) Invis: %s Holylight: %s\n\r",
IS_SET( ch->act, PLR_WIZINVIS ) ? "YES" : "NO ",
IS_SET( ch->act, PLR_HOLYLIGHT ) ? "YES" : "NO " );
send_to_char( buf, ch );
if ( IS_SET( ch->act, PLR_WIZINVIS ) )
{
sprintf( buf, "You are wizinvis at level %d.\n\r", ch->invis );
send_to_char( buf, ch );
}
sprintf( buf, "Bamfin: %s\n\r",
(ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0')
? ch->pcdata->bamfin : "Not changed/Switched." );
send_to_char( buf, ch );
sprintf( buf, "Bamfout: %s\n\r",
(ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0' )
? ch->pcdata->bamfout : "Not changed/Switched." );
send_to_char( buf, ch );
sprintf( buf, "Mud Info:\n\rDeathmatch: %s Wizlock: %s\n\r",
deathmatch ? "YES" : "NO ", wizlock ? "YES" : "NO " );
send_to_char( buf, ch );
return;
}
void do_fights( CHAR_DATA *ch, char *argument )
{
/* Displays list of any PCs currently fighting. Also shows 'victim'
* --Stephen
*/
CHAR_DATA *vch;
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
int count;
count = 0;
buf2[0] = '\0';
for ( vch = first_char; vch != NULL; vch = vch->next )
{
if ( !IS_NPC( vch ) && ( vch->fighting != NULL ) && can_see( ch, vch ) )
{
count++;
sprintf( buf, "%s Vs. %s [Room:%5d]\n\r", vch->name, IS_NPC( vch->fighting ) ?
vch->fighting->short_descr : vch->fighting->name,
vch->in_room->vnum );
strcat( buf2, buf );
}
}
if ( count == 0 )
strcat( buf2, "No Players are currently fighting!\n\r" );
else
{
sprintf( buf, "%d fight%s\n\r", count, ( count > 1 ) ? "s." : "." );
strcat( buf2, buf );
}
strcat( buf2, "\n\r" );
send_to_char( buf2, ch );
return;
}
void do_iwhere( CHAR_DATA *ch, char *argument )
{
/* Like WHERE, except is global, and shows area & room.
* --Stephen
*/
CHAR_DATA *vch;
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
int count = 0;
buf2[0] = '\0';
send_to_char( "Name Room Area\n\r", ch );
send_to_char( "---- ---- ----\n\r", ch );
for ( vch = first_char; vch != NULL; vch = vch->next )
{
if ( !IS_NPC( vch ) && can_see( ch, vch ) && !vch->switched )
{
count++;
sprintf( buf, "%-12s [%5d] %-20s\n\r",
vch->name,
vch->in_room == NULL ? 0 : vch->in_room->vnum,
vch->in_room->area->name );
safe_strcat( MSL, buf2, buf );
}
}
if ( count == 0 )
strcat( buf2, "No Players found!\n\r" );
else
{
sprintf( buf, "%d Player%s found.\n\r", count,
( count > 1 ) ? "s" : "" );
strcat( buf2, buf );
}
strcat( buf2, "\n\r" );
send_to_char( buf2, ch );
return;
}
void do_setclass( CHAR_DATA *ch, char *argument )
{
/*
* New version of advance, using some of old code.
* and a slight change to what was left. -S-
* Added support for setting remort class levels.
*/
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int value;
int iClass;
bool cok, remort;
int class = 0;
int cnt;
int lose;
bool vamp = FALSE;
argument = one_argument( argument, arg1 ); /* Player */
argument = one_argument( argument, arg2 ); /* class */
strcpy( arg3, argument ); /* arg3 = value */
if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
send_to_char( "Syntax: SetClass <player> <class> <value>\n\r", ch );
send_to_char( "if value = -1 then player will NOT be able to level in that class.\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
cok = FALSE; remort = FALSE;
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
if ( !str_cmp( arg2, class_table[iClass].who_name ) )
{
class = iClass;
cok = TRUE;
}
if ( !str_cmp( arg2, remort_table[iClass].who_name ) )
{
class = iClass;
cok = TRUE;
remort = TRUE;
}
}
if ( !str_prefix( arg2, "VAMPYRE" ) )
{
send_to_char( "@@eNO WAY!!!@@N", ch );
return;
}
if ( !str_prefix( arg2, "ADEPT" ) )
{
if ( victim->adept_level > 0 )
{
send_to_char( "They are already an adept.\n\r", ch );
return;
}
else
{
class = ADVANCE_ADEPT;
advance_level( victim, class, TRUE, FALSE );
victim->adept_level = 1;
sprintf( buf, " %s %s", victim->name, get_adept_name( victim ) );
do_whoname( ch, buf );
victim->exp = 0;
do_save( victim, "" );
return;
}
}
if ( !cok )
{
send_to_char( "That's not a class!!\n\r", ch );
return;
}
value = is_number( arg3 ) ? atoi( arg3 ) : -9;
if ( value == -9 )
{
send_to_char( "Invalid value for value\n\r\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( ( value < -1 || value > MAX_LEVEL )
/* || ( ( vamp ) && ( value < -1 || value > MAX_VAMP_LEVEL ) ) */ )
{
sprintf( buf, "%d is not a valid value.\n\r", value );
send_to_char( buf, ch );
sprintf( buf, "Use a value between -1 and %d.\n\r\n\r", MAX_LEVEL-1 );
send_to_char( buf, ch );
return;
}
if ( value > get_trust( ch ) )
{
send_to_char( "Limited to your trust level.\n\r", ch );
return;
}
/*
* Lower level:
* Reset to level 1.
* Then raise again.
* Currently, an imp can lower another imp.
* -- Swiftest
*/
if ( ( value <= ( remort ? victim->lvl2[class] : victim->lvl[class] ) )
|| ( ( vamp ) && ( value <= victim->pcdata->vamp_level ) ) )
{
int sn;
lose = ( remort ? victim->lvl2[class] -1 : victim->lvl[class] -1 );
send_to_char( "Lowering a player's level!\n\r", ch );
send_to_char( "**** OOOOHHHHHHHHHH NNNNOOOO ****\n\r", victim );
if ( vamp )
{
if ( value != -1 )
victim->pcdata->vamp_level = 1;
else
victim->pcdata->vamp_level = -1;
victim->pcdata->vamp_exp = 0;
}
else if ( remort )
{
if ( value != -1 )
victim->lvl2[class] = 1;
else
victim->lvl2[class] = -1;
}
else
victim->lvl[class] = 1;
victim->exp = 0;
if ( vamp )
{
victim->pcdata->bloodlust_max = 10;
victim->pcdata->vamp_pracs = 2;
victim->pcdata->vamp_skill_max = 2;
victim->pcdata->vamp_skill_num = 1;
victim->pcdata->bloodlust = 10;
for ( sn = 0; sn < MAX_SKILL; sn++ )
{
victim->pcdata->learned[sn] = 0;
}
victim->pcdata->learned[skill_lookup( "feed" )] = 90;
}
if ( remort )
victim->max_hit -= UMIN( victim->max_hit, lose * remort_table[class].hp_min );
else
victim->max_hit -= UMIN( victim->max_hit, lose * class_table[class].hp_min );
victim->max_mana = 100;
victim->max_move = 100;
for ( sn = 0; sn < MAX_SKILL; sn++ )
victim->pcdata->learned[sn] = 0;
victim->practice = 0;
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
if ( vamp )
{
class = ADVANCE_VAMP;
advance_level( victim, class, FALSE, remort );
}
else
advance_level( victim, class, FALSE, remort );
}
else
{
send_to_char( "Raising a player's level!\n\r", ch );
send_to_char( "**** OOOOHHHHHHHHHH YYYYEEEESSS ****\n\r", victim );
}
if ( value != -1 && !remort && !( vamp ) )
{
sprintf( buf, "You are now level %d in your %s class.\n\r",
value, class_table[class].class_name );
send_to_char( buf, victim );
for ( iClass = victim->lvl[class] ; iClass < value; iClass++ )
{
victim->lvl[class] += 1;
advance_level( victim, class, FALSE, remort );
}
}
if (remort)
{
sprintf( buf, "You are now level %d in your %s class.\n\r",
value, remort_table[class].class_name );
send_to_char( buf, victim );
for ( iClass = victim->lvl2[class]; iClass < value; iClass++ )
{
victim->lvl2[class] += 1;
advance_level( victim, class, FALSE, remort );
}
}
if ( vamp )
{
send_to_char( "@@NYou are now a level %d @@eKindred@@N!!!\n\r", victim );
for ( iClass = victim->pcdata->vamp_level; iClass < value; iClass++ )
{
class = ADVANCE_VAMP;
victim->pcdata->vamp_level += 1;
advance_level( victim, class, FALSE, remort );
}
}
victim->exp = 0;
victim->trust = 0;
/* Make sure that ch->level holds vicitm's max level */
victim->level = 0;
for ( cnt = 0; cnt < MAX_CLASS; cnt++ )
if ( victim->lvl[cnt] > victim->level )
victim->level = victim->lvl[cnt];
/* check for remort levels too... */
for ( cnt = 0; cnt < MAX_CLASS; cnt++ )
if ( victim->lvl2[cnt] > victim->level )
victim->level = victim->lvl2[cnt];
send_to_char( "Ok.\n\r", ch );
return;
}
void do_isnoop( CHAR_DATA *ch, char *argument )
{
/* Creator-only command. Lists who (if anyone) is being snooped.
* -S- */
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH];
int count = 0;
send_to_char( "Snoop List:\n\r-=-=-=-=-=-\n\r", ch );
for ( d = first_desc; d != NULL; d = d->next )
{
if ( d->snoop_by != NULL )
{
count++;
sprintf( buf, "%s by %s.\n\r", d->character->name,
d->snoop_by->character->name );
send_to_char( buf, ch );
}
}
if ( count != 0 )
sprintf( buf, "%d snoops found.\n\r", count );
else
sprintf( buf, "No snoops found.\n\r" );
send_to_char( buf, ch );
return;
}
void do_dog( CHAR_DATA *ch, char *argument )
{
/* A real silly command which switches the (mortal) victim into
* a mob. As the victim is mortal, they won't be able to use
* return ;P So will have to be released by someone...
* -S-
*/
ROOM_INDEX_DATA *location;
MOB_INDEX_DATA *pMobIndex;
CHAR_DATA *mob;
CHAR_DATA *victim;
if ( ch->level < MAX_LEVEL )
{
send_to_char( "Only for creators.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Turn WHO into a little doggy?\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Cannot do this to mobs, only pcs.\n\r",ch);
return;
}
if ( ( pMobIndex = get_mob_index( MOB_VNUM_DOGGY ) ) == NULL )
{
send_to_char( "Couldn't find the doggy's vnum!!\n\r", ch );
return;
}
if ( victim->desc == NULL )
{
send_to_char( "Already switched, like.\n\r", ch );
return;
}
mob = create_mobile( pMobIndex );
location = victim->in_room; /* Remember where to load doggy! */
char_from_room( victim );
char_to_room( victim, get_room_index( ROOM_VNUM_LIMBO ) );
char_to_room( mob, location );
/*
ch->desc->character = victim;
ch->desc->original = ch;
victim->desc = ch->desc;
ch->desc = NULL;
*/
/* Instead of calling do switch, just do the relevant bit here */
victim->desc->character = mob;
victim->desc->original = victim;
mob->desc = victim->desc;
victim->desc = NULL;
act( "$n is suddenly turned into a small doggy!!", victim, NULL, NULL, TO_NOTVICT);
send_to_char( "You suddenly turn into a small doggy!", victim );
send_to_char( "Ok.\n\r", ch );
return;
}
void do_togbuild( CHAR_DATA *ch, char *argument )
{
/* Toggles PC's ch->act PLR_BUILDER value
* -S-
*/
CHAR_DATA *victim;
if ( argument[0] == '\0' )
{
send_to_char( "Toggle who as a builder??\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPCs!\n\r", ch );
return;
}
if ( !IS_SET( victim->act, PLR_BUILDER ) )
{
SET_BIT( victim->act, PLR_BUILDER );
send_to_char( "Bit set to ALLOW building.\n\r", ch );
send_to_char( "You have been authorized to use the builder.\n\r", victim );
}
else
{
REMOVE_BIT( victim->act, PLR_BUILDER );
send_to_char( "Bit set to DISALLOW building.\n\r", ch );
send_to_char( "You authorization to build has been revoked.\n\r", victim );
}
return;
}
void do_togleader( CHAR_DATA *ch, char *argument )
{
/* Toggles PC's ch->pcdata->pfalgs PLR_CLAN_BOSS value
* -S-
*/
CHAR_DATA *victim;
if ( argument[0] == '\0' )
{
send_to_char( "Toggle who as a clan boss??\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPCs!\n\r", ch );
return;
}
if ( !IS_SET( victim->pcdata->pflags, PFLAG_CLAN_BOSS ) )
{
SET_BIT( victim->pcdata->pflags, PFLAG_CLAN_BOSS );
send_to_char( "Bit set for CLAN_BOSS.\n\r", ch );
send_to_char( "You have been set as a clan boss.\n\r", victim );
}
else
{
REMOVE_BIT( victim->pcdata->pflags, PFLAG_CLAN_BOSS );
send_to_char( "Bit removed for CLAN_BOSS.\n\r", ch );
send_to_char( "You are no longer a clan boss.\n\r", victim );
}
return;
}
void do_whoname( CHAR_DATA *ch, char *argument )
{
/* Set victim's who name -
* what appears on who list in place of their levels
* --Stephen
*/
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char foo[MAX_STRING_LENGTH];
int side; /* -1 = left, +1 = right side */
if ( IS_NPC( ch ) )
return;
argument = one_argument( argument, arg );
if ( argument[0] == '\0' || arg[0] == '\0' )
{
send_to_char( "Usage: whoname <victim> <string>\n\r\n\r", ch );
send_to_char( "Where string is no more than 14 letters long.\n\r", ch );
send_to_char( "Use 'off' as name to use default who name.\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "Couldn't find target.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Mobiles don't have a whoname!\n\r", ch );
return;
}
if ( ( get_trust( ch ) < ( MAX_LEVEL -1 ) ) && ch != victim )
{
send_to_char( "Only Supremes and Creators can set the whoname of others.\n\r", ch );
return;
}
if ( !str_cmp( argument, "off" ) )
{
free_string( victim->pcdata->who_name );
victim->pcdata->who_name = str_dup( "off" );
send_to_char( "Who name set to default value.\n\r", ch );
return;
}
if ( my_strlen( argument ) > 14 )
{
send_to_char( "Name too long.\n\r", ch );
do_whoname( ch, "" ); /* Usage message */
return;
}
smash_tilde( argument );
/* Now for the fun part -
* CENTER the string if less than 14 chars <g>
* Add spaces to alternate sides - UGLY
*/
/*foo = str_dup( argument );*/
side =-1;
while( strlen( argument ) < 14 )
{
switch( side )
{
case -1: /* left side */
sprintf( foo, " %s", argument );
break;
case 1:
sprintf( foo, "%s ", argument );
break;
}
side *= -1; /* Switch sides for next loop */
sprintf( argument, "%s", foo );
}
free_string( victim->pcdata->who_name );
victim->pcdata->who_name = str_dup( argument );
send_to_char( "Ok, done.\n\r", ch );
return;
}
void do_lhunt( CHAR_DATA *ch, char *argument )
{
/* Simple function for Imms... loops through all mobs, and
* shows details of any currently hunting someone. -S-
*/
/* Rewritten to suit new hunt functions.. :) -- Alty */
CHAR_DATA *lch;
char buf[MAX_STRING_LENGTH];
bool found = FALSE;
for ( lch = first_char; lch; lch = lch->next )
{
if ( !lch->hunting && !lch->hunt_obj )
{
if ( lch->searching )
{
sprintf(buf, "%s searching for %s.\n\r", NAME(lch), lch->searching);
send_to_char(buf, ch);
found = TRUE;
}
continue;
}
found = TRUE;
sprintf(buf, "%s (%s)", NAME(lch), (IS_NPC(lch) ? "mobile" : "player"));
if ( lch->hunting )
sprintf(buf+strlen(buf), " hunting for (%s) %s",
(IS_NPC(lch->hunting) ? "mobile" : "player"),
NAME(lch->hunting));
if ( lch->hunt_obj )
{
if ( lch->hunting && IS_SET(lch->hunt_flags, HUNT_CR) &&
lch->hunt_obj->item_type == ITEM_CORPSE_PC )
strcat(buf, " to return a corpse");
else
sprintf(buf+strlen(buf), " looking for (object) %s",
lch->hunt_obj->short_descr);
}
if ( IS_NPC(lch) && IS_SET(lch->hunt_flags, HUNT_MERC|HUNT_CR) &&
lch->hunt_for )
sprintf(buf+strlen(buf), ", employed by %s", NAME(lch->hunt_for));
strcat(buf, ".\n\r");
send_to_char(buf, ch);
}
if ( !found )
send_to_char( "No one is currently hunting.\n\r", ch );
return;
}
/* char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
for ( victim = first_char; victim != NULL; victim = victim->next )
{
if ( IS_NPC( victim )
&& IS_SET( victim->act_hunt, ACT_HUNT_MOVE )
&& victim->move_to != NO_VNUM )
{
sprintf( buf, "[%s] Moving to (%d) %s.g\n\r",
victim->short_descr,
victim->move_to,
victim->movename );
strcat( buf1, buf );
}
if ( IS_NPC(victim) && victim->hunting != NULL)
{
switch( (int) victim->hunting)
{
case -1:
sprintf(buf, "[%s] Hunting: %s (waiting)\n\r",
victim->short_descr,
victim->huntname);
strcat(buf1,buf);
break;
case -2:
sprintf(buf, "[%s] Returning home\n\r", victim->short_descr);
strcat(buf1,buf);
break;
default:
sprintf(buf, "[%s] Hunting: %s",
victim->short_descr,
IS_NPC(victim->hunting) ? victim->hunting->short_descr
: victim->hunting->name );
strcat(buf1, buf);
if (victim->huntdirs != NULL)
{
sprintf(buf," (%i steps)",
strlen(victim->huntdirs)-victim->huntdirno);
strcat(buf1,buf);
}
strcat( buf1, "\n\r" );
}
}
}
send_to_char( buf1, ch );
return;
}*/
void do_sstat( CHAR_DATA *ch, char *argument )
{
/* Lists the % for a player's skill(s)
* Either shows all, or value for just a given skill
* -S-
*/
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
int skill = -1;
int sn;
int col;
CHAR_DATA *victim;
argument = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "Usage: sstat <victim> [skill]\n\r", ch );
send_to_char( "Where skill is an optional argument.\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "Couldn't find target.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Mobiles don't have skills!\n\r", ch );
return;
}
if ( argument[0] != '\0' )
{
skill = skill_lookup( argument );
if ( skill == 0 )
{
send_to_char( "No such skill/spell!\n\r", ch );
return;
}
sprintf( buf, "%17s - %3d%%\n\r",
skill_table[skill].name,
victim->pcdata->learned[skill] );
send_to_char( buf, ch );
return;
}
col = 0; buf1[0] = '\0';
for ( sn = 0; sn < MAX_SKILL; sn ++ )
{
if ( skill_table[sn].name == NULL )
break;
sprintf( buf, "%16s - %3d%% ",
skill_table[sn].name,
victim->pcdata->learned[sn] );
strcat( buf1, buf );
if ( ++col % 3 == 0 )
strcat( buf1, "\n\r" );
}
if ( col % 3 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void do_test( CHAR_DATA *ch, char *argument )
{
send_to_char( "html who test!!\n\r", ch );
list_who_to_output();
return;
}
struct monitor_type
{
char *name;
int channel;
int min_level;
char *col;
char *id;
char *on_name;
char *off_name;
};
struct monitor_type monitor_table[] =
{
{ "connection", MONITOR_CONNECT, 83, "@@l", "CON",
"[ CONNECTION ] Shows details of players connecting to the mud.\n\r",
"[ connection ] Not showing details of players connecting.\n\r"
},
{ "area_update", MONITOR_AREA_UPDATE, 82, "@@p", "A_UPD",
"[ AREA_UPDATE ] Informs you of ALL area updates.\n\r",
"[ area_update ] You are not informed of area updates.\n\r"
},
{ "area_bugs", MONITOR_AREA_BUGS, 82, "@@p", "A_BUG",
"[ AREA_BUGS ] Notifies you of any errors within areas.\n\r",
"[ area_bugs ] You are not told of errors within areas.\n\r"
},
{ "area_save", MONITOR_AREA_SAVING, 83, "@@p", "A_SAVE",
"[ AREA_SAVE ] You get told of all area saving.\n\r",
"[ area_save ] You don't get told of all area saves.\n\r"
},
{ "objects", MONITOR_OBJ, 83, "@@r", "OBJ",
"[ OBJECTS ] You are told of problems relating to objects.\n\r",
"[ objects ] You are not told of object-related problems.\n\r"
},
{ "mobile", MONITOR_MOB, 83, "@@a", "MOB",
"[ MOBILE ] Watching mobile/player problems.\n\r",
"[ mobile ] Not watching problems with mobiles/players\n\r"
},
{ "room", MONITOR_ROOM, 83, "@@e", "ROOM",
"[ ROOM ] You are informed of problems involved with rooms.\n\r",
"[ room ] Not informed of problems with rooms.\n\r"
},
{ "imm_general", MONITOR_GEN_IMM, 85, "@@y", "IMM_GEN",
"[ IMM_GENERAL ] You are notified of use of logged immortal commands.\n\r",
"[ imm_general ] You are not told of the use of logged immortal commands.\n\r"
},
{ "mort_general", MONITOR_GEN_MORT, 84, "@@y", "MORT_GEN",
"[ MORT_GENERAL ] You are notified of use of logged mortal commands.\n\r",
"[ mort_general ] You are not told of the use of logged mortal commands.\n\r"
},
{ "combat", MONITOR_COMBAT, 82, "@@R", "COMBAT",
"[ COMBAT ] You are monitoring problems in combat.\n\r",
"[ combat ] Not monitoring any combat problems.\n\r"
},
{ "hunting", MONITOR_HUNTING, 82, "@@B", "HUNT",
"[ HUNTING ] You are told of all mobile hunting.\n\r",
"[ hunting ] Not told about mobiles hunting players.\n\r"
},
{ "build", MONITOR_BUILD, 85, "@@y", "BUILD",
"[ BUILD ] You receive logged building commands.\n\r",
"[ build ] You don't monitor logged building commands.\n\r"
},
{ "clan", MONITOR_CLAN, 84, "@@b", "CLAN",
"[ CLAN ] You are informed of use of certain clan commands.\n\r",
"[ clan ] You are not told of use of certain clan commands.\n\r"
},
{ "bad", MONITOR_BAD, 85, "@@W", "BAD",
"[ BAD ] You are told of 'bad' things players (try to) do!\n\r",
"[ bad ] Not told of 'bad' things players do.\n\r"
},
{ NULL, 0, 0, NULL, NULL }
};
void do_monitor( CHAR_DATA *ch, char *argument )
{
int a;
bool found = FALSE;
char buf[MAX_STRING_LENGTH];
if ( argument[0] == '\0' )
{
send_to_char( "@@yMonitor Channel Details:@@g\n\r\n\r", ch );
for ( a = 0; monitor_table[a].min_level != 0; a++ )
{
if ( monitor_table[a].min_level > get_trust( ch ) )
continue;
if ( IS_SET( ch->pcdata->monitor, monitor_table[a].channel ) )
sprintf( buf, "@@W%s@@g", monitor_table[a].on_name );
else
sprintf( buf, "@@d%s@@g", monitor_table[a].off_name );
send_to_char( buf, ch );
}
send_to_char( "\n\r@@yMONITOR <name> toggles the monitor channels.@@g\n\r", ch );
return;
}
/* Search for monitor channel to turn on/off */
for ( a = 0; monitor_table[a].min_level != 0; a++ )
{
if ( !strcmp( argument, monitor_table[a].name ) )
{
found = TRUE;
if ( IS_SET( ch->pcdata->monitor, monitor_table[a].channel ) )
REMOVE_BIT( ch->pcdata->monitor, monitor_table[a].channel );
else
SET_BIT( ch->pcdata->monitor, monitor_table[a].channel );
break;
}
}
if ( !found )
{
do_monitor( ch, "" );
return;
}
send_to_char( "Ok, monitor channel toggled.\n\r", ch );
return;
}
void monitor_chan( const char *message, int channel )
{
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
int a;
int level = 85;
for ( a = 0; monitor_table[a].min_level != 0; a++ )
if ( monitor_table[a].channel == channel )
{
level = monitor_table[a].min_level;
break;
}
sprintf( buf, "@@W[MON:%s]@@g %s%s@@g\n\r",
monitor_table[a].id, monitor_table[a].col, message );
for ( d = first_desc; d; d = d->next )
{
if ( d->connected == CON_PLAYING
&& !IS_NPC( d->character )
&& IS_SET( d->character->pcdata->monitor, channel )
&& level <= get_trust( d->character ) )
send_to_char( buf, d->character );
}
return;
}
void do_reward( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int value;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0' || arg2[0] == '\0' )
{
send_to_char( "Syntax: reward <victim> <value>\n\r", ch );
send_to_char( "Value being pos to give points, or neg to take points.\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == 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;
}
/*
* Snarf the value.
*/
if ( !is_number( arg2 ) )
{
send_to_char( "Value must be numeric.\n\r", ch );
return;
}
value = atoi( arg2 );
if ( value < -100 || value > 100 )
{
send_to_char( "Value range is -100 to 100.\n\r", ch );
return;
}
sprintf( buf, "@@NYou have been rewarded @@y%3d @@aQuest Points@@N by @@m %s @@N!!!\n\r", value, ch->name );
send_to_char( buf, victim );
sprintf( buf, "@@NYou have rewarded @@r%s @@y%3d @@aQuest Points@@N!!!\n\r", victim->name, value );
send_to_char( buf, ch );
victim->quest_points += value;
return;
}
void do_fhunt ( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *target;
CHAR_DATA *victim;
one_argument ( argument, arg1 );
one_argument ( argument, arg2 );
if ( arg1[0] == '\0'
|| arg2[0] == '\0' )
{
send_to_char ( "Syntax: fhunt <victim> <target/stop>.\n\r", ch );
return;
}
if ( ( victim = get_char_world ( ch, arg1 ) ) == NULL )
{
send_to_char ( "Your victim is not here.\n\r", ch );
return;
}
/* Do not force players to hunt. Can only force mobs */
if ( !IS_NPC( victim ) )
{
send_to_char ( "You can't force a player character to hunt.\n\r", ch);
return;
}
/* force a mob to stop hunting */
if ( str_cmp ( arg2, "stop" ) )
{
if ( victim->hunting != NULL )
{
sprintf ( buf, "%s stops hunting %s.\n\r",
victim->short_descr, victim->hunting->short_descr );
end_hunt ( victim );
send_to_char ( buf, ch );
return;
}
else
{
send_to_char ( "They aren't hunting anyone.\n\r", ch );
return;
}
}
if ( ( target = get_char_world ( victim, arg2 ) ) == NULL )
{
send_to_char ( "The new target to be hunted is not here.\n\r", ch );
return;
}
/* Can not force mobs to hunt non-vamp players */
if ( ( !IS_VAMP( target ) ) && ( !IS_NPC ( target ) ) )
{
send_to_char ( "Mobs cannot hunt non-vamp players\n\r", ch );
return;
}
/* By Now:
* You can only force mobs to hunt.
* All mobs and vamp players are legal prey.
*/
/* if victim is currently in a group, leave group */
/* if ( ( victim->leader != NULL )
|| ( victim->master != NULL ) )
do_follow ( victim, victim ); */
/* once i put this skill in, remember to take out the brackets
* -- do_abandon will kick everyone out of the victim's group if the victim
* is the group leader -- or i guess the whole group can go hunting *shrug*
* - Uni */
/* do_abandon ( victim, "all" ); */
if ( victim->hunting != NULL )
{
sprintf ( buf, "%s stops hunting %s.\n\r", victim->short_descr,
victim->hunting->short_descr );
end_hunt ( victim );
send_to_char ( buf, ch );
}
victim->hunting = target;
sprintf ( buf, "%s starts hunting %s.\n\r", victim->short_descr,
victim->hunting->short_descr );
send_to_char ( buf, ch );
return;
}
void do_alink( CHAR_DATA *ch, char *argument )
{
AREA_DATA * this_area;
ROOM_INDEX_DATA * this_room;
BUILD_DATA_LIST * pointer;
ROOM_INDEX_DATA * current_room;
int area_top, area_bottom;
sh_int doorway;
char buf[MAX_STRING_LENGTH];
this_room = ch->in_room;
this_area = ch->in_room->area;
area_top = this_area->max_vnum;
area_bottom = this_area->min_vnum;
sprintf( buf, "External room links for %s.\n\r THIS DOES NOT INCLUDE ONE WAY DOORS INTO THIS AREA.\n\r", this_area->name + 21 );
send_to_char( buf, ch );
for (pointer = this_area->first_area_room; pointer != NULL; pointer = pointer->next)
{
current_room = pointer->data;
for ( doorway = 0; doorway < 6; doorway++ )
{
EXIT_DATA *pexit;
if ( ( ( pexit = current_room->exit[ doorway ] ) == NULL )
|| ( pexit->to_room == NULL )
|| ( ( pexit->to_room->vnum >= area_bottom )
&& ( pexit->to_room->vnum <= area_top ) ) )
continue;
sprintf( buf, "Room: %d linked to room: %d.\n\r", current_room->vnum, pexit->to_room->vnum );
send_to_char( buf, ch );
}
}
return;
}
void do_togcouncil( CHAR_DATA *ch, char *argument )
{
/* Toggles PC's ch->pcdata->pfalgs PLR_CLAN_BOSS value
* -S-
*/
CHAR_DATA *victim;
if ( argument[0] == '\0' )
{
send_to_char( "Toggle who as a council member??\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPCs!\n\r", ch );
return;
}
if ( !IS_SET( victim->pcdata->pflags, PFLAG_SUPER_COUNCIL ) )
{
SET_BIT( victim->pcdata->pflags, PFLAG_SUPER_COUNCIL );
send_to_char( "Bit set for Council Member.\n\r", ch );
send_to_char( "You have been set as a Council Member.\n\r", victim );
}
else
{
REMOVE_BIT( victim->pcdata->pflags, PFLAG_SUPER_COUNCIL);
send_to_char( "Bit removed for COUNCIL MEMBER.\n\r", ch );
send_to_char( "You are no longer a COUNCIL MEMBER.\n\r", victim );
}
return;
}
void do_imtlset( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
CHAR_DATA *victim;
char arg1 [ MAX_INPUT_LENGTH ];
char buf [ MAX_STRING_LENGTH ];
char buf1 [ MAX_STRING_LENGTH ];
char *buf2;
char *buf3 = NULL;
char *skill;
int cmd;
int col = 0;
int i = 0;
rch = get_char( ch );
if ( !authorized( rch, "imtlset" ) )
return;
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0' )
{
send_to_char( "Syntax: imtlset <victim> +|- <immortal skill>\n\r", ch );
send_to_char( "or: imtlset <victim> +|- all\n\r", ch );
send_to_char( "or: imtlset <victim>\n\r", ch );
return;
}
if ( !( victim = get_char_world( rch, arg1 ) ) )
{
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(rch) <= get_trust(victim) && rch != victim )
{
send_to_char( "You may not imtlset your peer nor your superior.\n\r",
ch );
return;
}
if (( rch == victim ) && (rch->level != MAX_LEVEL) )
{
send_to_char( "You may not set your own immortal skills.\n\r", ch );
return;
}
if ( argument[0] == '+' || argument[0] == '-' )
{
buf[0] = '\0';
smash_tilde( argument );
if ( argument[0] == '+' )
{
argument++;
if ( !str_cmp( "all", argument ) )
{
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if ( cmd_table[cmd].level > get_trust( rch ) )
continue;
if ( cmd_table[cmd].level <= victim->level && cmd_table[cmd].level >= LEVEL_HERO )
{
strcat(buf, cmd_table[cmd].name);
strcat(buf, " ");
}
}
}
else
{
if ( victim->pcdata->immskll )
strcat( buf, victim->pcdata->immskll );
while ( isspace( *argument ) )
argument++;
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if ( cmd_table[cmd].level > get_trust( rch ) )
continue;
if ( !str_cmp( argument, cmd_table[cmd].name ) )
break;
}
if ( cmd_table[cmd].name[0] == '\0' )
{
send_to_char("That is not an immskill.\n\r",ch);
return;
}
if ( !str_infix( argument, victim->pcdata->immskll ) )
{
send_to_char("That skill has already been set.\n\r",ch);
return;
}
strcat( buf, argument );
strcat( buf, " " );
}
}
if ( argument[0] == '-' )
{
argument++;
one_argument( argument, arg1 );
if ( !str_cmp( "all", arg1 ) )
{
free_string( victim->pcdata->immskll );
victim->pcdata->immskll = str_dup( "" );
send_to_char( "All immskills have been deleted.\n\r", ch );
return;
}
else if ( arg1 )
{
/*
* Cool great imtlset <victim> - <skill> code...
* Idea from Canth (phule@xs4all.nl)
* Code by Vego (v942429@si.hhs.nl)
* Still needs memory improvements.... (I think)
*/
buf2 = str_dup( victim->pcdata->immskll );
buf3 = buf2;
if ( (skill = strstr( buf2, arg1 ) ) == NULL )
{
send_to_char( "That person doesn't have that immskill", ch);
return;
}
else
{
while ( buf2 != skill )
buf[i++] = *(buf2++);
while ( !isspace ( *(buf2++) ) );
buf[i] = '\0';
strcat ( buf, buf2 );
}
}
else
{
send_to_char ( "That's not an immskill\n\r", ch );
return;
}
}
free_string( buf3 );
skill = buf2 = buf3 = NULL;
free_string( victim->pcdata->immskll );
victim->pcdata->immskll = str_dup( buf );
}
sprintf( buf, "Immortal skills set for %s:\n\r", victim->name );
send_to_char( buf, ch );
buf1[0] = '\0';
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if ( cmd_table[cmd].level < LEVEL_HERO
|| str_infix( cmd_table[cmd].name, victim->pcdata->immskll ) )
continue;
sprintf( buf, "%-10s", cmd_table[cmd].name );
strcat( buf1, buf );
if ( ++col % 8 == 0 )
strcat( buf1, "\n\r" );
}
if ( col % 8 != 0 )
strcat( buf1, "\n\r" );
send_to_char( buf1, ch );
return;
}
void do_gain_stat_reset( CHAR_DATA *ch, char *argument )
{
CHAR_DATA * victim;
OBJ_DATA * wear_object;
CHAR_DATA * rch;
rch = get_char( ch );
if ( !authorized( rch, "resetgain" ) )
return;
if ( argument[0] == '\0' )
{
send_to_char( "Reset who's gain stats??\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "Not on NPCs!\n\r", ch );
return;
}
reset_gain_stats( victim );
victim->desc->connected = CON_SETTING_STATS;
victim->hitroll = 0;
victim->damroll = 0;
victim->armor = 100;
victim->max_mana = victim->pcdata->mana_from_gain;
victim->max_hit = victim->pcdata->hp_from_gain;
victim->max_move = victim->pcdata->move_from_gain;
for ( wear_object = victim->first_carry; wear_object != NULL; wear_object = wear_object->next_in_carry_list )
{
if ( wear_object->wear_loc > WEAR_NONE )
equip_char( victim, wear_object, wear_object->wear_loc );
}
victim->desc->connected = CON_PLAYING;
send_to_char( "Done!\n\r", ch );
send_to_char( "Your stats have been reset.\n\r", victim );
}
/* Expand the name of a character into a string that identifies THAT
character within a room. E.g. the second 'guard' -> 2. guard */
const char * name_expand (CHAR_DATA *ch)
{
int count = 1;
CHAR_DATA *rch;
char name[MAX_INPUT_LENGTH]; /* HOPEFULLY no mob has a name longer than THAT */
static char outbuf[MAX_INPUT_LENGTH];
if (!IS_NPC(ch))
return ch->name;
one_argument (ch->name, name); /* copy the first word into name */
if (!name[0]) /* weird mob .. no keywords */
{
strcpy (outbuf, ""); /* Do not return NULL, just an empty buffer */
return outbuf;
}
for (rch = ch->in_room->first_person; rch && (rch != ch);rch =
rch->next_in_room)
if (is_name (name, rch->name))
count++;
sprintf (outbuf, "%d.%s", count, name);
return outbuf;
}
/*
* For by Erwin S. Andreasen (4u2@aabc.dk)
*/
void do_for (CHAR_DATA *ch, char *argument)
{
char range[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
bool fGods = FALSE, fMortals = FALSE, fMobs = FALSE, fEverywhere = FALSE, found;
ROOM_INDEX_DATA *room, *old_room;
CHAR_DATA *p, *p_next;
int i;
extern bool disable_timer_abort;
if ( !authorized( ch, "for" ) )
return;
disable_timer_abort = TRUE;
argument = one_argument (argument, range);
if (!range[0] || !argument[0]) /* invalid usage? */
{
do_help (ch, "for");
disable_timer_abort = FALSE;
return;
}
if (!str_prefix("quit", argument))
{
send_to_char ("Are you trying to crash the MUD or something?\n\r",ch);
disable_timer_abort = FALSE;
return;
}
if (!str_cmp (range, "all"))
{
fMortals = TRUE;
fGods = TRUE;
}
else if (!str_cmp (range, "gods"))
fGods = TRUE;
else if (!str_cmp (range, "mortals"))
fMortals = TRUE;
else if (!str_cmp (range, "mobs"))
fMobs = TRUE;
else if (!str_cmp (range, "everywhere"))
fEverywhere = TRUE;
else
do_help (ch, "for"); /* show syntax */
/* do not allow # to make it easier */
if (fEverywhere && strchr (argument, '#'))
{
send_to_char ("Cannot use FOR EVERYWHERE with the # thingie.\n\r",ch);
disable_timer_abort = FALSE;
return;
}
if (fMobs && strchr (argument, '#'))
{
send_to_char ("Cannot use FOR MOBS with the # thingie.\n\r",ch);
disable_timer_abort = FALSE;
return;
}
if (strchr (argument, '#')) /* replace # ? */
{
for (p = first_char; p ; p = p_next)
{
p_next = p->next; /* In case someone DOES try to AT MOBS SLAY # */
found = FALSE;
if (!(p->in_room) || room_is_private(p->in_room) || (p == ch))
continue;
if (IS_NPC(p) && fMobs)
found = TRUE;
else if (!IS_NPC(p) && p->level >= LEVEL_IMMORTAL && fGods)
found = TRUE;
else if (!IS_NPC(p) && p->level < LEVEL_IMMORTAL && fMortals)
found = TRUE;
/* It looks ugly to me.. but it works :) */
if (found) /* p is 'appropriate' */
{
char *pSource = argument; /* head of buffer to be parsed */
char *pDest = buf; /* parse into this */
while (*pSource)
{
if (*pSource == '#') /* Replace # with name of target */
{
const char *namebuf = name_expand (p);
if (namebuf) /* in case there is no mob name ?? */
while (*namebuf) /* copy name over */
*(pDest++) = *(namebuf++);
pSource++;
}
else
*(pDest++) = *(pSource++);
} /* while */
*pDest = '\0'; /* Terminate */
/* Execute */
old_room = ch->in_room;
char_from_room (ch);
char_to_room (ch,p->in_room);
interpret (ch, buf);
char_from_room (ch);
char_to_room (ch,old_room);
} /* if found */
} /* for every char */
}
else /* just for every room with the appropriate people in it */
{
for (i = 0; i < MAX_KEY_HASH; i++) /* run through all the buckets */
for (room = room_index_hash[i] ; room ; room = room->next)
{
found = FALSE;
/* Anyone in here at all? */
if (fEverywhere) /* Everywhere executes always */
found = TRUE;
else if (!room->first_person) /* Skip it if room is empty */
continue;
/* Check if there is anyone here of the requried type */
/* Stop as soon as a match is found or there are no more ppl in room */
for (p = room->first_person; p && !found; p = p->next_in_room)
{
if (p == ch) /* do not execute on oneself */
continue;
if (IS_NPC(p) && fMobs)
found = TRUE;
else if (!IS_NPC(p) && (p->level >= LEVEL_IMMORTAL) && fGods)
found = TRUE;
else if (!IS_NPC(p) && (p->level <= LEVEL_IMMORTAL) && fMortals)
found = TRUE;
} /* for everyone inside the room */
if (found && !room_is_private(room)) /* Any of the required type here AND room not private? */
{
/* This may be ineffective. Consider moving character out of old_room
once at beginning of command then moving back at the end.
This however, is more safe?
*/
old_room = ch->in_room;
char_from_room (ch);
char_to_room (ch, room);
interpret (ch, argument);
char_from_room (ch);
char_to_room (ch, old_room);
} /* if found */
} /* for every room in a bucket */
} /* if strchr */
disable_timer_abort = FALSE;
} /* do_for */
void do_areasave( CHAR_DATA *ch, char *argument )
{
/* -S- : Show list of areas, vnum range and owners. */
AREA_DATA *pArea;
for ( pArea = first_area; pArea != NULL; pArea = pArea->next )
area_modified( pArea );
send_to_char( "Done.\n\r", ch );
return;
}