/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * _/ _/_/_/ _/ _/ _/ ACK! MUD is modified * * _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code * * _/ _/ _/ _/_/ _/ (c)Stephen Zepp 1998 * * _/_/_/_/ _/ _/ _/ Version #: 4.3 * * _/ _/ _/_/_/ _/ _/ _/ * * * * http://ackmud.nuc.net/ * * zenithar@ackmud.nuc.net * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <ctype.h> /* For forks etc. */ #include <unistd.h> #include <fcntl.h> #if defined(__CYGWIN__) #include <crypt.h> #endif #include "globals.h" #include "tables.h" #ifndef DEC_EMAIL_H #include "email.h" #endif void do_transdm( CHAR_DATA * ch, char *argument ) { CHAR_DATA *wch; int room; extern bool deathmatch; char buf[MAX_STRING_LENGTH]; ROOM_INDEX_DATA *location; if( !deathmatch ) { send_to_char( "You must run a DEATHMATCH first.\n\r", ch ); return; } for( wch = first_char; wch != NULL; wch = wch->next ) { if( !IS_NPC( wch ) && ( ch != wch ) ) { if( IS_IMMORTAL( wch ) && ( wch != ch ) ) { send_to_char( "Everyone has been transferred to the DM arena.\n\r", wch ); continue; } room = number_range( 4051, 4099 ); xprintf( buf, "%d", room ); location = find_location( wch, buf ); if( wch->fighting != NULL ) stop_fighting( wch, TRUE ); char_from_room( wch ); char_to_room( wch, location ); send_to_char( "You have been transferred somewhere inside the DEATHMATCH arena!\n\r", wch ); } } send_to_char( "Everyone has been transferred to the DM arena.\n\r", ch ); } 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 ) ) { xprintf( buf, "%-12s", cmd_table[cmd].name ); xcat( buf1, buf ); if( ++col % 6 == 0 ) xcat( buf1, "\n\r" ); } } if( col % 6 != 0 ) xcat( 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; // DESCRIPTOR_DATA d; 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 ) { // bool found = FALSE; // found = load_char_obj( &d, arg, TRUE ); // if (!found) { char buf[MSL]; xprintf( buf, "%s is not online.\n\r", capitalize( arg ) ); // xprintf( buf, "No pFile found for '%s'.\n\r", capitalize( arg ) ); send_to_char( buf, ch ); // free_char( d.character ); return; } // victim = d.character; // d.character = NULL; // victim->desc = NULL; // LINK( victim, first_char, last_char, next, prev ); } 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 ); // if ( victim->desc == NULL ) // do_quit( victim, "" ); return; } if( IS_SET( victim->act, PLR_DENY ) ) { REMOVE_BIT( victim->act, PLR_DENY ); } else { 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; // DESCRIPTOR_DATA df; // bool found = FALSE; 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 && !IS_IMMORTAL( d->character ) && d->character != ch && d->character->in_room != NULL && can_see( ch, d->character ) ) { char buf[MAX_STRING_LENGTH]; xprintf( 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 ) { // found = load_char_obj( &df, arg1, TRUE ); // if (!found) { char buf[MSL]; // xprintf( buf, "No pFile found for '%s'.\n\r", capitalize( arg1 ) ); xprintf( buf, "%s is not online.\n\r", capitalize( arg1 ) ); send_to_char( buf, ch ); // free_char( df.character ); return; } // victim = df.character; // df.character = NULL; // victim->desc = NULL; // LINK( victim, first_char, last_char, next, prev ); } 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 ); // if ( found ) // { // do_quit( victim, "" ); // return; // } 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'; xprintf( buf, "Name: '%s.'\n\rArea: '%s'.\n\r", location->name, location->area->name ); xcat( buf1, buf ); xprintf( buf, "Vnum: %d. Light: %d. Sector: %s.\n\r", location->vnum, location->light, rev_table_lookup( tab_sector_types, location->sector_type ) ); xcat( buf1, buf ); xprintf( buf, "Room flags: %s.\n\rDescription:\n\r%s", bit_table_lookup( tab_room_flags, location->room_flags ), location->description ); xcat( buf1, buf ); if( location->first_exdesc != NULL ) { EXTRA_DESCR_DATA *ed; xcat( buf1, "Extra description keywords: '" ); for( ed = location->first_exdesc; ed; ed = ed->next ) { xcat( buf1, ed->keyword ); if( ed->next != NULL ) xcat( buf1, " " ); } xcat( buf1, "'.\n\r" ); } xcat( buf1, "Characters:" ); for( rch = location->first_person; rch; rch = rch->next_in_room ) { xcat( buf1, " " ); one_argument( rch->name, buf ); xcat( buf1, buf ); } xcat( buf1, ".\n\rObjects: " ); for( obj = location->first_content; obj; obj = obj->next_in_room ) { xcat( buf1, " " ); one_argument( obj->name, buf ); xcat( buf1, buf ); } xcat( buf1, ".\n\r" ); for( door = 0; door <= 5; door++ ) { EXIT_DATA *pexit; if( ( pexit = location->exit[door] ) != NULL ) { xprintf( 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" ); xcat( buf1, buf ); } } if( location->first_room_affect != NULL ) { for( raf = location->first_room_affect; raf != NULL; raf = raf->next ) { xprintf( buf, "Room_Affect: '%s', level %d, duration %d\n\r", skill_table[raf->type].name, raf->level, raf->duration ); xcat( 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; } xprintf( buf, "Name: %s.\n\r", obj->name ); xcat( buf1, buf ); xprintf( buf, "Vnum: %d. Type: %s.\n\r", obj->pIndexData->vnum, item_type_name( obj ) ); xcat( buf1, buf ); xprintf( buf, "Short description: %s.\n\rLong description: %s\n\r", obj->short_descr, obj->description ); xcat( buf1, buf ); xprintf( 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 ) ); xcat( buf1, buf ); xprintf( buf, "ITEM_APPLY: %d.\n\r", obj->item_apply ); xcat( buf1, buf ); xprintf( buf, "Number: %d/%d. Weight: %d/%d.\n\r", 1, get_obj_number( obj ), obj->weight, get_obj_weight( obj ) ); xcat( buf1, buf ); xprintf( buf, "Cost: %d. Timer: %d. Level: %d.\n\r", obj->cost, obj->timer, obj->level ); xcat( buf1, buf ); xprintf( buf, "Condition: %d%%.\n\r", obj->condition ); xcat( buf1, buf ); xprintf(buf, "Speed %4.2f\n\r", obj->speed); xcat(buf1,buf); xprintf( 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 ); xcat( buf1, buf ); xcat( buf1, "Item Values:\n\r" ); for( cnt = 0; cnt < 10; cnt++ ) { xprintf( buf, "@@W[Value%d : @@y%6d@@W] %s", cnt, obj->value[cnt], rev_table_lookup( tab_value_meanings, ( obj->item_type * 10 ) + cnt ) ); xcat( 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 ) xprintf( buf, " @@R(?)@@g\n\r" ); else xprintf( 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' ) xprintf( buf, " @@R(INVALID!)@@g\n\r" ); else xprintf( 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' ) xprintf( buf, " @@R(INVALID!)@@g\n\r" ); else xprintf( buf, " @@y(%s)@@g\n\r", foo ); } else xprintf( buf, "@@g\n\r" ); xcat( buf1, buf ); } /* * xprintf( buf, "Values: %d %d %d %d.\n\r", * obj->value[0], obj->value[1], obj->value[2], obj->value[3] ); * xcat( buf1, buf ); */ if( obj->first_exdesc != NULL || obj->pIndexData->first_exdesc != NULL ) { EXTRA_DESCR_DATA *ed; xcat( buf1, "Extra description keywords: '" ); for( ed = obj->first_exdesc; ed != NULL; ed = ed->next ) { xcat( buf1, ed->keyword ); if( ed->next != NULL ) xcat( buf1, " " ); } for( ed = obj->pIndexData->first_exdesc; ed != NULL; ed = ed->next ) { xcat( buf1, ed->keyword ); if( ed->next != NULL ) xcat( buf1, " " ); } xcat( buf1, "'.\n\r" ); } for( paf = obj->first_apply; paf != NULL; paf = paf->next ) { xprintf( buf, "Affects %s by %d.\n\r", affect_loc_name( paf->location ), paf->modifier ); xcat( 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'; xprintf( buf, "Name: %s. Race %i\n\r", victim->name, victim->race ); xcat( buf1, buf ); xprintf( 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 ); xcat( buf1, buf ); if( IS_NPC( victim ) ) { xprintf( 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 ) ); xcat( buf1, buf ); } else { xprintf( 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 ); xcat( buf1, buf ); } if( !IS_NPC( victim ) ) { xprintf( 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] ); xcat( buf1, buf ); xprintf( buf, "Age: " ); my_get_age( victim, buf ); xcat( buf1, buf ); xprintf( buf, " (%d Hours RL play).\n\r", my_get_hours( victim ) ); xcat( buf1, buf ); xprintf( 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 ); xcat( buf1, buf ); } xprintf( 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 ); xcat( buf1, buf ); xprintf( 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 ); xcat( buf1, buf ); if( !IS_NPC( victim ) ) { xprintf( 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 ); xcat( buf1, buf ); } xprintf( buf, "Hitroll: %d. Damroll: %d. Position: %d. Wimpy: %d.\n\r", GET_HITROLL( victim ), GET_DAMROLL( victim ), victim->position, victim->wimpy ); xcat( buf1, buf ); if( IS_NPC( victim ) ) { xprintf( buf, "MODIFIERS: AC: %d. Hitroll: %d. Damroll: %d.\n\r", victim->ac_mod, victim->hr_mod, victim->dr_mod ); xcat( buf1, buf ); xprintf( buf, "TARGET: %s\n\r", victim->target ); xcat( buf1, buf ); xprintf( buf, "TIMER: %d\n\r", victim->extract_timer ); xcat( buf1, buf ); } if( !IS_NPC( victim ) ) { xprintf( buf, "Page Lines: %d.\n\r", victim->pcdata->pagelen ); xcat( buf1, buf ); } xprintf( buf, "Fighting: %s.\n\r", victim->fighting ? victim->fighting->name : "(none)" ); xcat( buf1, buf ); xprintf(buf,"Fight speed: LH: %4.2f (%4.2f) RH: %4.2f (%4.2f)\n\r", get_speed(victim,SPEED_LH), victim->speed[SPEED_LH], get_speed(victim,SPEED_RH), victim->speed[SPEED_RH]); xcat(buf1,buf); if( !IS_NPC( victim ) ) { xprintf( buf, "@@RBLOODLUST@@g: %d\n\r", victim->pcdata->super->energy ); xcat( buf1, buf ); xprintf( 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 ); xcat( buf1, buf ); } xprintf( buf, "Carry number: %d. Carry weight: %4.2f. @@aQuest Points@@W: @@y%3d\n\r", victim->carry_number, victim->carry_weight, IS_NPC(victim) ? 0 : victim->pcdata->quest_points ); xcat( buf1, buf ); xprintf( buf, "Age: %d. Played: %d. Timer: %d. Act: %d.\n\r", get_age( victim ), ( int )victim->played, victim->timer, victim->act ); xcat( buf1, buf ); xprintf( 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 ) ); xcat( buf1, buf ); xprintf( buf, "Short description: %s.\n\rLong description: %s", victim->short_descr, victim->long_descr[0] != '\0' ? victim->long_descr : "(none).\n\r" ); xcat( buf1, buf ); if( IS_NPC( victim ) && victim->spec_fun != 0 ) xcat( buf1, "Mobile has spec fun.\n\r" ); /* if ( IS_NPC( victim ) && IS_SET( victim->act_hunt, ACT_HUNT_MOVE ) && victim->move_to != NO_VNUM ) { xprintf( buf, "@@GMoving to room vnum: (%d) %s.@@g\n\r", victim->move_to, victim->movename ); xcat( buf1, buf ); }*/ strcpy( buf, "@@GMoving to room vnum: (%d) %s.@@g\n\r" ); if( victim->hunting ) xprintf( buf1 + strlen( buf1 ), buf, victim->hunting->in_room->vnum, victim->hunting->in_room->name ); else if( victim->hunt_obj && victim->hunt_obj->in_room ) xprintf( 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: xprintf(buf, "Hunting victim: %s (waiting)\n\r",victim->huntname); xcat(buf1,buf); break; case -2: xprintf(buf, "Returning home\n\r"); xcat(buf1,buf); break; default: xprintf(buf, "Hunting victim: %s (%s)\n\r", IS_NPC(victim->hunting) ? victim->hunting->short_descr : victim->hunting->name, IS_NPC(victim->hunting) ? "MOB" : "PLAYER" ); xcat(buf1, buf); if (victim->huntdirs != NULL) { xprintf(buf,"Steps to victim: %i\n\r", strlen(victim->huntdirs)-victim->huntdirno); xcat(buf1,buf); } } }*/ if( victim->hunting || victim->hunt_obj ) { buf[0] = '\0'; if( victim->hunting ) xprintf( 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 ) xcat( buf, " to return a corpse" ); else xprintf( 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 ) xprintf( buf + strlen( buf ), ", employed by %s", NAME( victim->hunt_for ) ); xcat( buf, ".\n\r" ); buf[1] = UPPER( buf[1] ); xcat( buf1, buf + 1 ); } else if( victim->searching ) { xprintf( buf, "Searching for %s.\n\r", victim->searching ); xcat( buf1, buf ); } for( paf = victim->first_affect; paf != NULL; paf = paf->next ) { xprintf( 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 ) ); xcat( 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]; char arg2[MSL]; OBJ_INDEX_DATA *pObjIndex; int vnum; int nMatch; bool fAll; bool found; int level; int level_top; int objlev; bool mailme = FALSE; if( is_name( "mailme", argument ) ) mailme = TRUE; argument = one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char( "Ofindlev what lev.?\n\r", ch ); return; } level = is_number( arg ) ? atoi( arg ) : 0; argument = one_argument( argument, arg2 ); if( ( arg2[0] == '\0' ) || ( !is_number( arg2 ) ) ) { level_top = level; } else { level_top = atoi( arg2 ); } 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_obj_index; vnum++ ) { if( ( pObjIndex = get_obj_index( vnum ) ) != NULL ) { nMatch++; if( ( fAll ) || ( ( pObjIndex->level >= level ) && ( pObjIndex->level <= level_top ) ) ) { found = TRUE; objlev = pObjIndex->level; if( IS_SET( pObjIndex->extra_flags, ITEM_REMORT ) ) { xprintf( buf, "\n\r(@@mREMORT@@N) [%3d] [%5d] %s", pObjIndex->level, pObjIndex->vnum, capitalize( pObjIndex->short_descr ) ); xcat( buf1, buf ); } else { xprintf( buf, "\n\r(@@aMORTAL@@N) [%3d] [%5d] %s", pObjIndex->level, pObjIndex->vnum, capitalize( pObjIndex->short_descr ) ); xcat( buf1, buf ); } } } } xcat( buf1, "\n\r" ); if( !found ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); return; } xprintf( buf, "Ofindlev report for level range %d to %d", level, level_top ); send_rep_out( ch, buf1, mailme, buf ); 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; bool mailme = FALSE; if( is_name( "mailme", argument ) ) mailme = TRUE; one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char( "Mfind whom?\n\r", ch ); return; } xprintf( buf1, "%s", " Vnum Lvl Mob\n\r" ); 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; xprintf( buf, "[%5d] [%3d] %s\n\r", pMobIndex->vnum, pMobIndex->level, capitalize( pMobIndex->short_descr ) ); xcat( buf1, buf ); } } } if( !found ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); return; } xprintf( buf, "Mfind report for %s", arg ); send_rep_out( ch, buf1, mailme, buf ); 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]; char arg2[MSL]; MOB_INDEX_DATA *pMobIndex; int vnum; int nMatch; bool fAll; bool found; int level, level_top; int perkills, moblev; bool mailme = FALSE; if( is_name( "mailme", argument ) ) mailme = TRUE; argument = 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; if( ( arg2[0] == '\0' ) || ( !is_number( arg2 ) ) ) { level_top = level; } else { level_top = atoi( arg2 ); } /* * 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 ) && ( pMobIndex->level <= level_top ) ) ) { found = TRUE; moblev = pMobIndex->level; if( kill_table[moblev].killed == 0 ) perkills = 0; else perkills = ( pMobIndex->killed * 100 ) / ( kill_table[moblev].killed ); xprintf( buf, "(%3d) [%3d] [%5d] %s\n\r", perkills, pMobIndex->level, pMobIndex->vnum, capitalize( pMobIndex->short_descr ) ); xcat( buf1, buf ); } } } if( !found ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); return; } xprintf( buf, "Mfindlev report for level range %d to %d", level, level_top ); send_rep_out( ch, buf1, mailme, buf ); 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; bool mailme = FALSE; if( is_name( "mailme", argument ) ) mailme = TRUE; one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char( "Ofind what?\n\r", ch ); return; } xprintf( buf1, "%s", " Vnum Lvl Flag Item\n\r" ); 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; xprintf( buf, "[%5d] [%3d] %s %s\n\r", pObjIndex->vnum, pObjIndex->level, ( IS_SET( pObjIndex->extra_flags, ITEM_REMORT ) ? "@@mRemort@@N" : "@@aMortal@@N" ), capitalize( pObjIndex->short_descr ) ); xcat( buf1, buf ); } } } if( !found ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); return; } xprintf( buf, "Ofind report for %s", arg ); send_rep_out( ch, buf1, mailme, buf ); 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 ) ) { xprintf( 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; xprintf( 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; } xprintf( 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; } xprintf( buf, "Shutdown by %s.", ch->name ); append_file( ch, SHUTDOWN_FILE, buf ); xcat( 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 ) { xprintf( 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 ) ) { if( IS_IMMORTAL( vch ) && ( vch != ch ) ) { act( "Everyone has been restored by $n.", ch, NULL, vch, TO_VICT ); } else { 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 ); xprintf( buf, "You have been FROZEN by %s!!\n\r", ch->name ); send_to_char( buf, victim ); send_to_char( "Freeze set.\n\r", ch ); xprintf( 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; // If anyone has a way to do this with the character not logged in, // please let zenithar@mindspring.com know :) // DESCRIPTOR_DATA d; // bool found = FALSE; 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 ) { // found = load_char_obj( &d, arg, TRUE ); // if (!found) { char buf[MSL]; // xprintf( buf, "No pFile found for '%s'.\n\r", capitalize( arg ) ); xprintf( buf, "%s is not online.\n\r", capitalize( arg ) ); send_to_char( buf, ch ); // free_char( d.character ); return; } // victim = d.character; // d.character = NULL; // victim->desc = NULL; // LINK( victim, first_char, last_char, next, prev ); } 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 ); } // if ( found ) // { // do_quit( victim, "" ); // } 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 ) { xcat( buf, pban->name ); xprintf( buf2, ( pban->newbie ? " Newbies" : " All" ) ); xcat( buf, buf2 ); xprintf( buf2, " Banned by: %s", pban->banned_by ); xcat( buf, buf2 ); xcat( 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 ); 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; sysdata.w_lock = wizlock; save_sysdata( ); if( wizlock ) { send_to_char( "Game wizlocked.\n\r", ch ); xprintf( buf, "%s wizlocks ACK! Mud.\n\r", ch->name ); } else { send_to_char( "Game un-wizlocked.\n\r", ch ); xprintf( buf, "%s un-wizlocks ACK! Mud.\n\r", ch->name ); } notify( buf, get_trust( ch ) ); 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; xprintf( buf, "Sn: %4d Slot: %4d Skill/spell: '%s'\n\r", sn, skill_table[sn].slot, skill_table[sn].name ); xcat( 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; } xprintf( 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 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; 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]; 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 ) { xprintf( 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 ) { xprintf( 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 ) { xprintf( 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 ) { xprintf( 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 ) { xprintf( 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]; xprintf( 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]; xprintf( buf, "Race range is 0 to %d.\n", MAX_RACE - 1 ); send_to_char( buf, ch ); return; } if( ( !IS_NPC( victim ) ) && ( race_table[value].player_allowed == FALSE ) ) { send_to_char( "That is an NPC ONLY race.\n\r", 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]; xprintf( 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->super->energy_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 ) { xprintf( 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 ); xprintf( buf, "%s", arg3 ); victim->short_descr = str_dup( buf ); return; } if( !str_cmp( arg2, "long" ) ) { free_string( victim->long_descr ); xprintf( 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 ); xprintf( 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 ); xprintf( 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] speed\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_prefix( "v", arg2 ) ) { int indexer = -1; char numbuf[10]; if( ch->level < 85 ) return; xprintf( numbuf, "%c", arg2[1] ); if( is_number( numbuf ) ) { indexer = atoi( numbuf ); } else { xprintf( numbuf, "%c", arg1[5] ); if( is_number( numbuf ) ) { indexer = atoi( numbuf ); } } if( ( indexer < 0 ) || ( indexer > 9 ) ) { send_to_char( "Value numbers are 0 - 9.\n\r", ch ); return; } obj->value[indexer] = 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 ) { xprintf( 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 ) { xprintf( 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; } if( !str_cmp( arg2, "speed" ) ) { atof(arg3) > 0 ? (obj->speed = atof(arg3)) : (obj->speed = 0.01); 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: xprintf( buf3, "%s", "Playing " ); break; case CON_GET_NAME: xprintf( buf3, "%s", "Get Name " ); break; case CON_GET_OLD_PASSWORD: xprintf( buf3, "%s", "Get Old Passwd " ); break; case CON_CONFIRM_NEW_NAME: xprintf( buf3, "%s", "Cnrm New Name " ); break; case CON_GET_NEW_PASSWORD: xprintf( buf3, "%s", "Get New Passwd " ); break; case CON_CONFIRM_NEW_PASSWORD: xprintf( buf3, "%s", "Cnfm New Passwd " ); break; case CON_GET_NEW_SEX: xprintf( buf3, "%s", "Get New Sex " ); break; case CON_GET_NEW_CLASS: xprintf( buf3, "%s", "Get New Class " ); break; case CON_GET_RACE: xprintf( buf3, "%s", "Get New Race " ); break; case CON_READ_MOTD: xprintf( buf3, "%s", "Reading MOTD " ); break; default: xprintf( buf3, "%s", "Unknown... " ); break; } xprintf_2( 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 ) xprintf_2( buf + strlen( buf ), " %5d\n\r", d->remote_port ); else xprintf_2( buf + strlen( buf ), "\n\r" ); } } xprintf( buf2, "%d user%s\n\r", count, count == 1 ? "" : "s" ); xcat( buf, buf2 ); xprintf( buf2, "%s%s%s", color_string( ch, "stats" ), buf, color_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_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_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; xprintf( 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 ); xprintf( 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 catbuf[MSL]; char arg[MAX_INPUT_LENGTH]; bool found = FALSE; OBJ_DATA *obj; OBJ_DATA *in_obj; int obj_counter = 1; extern OBJ_DATA *auction_item; bool mailme = FALSE; if( is_name( "mailme", argument ) ) mailme = TRUE; one_argument( argument, arg ); xprintf( buf, "Output for Owhere %s", 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 ) { xprintf( catbuf, "[%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 { xprintf( catbuf, "[%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] ); xcat( buf, catbuf ); } } if( !found ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); } else { xprintf( catbuf, "Owhere report for %s", arg ); send_rep_out( ch, buf, mailme, catbuf ); } 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; xprintf( 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 ) ) { xprintf( buf, "You are wizinvis at level %d.\n\r", ch->invis ); send_to_char( buf, ch ); } xprintf( buf, "Bamfin: %s\n\r", ( ch->pcdata != NULL && ch->pcdata->bamfin[0] != '\0' ) ? ch->pcdata->bamfin : "Not changed/Switched." ); send_to_char( buf, ch ); xprintf( buf, "Bamfout: %s\n\r", ( ch->pcdata != NULL && ch->pcdata->bamfout[0] != '\0' ) ? ch->pcdata->bamfout : "Not changed/Switched." ); send_to_char( buf, ch ); xprintf( 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++; xprintf( 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 ); xcat( buf2, buf ); } } if( count == 0 ) xcat( buf2, "No Players are currently fighting!\n\r" ); else { xprintf( buf, "%d fight%s\n\r", count, ( count > 1 ) ? "s." : "." ); xcat( buf2, buf ); } xcat( 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++; xprintf( buf, "%-12s [%5d] %-20s\n\r", vch->name, vch->in_room == NULL ? 0 : vch->in_room->vnum, vch->in_room->area->name ); xcat( buf2, buf ); } } if( count == 0 ) xcat( buf2, "No Players found!\n\r" ); else { xprintf( buf, "%d Player%s found.\n\r", count, ( count > 1 ) ? "s" : "" ); xcat( buf2, buf ); } xcat( 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; xprintf( 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 ) ) */ ) { xprintf( buf, "%d is not a valid value.\n\r", value ); send_to_char( buf, ch ); xprintf( 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] ) ) { send_to_char( "That wouldn't accomplish much!\n\r", ch ); return; } if( ( value < ( remort ? victim->lvl2[class] : victim->lvl[class] ) ) || ( ( vamp ) && ( value <= victim->pcdata->super->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->super->level = 1; else victim->pcdata->super->level = -1; victim->pcdata->super->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->super->energy_max = 10; victim->pcdata->super->pracs = 2; victim->pcdata->super->skills_max = 2; victim->pcdata->super->skills_learned = 1; victim->pcdata->super->energy = 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 ) ) { xprintf( 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 ) { xprintf( 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->super->level; iClass < value; iClass++ ) { class = ADVANCE_VAMP; victim->pcdata->super->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++; xprintf( buf, "%s by %s.\n\r", d->character->name, d->snoop_by->character->name ); send_to_char( buf, ch ); } } if( count != 0 ) xprintf( buf, "%d snoops found.\n\r", count ); else xprintf( 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( nocol_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( nocol_strlen( argument ) < 14 ) { switch ( side ) { case -1: /* left side */ xprintf( foo, " %s", argument ); break; case 1: xprintf( foo, "%s ", argument ); break; } side *= -1; /* Switch sides for next loop */ xprintf_2( 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 ) { xprintf( buf, "%s searching for %s.\n\r", NAME( lch ), lch->searching ); send_to_char( buf, ch ); found = TRUE; } continue; } found = TRUE; xprintf( buf, "%s (%s)", NAME( lch ), ( IS_NPC( lch ) ? "mobile" : "player" ) ); if( lch->hunting ) xprintf( 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 ) xcat( buf, " to return a corpse" ); else xprintf( 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 ) xprintf( buf + strlen( buf ), ", employed by %s", NAME( lch->hunt_for ) ); xcat( 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 ) { xprintf( buf, "[%s] Moving to (%d) %s.g\n\r", victim->short_descr, victim->move_to, victim->movename ); xcat( buf1, buf ); } if ( IS_NPC(victim) && victim->hunting != NULL) { switch( (int) victim->hunting) { case -1: xprintf(buf, "[%s] Hunting: %s (waiting)\n\r", victim->short_descr, victim->huntname); xcat(buf1,buf); break; case -2: xprintf(buf, "[%s] Returning home\n\r", victim->short_descr); xcat(buf1,buf); break; default: xprintf(buf, "[%s] Hunting: %s", victim->short_descr, IS_NPC(victim->hunting) ? victim->hunting->short_descr : victim->hunting->name ); xcat(buf1, buf); if (victim->huntdirs != NULL) { xprintf(buf," (%i steps)", strlen(victim->huntdirs)-victim->huntdirno); xcat(buf1,buf); } xcat( 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; } xprintf( 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; xprintf( buf, "%16s - %3d%% ", skill_table[sn].name, victim->pcdata->learned[sn] ); xcat( buf1, buf ); if( ++col % 3 == 0 ) xcat( buf1, "\n\r" ); } if( col % 3 != 0 ) xcat( buf1, "\n\r" ); send_to_char( buf1, ch ); return; } void do_test( CHAR_DATA * ch, char *argument ) { char testing[MSL]; char catbuf[MSL]; xprintf( testing, "%s", "Testing anti-color capitalize:" ); xprintf( catbuf, argument ); xcat( testing, capitalize( catbuf ) ); xcat( testing, "\n\r" ); send_to_char( testing, ch ); 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"}, {"magic", MONITOR_MAGIC, 83, "@@a", "MAGIC", "[ MAGIC ] You are informed of various spell casting info.\n\r", "[ magic ] Not informed of spell casting info.\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"}, {"debug", MONITOR_DEBUG, 85, "@@W", "DEBUG", "[ DEBUG ] You are watching code debugging info!\n\r", "[ debug ] Not watching code debugging info.\n\r"}, {"imc", MONITOR_IMC, 84, "@@W", "IMC", "[ IMC ] You are told of imc net traffic.\n\r", "[ imc ] Not told of imc net traffic.\n\r"}, {"system", MONITOR_SYSTEM, 84, "@@W", "SYSTEM", "[ SYSTEM ] You are told of system messages.\n\r", "[ system ] Not told of system messages.\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]; buf[0] = '\0'; 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++ ) { char colbuf[10]; colbuf[0] = '\0'; if( monitor_table[a].min_level > get_trust( ch ) ) continue; if( IS_SET( ch->pcdata->monitor, monitor_table[a].channel ) ) { if( !IS_NPC( ch ) ) { xprintf( colbuf, "@@%c", ch->pcdata->hicol ); xcat( buf, colbuf ); } xcat( buf, monitor_table[a].on_name ); } else { if( !IS_NPC( ch ) ) { xprintf( colbuf, "@@%c", ch->pcdata->dimcol ); xcat( buf, colbuf ); } xcat( buf, 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; if( ( area_resetting_global ) && ( channel == MONITOR_MAGIC ) ) return; for( a = 0; monitor_table[a].min_level != 0; a++ ) if( monitor_table[a].channel == channel ) { level = monitor_table[a].min_level; break; } xprintf( buf, "%s[%7s]@@N %s@@N\n\r", monitor_table[a].col, monitor_table[a].id, strip_out( message, "\n\r" ) ); 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; } xprintf( buf, "@@NYou have been rewarded @@y%3d @@aQuest Points@@N by @@m %s @@N!!!\n\r", value, ch->name ); send_to_char( buf, victim ); xprintf( buf, "@@NYou have rewarded @@r%s @@y%3d @@aQuest Points@@N!!!\n\r", victim->name, value ); send_to_char( buf, ch ); victim->pcdata->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 ) { xprintf( 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 ) { xprintf( 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; xprintf( 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; xprintf( 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; xprintf( 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_gain_stat_reset( CHAR_DATA * ch, char *argument ) { CHAR_DATA *victim; OBJ_DATA *wear_object; CHAR_DATA *rch; rch = get_char( ch ); 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++; xprintf( 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; 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_otype( 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; bool mailme = FALSE; if( is_name( "mailme", argument ) ) mailme = TRUE; one_argument( argument, arg ); if( arg[0] == '\0' ) if( arg[0] == '\0' ) { xprintf( buf, "Values for object types:\n\r" ); wide_table_printout( tab_item_types, buf + strlen( buf ) ); send_to_char( buf, 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, tab_item_types[( pObjIndex->item_type ) - 1].text ) ) { found = TRUE; xprintf( buf, "<%d> %s [%5d] %s\n\r", pObjIndex->level, ( IS_SET( pObjIndex->extra_flags, ITEM_REMORT ) ? "@@mRemort@@N" : "@@aMortal@@N" ), pObjIndex->vnum, pObjIndex->short_descr ); xcat( buf1, buf ); } } } if( !found ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); return; } xprintf( buf, "Otype report for %s", arg ); send_rep_out( ch, buf1, mailme, buf ); return; } void do_owear( 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; bool mailme = FALSE; if( is_name( "mailme", argument ) ) mailme = TRUE; one_argument( argument, arg ); if( arg[0] == '\0' ) { xprintf( buf, "Values for wear slots:\n\r" ); wide_table_printout( tab_wear_flags, buf + strlen( buf ) ); send_to_char( buf, 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 || !str_infix( arg, bit_table_lookup( tab_wear_flags, pObjIndex->wear_flags ) ) ) { found = TRUE; xprintf( buf, "<%s> [%5d] [%3d] %s %s\n\r", bit_table_lookup( tab_wear_flags, pObjIndex->wear_flags ), pObjIndex->vnum, pObjIndex->level, ( IS_SET( pObjIndex->extra_flags, ITEM_REMORT ) ? "@@mRemort@@N" : "@@aMortal@@N" ), pObjIndex->short_descr ); xcat( buf1, buf ); } } } if( !found ) { send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch ); return; } xprintf( buf, "Owear report for %s", arg ); send_rep_out( ch, buf1, mailme, buf ); return; } 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; } void do_findreset( CHAR_DATA * ch, char *argument ) { char arg1[MSL], arg2[MSL]; char outbuf[MSL], catbuf[MSL]; bool mworld = FALSE; bool mailme = FALSE; bool fmob = FALSE, fobj = FALSE; int vnum = 0; char mailsub[MSL]; RESET_DATA *reset; MOB_INDEX_DATA *pMob; OBJ_INDEX_DATA *pObj; if( IS_NPC( ch ) ) { send_to_char( "Not for NPCs.\n\r", ch ); return; } if( is_name( "+w", argument ) ) mworld = TRUE; if( is_name( argument, "mailme" ) ) mailme = TRUE; argument = one_argument( argument, arg1 ); if( arg1[0] == '\0' ) { xprintf( outbuf, "%s", "Syntax for findreset:\n\r" ); xprintf( catbuf, "%s", "findreset obj/mob <vnum> [+w]\n\r+w shows all resets in the world, default is current area only.\n\r" ); xcat( outbuf, catbuf ); send_to_char( outbuf, ch ); return; } if( !is_name( arg1, "mob obj" ) ) { do_findreset( ch, "" ); return; } if( !str_cmp( arg1, "mob" ) ) fmob = TRUE; else fobj = TRUE; argument = one_argument( argument, arg2 ); if( ( arg2[0] == '\0' ) || ( !is_number( arg2 ) ) ) { do_findreset( ch, "" ); return; } vnum = atoi( arg2 ); xprintf( outbuf, "Resets for %s %d:\n\r", arg1, vnum ); if( mworld ) { AREA_DATA *pArea; pMob = get_mob_index( vnum ); if( pMob == NULL ) { send_to_char( "Invalid mobile.\n\r", ch ); return; } for( pArea = first_area; pArea; pArea = pArea->next ) { for( reset = pArea->first_reset; reset; reset = reset->next ) { if( fmob ) { switch ( reset->command ) { default: continue; break; case 'M': { RESET_DATA *similar = reset; if( reset->arg1 != vnum ) continue; xprintf( catbuf, "Room: %d, limit of: %d\n\r", reset->arg3, reset->arg2 ); xcat( outbuf, catbuf ); /* * scan for give and equip commands for this mob */ while( similar ) { similar = similar->next; if( similar->command != 'G' && similar->command != 'E' ) break; if( similar->command == 'G' ) { pObj = get_obj_index( similar->arg1 ); if( pObj != NULL ) { if( pMob->pShop != NULL ) xcat( outbuf, " sells " ); else xcat( outbuf, " with " ); xprintf( catbuf, "[%d] %s.\n\r", pObj->vnum, pObj->name ); xcat( outbuf, catbuf ); } else { xprintf( catbuf, "[%d] unknown object in give reset!\n\r", similar->arg1 ); xcat( outbuf, catbuf ); } } else if( similar->command == 'E' ) { pObj = get_obj_index( similar->arg1 ); if( pObj != NULL ) xprintf( catbuf, " equiped with [%d] %s, on %s.\n\r", pObj->vnum, pObj->name, tab_wear_loc[( similar->arg3 )].text ); else xprintf( catbuf, "[%d] unknown object equipped on %s.\n\r", similar->arg1, tab_wear_loc[similar->arg3].text ); xcat( outbuf, catbuf ); } } break; } /* case M */ } /* switch */ } /* if ( fmob ) */ } /* for reset */ } /* for pArea */ xprintf( mailsub, "Findresets for %s %d:\n\r", arg1, vnum ); send_rep_out( ch, outbuf, mailme, mailsub ); return; } /* if ( mworld ) */ send_to_char( "Currently not implemented.\n\r", ch ); return; }