/**************************************************************************/
// interp.cpp - main game interpreter and related code
/***************************************************************************
* The Dawn of Time v1.69r (c)1997-2004 Michael Garratt *
* >> A number of people have contributed to the Dawn codebase, with the *
* majority of code written by Michael Garratt - www.dawnoftime.org *
* >> To use this source code, you must fully comply with all the licenses *
* in licenses.txt... In particular, you may not remove this copyright *
* notice. *
***************************************************************************
* >> Original Diku Mud copyright (c)1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, & Katja Nyboe. *
* >> Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* >> ROM 2.4 is copyright 1993-1995 Russ Taylor and has been brought to *
* you by the ROM consortium: Russ Taylor(rtaylor@pacinfo.com), *
* Gabrielle Taylor(gtaylor@pacinfo.com) & Brian Moore(rom@rom.efn.org) *
* >> Oblivion 1.2 is copyright 1996 Wes Wagner *
**************************************************************************/
#include "include.h" // dawn standard includes
#include "interp.h"
#include "security.h"
#include "clan.h"
bool check_disabled (char_data *ch, const struct cmd_type *command);
#define END_MARKER "END" // for load_disabled() and save_disabled()
bool check_social(char_data *ch, char *command, char *argument, bool global);
/*
* Command logging types.
*/
#define LOG_ALWAYS 0 /* always logged into the system log */
#define LOG_PALWAYS 1 // always log players only into the system log
// dont log NPC's use of the command
#define LOG_OLC 3 /* ALWAYS Logged into OLC log files */
#define LOG_NORMAL 5 /* Logged into log files (when LOG ALL is on */
/* or a player log is on... if plog on, also */
/* logged into their own player log. */
#define LOG_PLOGONLY 7 /* only logged into players log file when */
/* player is being logged, not logged into */
/* main system. */
#define LOG_DONT_LOG 8 /* not logged but can be snooped - eg directions */
#define LOG_NEVER 10 /* Never logged - only thing not snoopable */
bool fLogAll = false; // Log-all switch.
char last_command[MSL]; // Global variable to hold the last command
char last_input[MSL]; // Global variable to hold the last input
int com_category_lookup(char *name);
/**************************************************************************/
// Command table.
struct cmd_type cmd_table [] =
{
/*
* Common movement commands.
*/
{ "north", do_north, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "east", do_east, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "south", do_south, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "west", do_west, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "up", do_up, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "ne", do_northeast, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "northeast", do_northeast, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "se", do_southeast, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "southeast", do_southeast, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "sw", do_southwest, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "southwest", do_southwest, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "nw", do_northwest, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "northwest", do_northwest, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "down", do_down, POS_STANDING, 0, LOG_DONT_LOG, 0 },
// for speedwalking abbreviations
{ "t", do_northeast, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "g", do_southeast, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "f", do_southwest, POS_STANDING, 0, LOG_DONT_LOG, 0 },
{ "r", do_northwest, POS_STANDING, 0, LOG_DONT_LOG, 0 },
/* commands put here to make them run first
* - none of these show on help menus -
*
* Placed here so one and two letter abbreviations work.
*/
{ "wiz", do_wizhelp, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "wizgrantlist", do_wizgrantlist, POS_DEAD, ADMIN, LOG_NORMAL, 0 },
{ "got", do_goto, POS_DEAD, L8, LOG_NORMAL, 0 },
{ "at", do_at, POS_DEAD, L7, LOG_NORMAL, 1 },
{ "bu", do_buy, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "ba", do_backstab, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "ban", do_ban, POS_DEAD, ADMIN-1, LOG_ALWAYS, 0 },
{ ":", do_immtalk, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "affec", do_affects, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "autolis", do_autolist, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "bec", do_bec, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "c", do_cast_redirect, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "chat", do_chat, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "cas", do_cast, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "com", do_commune, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "class", do_class, POS_DEAD, COUNCIL, LOG_ALWAYS, 0 },
{ "sum", do_summon, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "charinf", do_charinfo, POS_DEAD, IM, LOG_ALWAYS, 0 },
{ "channe", do_channel, POS_STANDING, 0, LOG_NORMAL, 0 },
{ "command", do_commands, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "compar", do_compare, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "enveno", do_envenom, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "exit", do_exits, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "ge", do_get, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "grou", do_group, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "inventor", do_inventory, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "iwher", do_iwhere, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "loo", do_look, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "lis", do_list, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "kil", do_kill, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "mwher", do_mwhere, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "mot", do_motd, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "mob", do_mob, POS_DEAD, 0, LOG_NEVER, 0 },
{ "mq", do_mobqueue, POS_DEAD, 0, LOG_NEVER, 0 },
{ "orde", do_order, POS_RESTING, 0, LOG_PALWAYS, 0 },
{ "pinf", do_pinfo, POS_DEAD, L7, LOG_NORMAL, 0 },
{ "practic", do_practice, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "prefi", do_prefi, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "res", do_rest, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "recit", do_recite, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "retel", do_retell, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "repl", do_reply, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "sa", do_say, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "soc", do_globalsocial, POS_SLEEPING, DIS,LOG_NORMAL, 0 }, // gs is already enabled
{ "socket", do_sockets, POS_DEAD, L4, LOG_NORMAL, 0 },
{ "secon", do_second, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "sl", do_sleep, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "stan", do_stand, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "scor", do_score, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "tel", do_tell, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "unloc", do_unlock, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "wh", do_who, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "wiel", do_wear, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "seevnu", do_seevnum, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "wor", do_worth, POS_SLEEPING, 0, LOG_NORMAL, 0 },
/* all commands - sorted alphabetically */
{ "'", do_say, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "\"", do_whisper, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "\\", do_speedwalk, POS_STANDING, 0, LOG_NORMAL, 0 },
{ ",", do_emote, POS_RESTING, 0, LOG_NORMAL, 0 },
{ ".", do_ooc, POS_DEAD, 0, LOG_NORMAL, 0 },
{ ">", do_retell, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "[", do_admintalk, POS_DEAD, ADMIN, LOG_NORMAL, 0 },
{ "]", do_hightalk, POS_DEAD, ML-1, LOG_NORMAL, 0 },
{ "=", do_codetalk, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "-", do_mythostalk, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "/", do_recall, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "add", do_add, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "affects", do_affects, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "afk", do_afk, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "alia", do_alia, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "alias", do_alias, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "alignstat", do_alignstats, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "amote", do_amote, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "answer", do_answer, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "ansi", do_colour, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "apply", do_apply, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "append", do_append, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "areas", do_areas, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "areasalpha", do_areasalpha, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "askname", do_askname, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "attune", do_attune, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "autoanswer", do_autoanswer, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "autoassist", do_autoassist, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autodamage", do_autodamage, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autoexit", do_autoexit, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autoexamine", do_autoexamine, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autogold", do_autogold, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autokeepalive", do_autokeepalive, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autolandonrest", do_autolandonrest, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autolist", do_autolist, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autoloot", do_autoloot, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autopeek", do_autopeek, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autopkassist", do_autopkassist, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autorecall", do_autorecall, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autoreformat", do_autoreformat, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "autoself", do_autoself, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autosubdue", do_autosubdue, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autosplit", do_autosplit, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autotrack", do_autotrack, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "autowhoinvislogin",do_autowhoinvislogin, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "autowizilogin", do_autowizilogin, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "autowraptells", do_autowraptells, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "awareness", do_awareness, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "backstab", do_backstab, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "bank", do_bank, POS_STANDING, 0, LOG_ALWAYS, 1 },
{ "bash", do_bash, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "battlelag", do_battlelag, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "berserk", do_berserk, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "becomeactive", do_becomeactive, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "brandish", do_brandish, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "brief", do_brief, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "bs", do_backstab, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "bug", do_bug, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "buy", do_buy, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "brew", do_brew, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "build", do_build, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "bury", do_bury, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "bypassduel", do_bypassduel, POS_RESTING, 0, LOG_ALWAYS, 1 },
{ "cannibalize", do_cannibalize, POS_STANDING, IM, LOG_NORMAL, 1 },
{ "cast", do_cast, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "changes", do_changes, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "channels", do_channels, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "circle", do_circle, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "close", do_close, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "claw", do_claw, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "classstats", do_classstats, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "classinfo", do_classinfo, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "clantalk", do_clantalk, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "cranks", do_clanranks, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "clanranks", do_clanranks, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "color", do_colour, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "colour", do_colour, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "collect", do_collect, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "cook", do_cook, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "combine", do_combine, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "commands", do_commands, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "commune", do_commune, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "compact", do_compact, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "compare", do_compare, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "consider", do_consider, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "continue", do_continue, POS_RESTING, 0, LOG_NORMAL, 0 },
{ "count", do_count, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "cskinfo", do_cskinfo, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "cspinfo", do_cspinfo, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "credits", do_credits, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "ctalk", do_clantalk, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "ctime", do_compile_time, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "dawnftp", do_dawnftp, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "delet", do_delet, POS_DEAD, 0, LOG_ALWAYS, 0 },
{ "delete", do_delete, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "demote", do_demote, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "description", do_description, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "diagnose", do_diagnose, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "dig", do_dig, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "dirt", do_dirt, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "disarm", do_disarm, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "dismount", do_dismount, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "donate", do_donate, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "drink", do_drink, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "drag", do_drag, POS_STANDING, IM, LOG_ALWAYS, 1 },
{ "draw", do_draw, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "drop", do_drop, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "duel", do_duel, POS_STANDING, 0, LOG_ALWAYS, 1 },
{ "acceptduel", do_acceptduel, POS_STANDING, 0, LOG_ALWAYS, 1 },
{ "declineduel", do_declineduel, POS_RESTING, 0, LOG_ALWAYS, 1 },
{ "declineooc", do_declineooc, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "eat", do_eat, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "emote", do_emote, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "empty", do_empty, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "enter", do_enter, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "envenom", do_envenom, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "equipment", do_equipment, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "examine", do_examine, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "exits", do_exits, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "fill", do_fill, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "fullexits", do_fullexits, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "forget", do_forget, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "fork", do_fork, POS_STANDING, IM, LOG_NORMAL, 1 },
{ "flee", do_flee, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "flame", do_flame, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "flourish", do_flourish, POS_STANDING, IM, LOG_NORMAL, 1 },
{ "flip", do_flip, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "fly", do_fly, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "follow", do_follow, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "for", do_force, POS_DEAD, L7, LOG_ALWAYS, 0 },
{ "forage", do_forage, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "freevnum", do_freevnum, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "gain", do_gain, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "gamble", do_gamble, POS_SITTING, 0, LOG_ALWAYS, 1 },
{ "gamesettings", do_gamesettings, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "get", do_get, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "genname", do_genname, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "give", do_give, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "glance", do_glance, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "gs", do_globalsocial, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "go", do_enter, POS_STANDING, 0, LOG_NORMAL, 0 },
{ "goooc", do_goooc, POS_STANDING, 0, LOG_ALWAYS, 1 },
{ "gore", do_gore, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "gouge", do_gouge, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "gprompt", do_gprompt, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "grab", do_grab, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "grats", do_grats, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "group", do_group, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "groups", do_skillgroups, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "heal", do_heal, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "help", do_help, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "helpcat", do_helpcat, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "helplist", do_helplist, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "helpprev", do_helpprev, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "helpnext", do_helpnext, POS_DEAD, 0, LOG_NORMAL, 1 },
// { "helphistory", do_helphistory, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "herbalism", do_herbalism, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "herblore", do_herblore, POS_SITTING, IM, LOG_ALWAYS, 1 },
{ "hide", do_hide, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "history", do_history, POS_DEAD, 1, LOG_NORMAL, 1 },
{ "hit", do_kill, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "hlook", do_hlook, POS_DEAD, 1, LOG_NORMAL, 1 },
{ "hold", do_hold, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "ic", do_ic, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "ictime", do_time, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "ideas", do_idea, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "info", do_skillgroups, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "introduce", do_introduce, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "inventory", do_inventory, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "invitelist", do_invitelist, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "ispell", do_ispell, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "kick", do_kick, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "kill", do_kill, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "kneel", do_kneel, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "knock", do_knock, POS_SITTING, 0, LOG_NORMAL, 1 },
{ "lay", do_lay_on_hands, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "lag", do_lag, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "language", do_language, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "land", do_land, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "laston", do_laston, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "lastonreload", do_lastonreload, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "letter", do_letter, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "lines", do_scroll, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "list", do_list, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "loc", do_lockers, POS_RESTING, 0, LOG_ALWAYS, 0 },
{ "lock", do_lock, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "lockers", do_lockers, POS_RESTING, 0, LOG_ALWAYS, 1 },
{ "look", do_look, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "lore", do_lore, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "losepet", do_losepet, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "mccp", do_mccp, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "metric", do_metric, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "misc", do_misc, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "mixflask", do_mixflask, POS_RESTING, 0, LOG_ALWAYS, 1 }, // mix herbs in a flask
{ "mode", do_mode, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "moon", do_weather, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "moot", do_moot, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "motd", do_motd, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "msp", do_msp, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "mudstats", do_mudstats, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "mudftp", do_dawnftp, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "mxp", do_mxp, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "mxpreflect", do_mxpreflect, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "name_b4short", do_name_b4short, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "name_only_4known",do_name_only_4known,POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "needlepoint", do_needlepoint, POS_STANDING, 0, LOG_ALWAYS, 1 },
{ "news", do_news, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "newbietalk", do_newbietalk, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "nofollow", do_nofollow, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "nomisc", do_nomisc, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "nosummon", do_nosummon, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "nocharm", do_nocharm, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "nonames", do_nonames, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "noheromsg", do_noheromsg, POS_DEAD, HE-1, LOG_NORMAL, 1 },
{ "notes", do_note, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "noteach", do_noteach, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "nspeak", do_nspeak, POS_SLEEPING, 0, LOG_ALWAYS, 1 },
{ "ntalk", do_ntalk, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "ntell", do_ntell, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "nreply", do_nreply, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "ooc", do_ooc, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "open", do_open, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "order", do_order, POS_RESTING, 0, LOG_PALWAYS, 1 },
{ "outcast", do_outcast, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "outfit", do_outfit, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "ownerlist", do_ownerlist, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "panic", do_panic, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "password", do_password, POS_DEAD, 0, LOG_NEVER, 1 },
{ "peek", do_peek, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "pick", do_pick, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "place", do_place, POS_STANDING, 0, LOG_ALWAYS, 1 },
{ "pkinfo", do_pkinfo, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "pmote", do_pmote, POS_RESTING, 0, LOG_PALWAYS, 0 },
{ "pour", do_pour, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "pose", do_pose, POS_RESTING, DIS, LOG_NORMAL, 1 }, // needs to be enabled if used
{ "pounce", do_pounce, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "practice", do_practice, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "pray", do_pray, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "promote", do_promote, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "prompt", do_prompt, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "push", do_push, POS_STANDING, IM, LOG_ALWAYS, 1 },
{ "put", do_put, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "quaff", do_quaff, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "question", do_question, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "quester", do_quester, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "qpoints", do_qpoints, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "qui", do_qui, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "quiet", do_quiet, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "quit", do_quit, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "racestats", do_racestats, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "raceinfo", do_raceinfo, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "ride", do_ride, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "read", do_read, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "recall", do_recall, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "recite", do_recite, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "remove", do_remove, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "rent", do_rent, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "replay", do_replay, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "replaychannels", do_replaychannels, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "replayroom", do_replayroom, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "reply", do_reply, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "report", do_report, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "requestooc", do_requestooc, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "requestletgain", do_requestletgain, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "rpsheet", do_rpsheet, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "rptell", do_rptell, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "rpreply", do_rpreply, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "cletgain", do_cancelletgain, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "rletgain", do_requestletgain, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "cancelletgain", do_cancelletgain, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "rescue", do_rescue, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "rest", do_rest, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "retell", do_retell, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "retreat", do_retreat, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "rules", do_rules, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "save", do_save, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "rsay", do_rsay, POS_RESTING, 0, LOG_NORMAL, 0 }, // remembered say for mobprogs
{ "say", do_say, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "saymote", do_saymote, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "sayto", do_sayto, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "scan", do_sscan, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "score", do_score, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "scroll", do_scroll, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "scribe", do_scribe, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "search", do_search, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "set", do_set, POS_DEAD, L3, LOG_ALWAYS, 1 },
{ "setage", do_setage, POS_RESTING, 0, LOG_ALWAYS, 1 },
{ "setdeity", do_setdeity, POS_DEAD, L2, LOG_NORMAL, 1 },
{ "setichour", do_setichour, POS_DEAD, ML, LOG_NORMAL, 1 },
{ "setrooms", do_setrooms, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "second", do_second, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "seek", do_seek, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "sell", do_sell, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "shadow", do_shadow, POS_STANDING, IM, LOG_NORMAL, 1 },
{ "sharpen", do_sharpen, POS_RESTING, IM, LOG_ALWAYS, 1 },
{ "show", do_show, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "showaffects", do_showaffects, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "showmisc", do_showmisc, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "sheathe", do_sheathe, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "sit", do_sit, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "skills", do_skills, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "skillgroups", do_skillgroups, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "slice", do_slice, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "sleep", do_sleep, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "smote", do_smote, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "sneak", do_sneak, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "social", do_globalsocial, POS_SLEEPING, DIS,LOG_NORMAL, 1 }, // gs is already enabled
{ "socials", do_socials, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "socshow", do_socshow, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "spells", do_spells, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "spinfo", do_spinfo, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "sinfo", do_sinfo, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "sing", do_sing, POS_DEAD, IM, LOG_NORMAL, 1 }, // Beginning of bards
{ "speedwalk", do_speedwalk, POS_STANDING, 0, LOG_ALWAYS, 1 },
{ "split", do_split, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "stand", do_stand, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "steal", do_steal, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "story", do_story, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "study", do_study, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "surrender", do_surrender, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "subdue", do_subdue, POS_RESTING, 0, LOG_ALWAYS, 1 },
{ "summon", do_summon, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "take", do_get, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "tame", do_tame, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "teach", do_teach, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "tell", do_tell, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "tether", do_tether, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "throw", do_throw, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "date", do_time, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "time", do_time, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "title", do_title, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "train", do_train, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "tracks", do_tracks, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "trip", do_trip, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "typo", do_typo, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "unalias", do_unalias, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "unlock", do_unlock, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "unread", do_unread, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "untether", do_untether, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "uptime", do_uptime, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "value", do_value, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "vanish", do_vanish, POS_STANDING, 0, LOG_NORMAL, 1 },
{ "visible", do_visible, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "unhide", do_visible, POS_SLEEPING, 0, LOG_NORMAL, 0 }, // visible alias
{ "vote", do_vote, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "wake", do_wake, POS_SLEEPING, 0, LOG_NORMAL, 1 },
{ "wear", do_wear, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "weather", do_weather, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "whisper", do_whisper, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "who", do_who, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "whois", do_whois, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "whoformat", do_whoformat, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wield", do_wear, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "wimpy", do_wimpy, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "wizlist", do_wizlist, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "worship", do_worship, POS_STANDING, IM, LOG_NORMAL, 1 },
{ "worth", do_worth, POS_SLEEPING, 0, LOG_NORMAL, 1 },
// worth aliases
{ "money", do_worth, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "gold", do_worth, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "silver", do_worth, POS_SLEEPING, 0, LOG_NORMAL, 0 },
{ "yell", do_yell, POS_RESTING, 0, LOG_NORMAL, 1 },
{ "testyell", do_testyell, POS_RESTING, IM, LOG_NORMAL, 1 },
{ "zap", do_zap, POS_RESTING, 0, LOG_NORMAL, 1 },
// Putting Weapon skills down here so they don't interfere with other commands
{ "boneshatter", do_boneshatter, POS_FIGHTING, IM, LOG_ALWAYS, 0 },
{ "charge", do_charge, POS_STANDING, IM, LOG_ALWAYS, 0 },
{ "conceal", do_conceal, POS_RESTING, IM, LOG_ALWAYS, 0 },
{ "cutoff", do_cutoff, POS_FIGHTING, IM, LOG_ALWAYS, 0 },
{ "dervish", do_dervish, POS_FIGHTING, IM, LOG_ALWAYS, 0 },
{ "entangle", do_entangle, POS_FIGHTING, IM, LOG_ALWAYS, 0 },
{ "hobble", do_hobble, POS_FIGHTING, IM, LOG_ALWAYS, 0 },
{ "hurl", do_hurl, POS_FIGHTING, IM, LOG_ALWAYS, 0 },
{ "overhead", do_overhead, POS_FIGHTING, IM, LOG_ALWAYS, 0 },
{ "shieldcleave", do_shieldcleave, POS_FIGHTING, IM, LOG_ALWAYS, 0 },
{ "vault", do_vault, POS_STANDING, IM, LOG_ALWAYS, 0 },
// new mapping features - mortal
{ "automap", do_automap, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "autoreset", do_autoreset, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "autosaymote", do_autosaymote, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "autosaycolourcodes", do_autosaycolourcodes, POS_DEAD,0, LOG_ALWAYS, 1 },
{ "autovote", do_autovote, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "map", do_map, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "mapclear", do_mapclear, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "nomapexits", do_nomapexits, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "nomapblanks", do_nomapblanks, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "areamap", do_areamap, POS_DEAD, IM+1,LOG_ALWAYS, 1 },
{ "scalemap", do_scalemap, POS_DEAD, IM+1,LOG_ALWAYS, 1 },
{ "scalemxp", do_scalemxp, POS_DEAD, IM+1,LOG_ALWAYS, 1 },
// new mapping features - immortal only
{ "mapnum", do_mapnum, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "fullmap", do_fullmap, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "amap", do_amap, POS_DEAD, IM, LOG_ALWAYS, 1 },
/*
* --== Immortal commands ==--
*
* ML MAX_LEVEL = implementor (100)
* L1 MAX_LEVEL - 1 = creator (99)
* L2 MAX_LEVEL - 2 = supreme being (98)
* L3 MAX_LEVEL - 3 = deity (97)
* L4 MAX_LEVEL - 4 = god (96)
* L5 MAX_LEVEL - 5 = immortal (95)
* L6 MAX_LEVEL - 6 = demigod (94)
* L7 MAX_LEVEL - 7 = angel (93)
* L8 MAX_LEVEL - 8 = avatar (92)
* IM LEVEL_IMMORTAL = angel (92)
* HE LEVEL_HERO = hero (91)
*/
/* first imm commands that dont show up on wizhelp menu */
{ "dump", do_dump, POS_DEAD, ML, LOG_ALWAYS, 0 },
{ "reboo", do_reboo, POS_DEAD, L2, LOG_NORMAL, 0 },
{ "shutdow", do_shutdow, POS_DEAD, L2, LOG_NORMAL, 0 },
{ "sla", do_sla, POS_DEAD, L3, LOG_NORMAL, 0 },
{ "invis", do_wizinvis, POS_DEAD, IM, LOG_NORMAL, 0 },
/* immortal commands on the menus */
{ "admintalk", do_admintalk, POS_DEAD, ADMIN, LOG_NORMAL, 1 },
{ "addclan", do_addclan, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "addcourt", do_addcourt, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "addmoot", do_addmoot, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "addscript", do_addscript, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "advance", do_advance, POS_DEAD, L1, LOG_ALWAYS, 1 },
{ "allow", do_allow, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "allow", do_allow, POS_DEAD, L3, LOG_ALWAYS, 0 },
{ "allowimmtalk", do_allowimmtalk, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "anote", do_anote, POS_DEAD, ADMIN+1,LOG_NORMAL, 1 },
{ "anote", do_anote, POS_DEAD, ADMIN, LOG_NORMAL, 0 },
{ "atell", do_atell, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "atlevel", do_atlevel, POS_DEAD, L6, LOG_NORMAL, 1 },
{ "ban", do_ban, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "banedit", do_banedit, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "bardify", do_bardify, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "breaktell", do_breaktell, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "boon", do_boon, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "castatlevel", do_castatlevel, POS_FIGHTING, IM, LOG_ALWAYS, 1 },
{ "chardesc", do_chardescript, POS_DEAD, 1, LOG_ALWAYS, 1 },
{ "charhistory", do_charhistory, POS_DEAD, 1, LOG_ALWAYS, 1 },
{ "charinfo", do_charinfo, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "charnotes", do_charnotes, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "checkbug", do_checkbug, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "checkclanbank", do_checkclanbank, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "checkcode", do_checkcode, POS_DEAD, ML-1, LOG_ALWAYS, 1 },
{ "checkdead", do_checkdead, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "checkhelps", do_checkhelp, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "checklog", do_checklog, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "checkirc", do_checkirc, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "checkbalance", do_checkbalance, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "checkexits", do_checkexits, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "checkmoblog", do_checkmoblog, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "checkooc", do_checkooc, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "checkmultilog", do_checkmultilog, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "checknewbie", do_checknewbie, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "checknsup", do_checknsupport, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "checkntalk", do_checkntalk, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "checktypos", do_checktypos, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "checkban", do_checkban, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "cinfo", do_cinfo, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "clist", do_clanlist, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "clanlist", do_clanlist, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "class", do_class, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "createspell", do_createspell, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "clone", do_clone, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "cwhere", do_cwhere, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "codetalk", do_codetalk, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "clear_createcount",do_clear_createcount,POS_DEAD,ML-1, LOG_ALWAYS, 1 },
{ "councillist", do_councillist, POS_DEAD, IM+1, LOG_ALWAYS, 1 },
{ "delmoot", do_delmoot, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "delscript", do_delscript, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "delquest", do_delquest, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "deny", do_deny, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "disable", do_disable, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "disconnect", do_disconnect, POS_DEAD, L3, LOG_ALWAYS, 1 },
{ "disallowpkill", do_disallowpkill, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "dlook", do_dlook, POS_DEAD, 1, LOG_NORMAL, 1 },
{ "dofor", do_for, POS_DEAD, ADMIN+1,LOG_ALWAYS, 1 },
{ "dream", do_dream, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "echo", do_echo, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "editcharnote", do_editcharnotes, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "exitlist", do_exitlist, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "exlist", do_exitlist, POS_DEAD, L4, LOG_ALWAYS, 0 },
{ "fadein", do_fadein, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "fadeout", do_fadeout, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "flag", do_flag, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "freeze", do_freeze, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "force", do_force, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "mforce", do_mforce, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "nforce", do_nforce, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "forcetick", do_forcetick, POS_DEAD, L1, LOG_ALWAYS, 1 },
{ "gecho", do_gecho, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "got", do_goto, POS_DEAD, L8, LOG_NORMAL, 0 },
{ "goecho", do_goecho, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "goto", do_goto, POS_DEAD, L8, LOG_NORMAL, 1 },
{ "herbedit", do_herbedit, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "holylist", do_holylist, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "holylight", do_holylight, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "holyname", do_holyname, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "holyspeech", do_holyspeech, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "holywalk", do_holywalk, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "holyvnum", do_holyvnum, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "hotreboot", do_hotreboot, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "hightalk", do_hightalk, POS_DEAD, ML-1, LOG_NORMAL, 1 },
{ "ignoremulti", do_ignoremultilogins,POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "hideareas", do_hide_hidden_areas,POS_DEAD, IM, LOG_NORMAL, 1 },
{ "immtalk", do_immtalk, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "immget", do_immget, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "immtitle", do_immtitle, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "immwiznet", do_immwiznet, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "immwiznetc", do_immwiznetc, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "imotd", do_imotd, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "incognito", do_incognito, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "inote", do_inote, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "inroom", do_inroom, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "iwizi", do_iwizi, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "iwhere", do_iwhere, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "jail", do_jail, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "ktell", do_ktell, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "lastoncouncil", do_lastoncouncil, POS_DEAD, ML-1, LOG_ALWAYS, 1 },
{ "lastonremove", do_lastonremove, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "lastonstats", do_lastonstats, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "langedit", do_langedit, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "letgain", do_letgain, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "lethero", do_lethero, POS_DEAD, L3, LOG_ALWAYS, 1 },
{ "listscripts", do_listscripts, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "listquest", do_listquest, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "load", do_load, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "localechos", do_localecho, POS_DEAD, 1, LOG_ALWAYS, 0 },
{ "localecho", do_localecho, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "log", do_log, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "memory", do_memory, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "mixedit", do_mixedit, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "mixshow", do_mixshow, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "mythostalk", do_mythostalk, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "mwhere", do_mwhere, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "mpdump", do_mpdump, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "mplist", do_mplist, POS_DEAD, 2, LOG_ALWAYS, 1 },
{ "mpstat", do_mpstat, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "mudclientstats", do_mudclientstats, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "mxpinfo", do_mxpinfo, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "newbielock", do_newbielock, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "noble", do_noble, POS_DEAD, L1, LOG_ALWAYS, 1 },
{ "nochannel", do_nochannels, POS_DEAD, 2, LOG_ALWAYS, 0 },
{ "nochannels", do_nochannels, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "noemote", do_noemote, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "norp", do_norp, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "noshout", do_noshout, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "notell", do_notell, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "noterestrict", do_noterestrict, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "nopray", do_nopray, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "nsupport", do_nsupport, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "owhere", do_owhere, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "listletgain", do_list_letgains, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "listmoot", do_listmoot, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "clearletgain", do_clearletgain, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "offletgain", do_offlineletgain, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "offlineletgain", do_offlineletgain, POS_DEAD, L7, LOG_ALWAYS, 0 },
{ "offmoot", do_offmoot, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "declinelet", do_declineletgain, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "declineletgain", do_declineletgain, POS_DEAD, L7, LOG_ALWAYS, 0 },
{ "page", do_page, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "pdisable", do_pdisable, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "peace", do_peace, POS_DEAD, L5, LOG_NORMAL, 1 },
{ "pecho", do_pecho, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "penalty", do_penalty, POS_DEAD, L8, LOG_NORMAL, 1 },
{ "penable", do_penable, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "permban", do_permban, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "permban", do_permban, POS_DEAD, L3, LOG_ALWAYS, 0 },
{ "permrawcol", do_permrawcolour, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "pinfo", do_pinfo, POS_DEAD, L8, LOG_NORMAL, 1 },
{ "playerlock", do_playerlock, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "pload", do_pload, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "poofin", do_bamfin, POS_DEAD, L8, LOG_NORMAL, 1 },
{ "poofout", do_bamfout, POS_DEAD, L8, LOG_NORMAL, 1 },
{ "prefix", do_prefix, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "pracsystester", do_pracsystester, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "protect", do_protect, POS_DEAD, L1, LOG_ALWAYS, 1 },
{ "purge", do_purge, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "qdie", do_qdie, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "rawcolour", do_rawcolour, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "reboot", do_reboot, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "rebootresolver", do_rebootresolver, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "removequester", do_removequester, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "rename", do_rename, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "resolve", do_resolve, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "restore", do_restore, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "release", do_release, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "return", do_return, POS_DEAD, L6, LOG_NORMAL, 1 },
{ "return", do_return, POS_DEAD, 1, LOG_ALWAYS, 0 },
{ "rpobjload", do_rp_obj_load, POS_DEAD, 1, LOG_ALWAYS, 0 },
{ "rpsupport", do_rpsupport, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "runscript", do_runscript, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "rwhere", do_rwhere, POS_DEAD, L6, LOG_NORMAL, 1 },
{ "seevnum", do_seevnum, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "send", do_send, POS_DEAD, 1, LOG_ALWAYS, 1 },
{ "setalliance", do_setalliance, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "setrace", do_setrace, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "settendency", do_settendency, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "sgive", do_sgive, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "short", do_short, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "showaffectprofile",do_showaffectprofile,POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "showban", do_showban, POS_DEAD,COUNCIL-1, LOG_NORMAL, 0 },
{ "shutdown", do_shutdown, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "silently", do_silently, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "slay", do_slay, POS_DEAD, L3, LOG_ALWAYS, 1 },
{ "snoop", do_snoop, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "snote", do_snote, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "sockets", do_sockets, POS_DEAD, L4, LOG_NORMAL, 1 },
{ "social_import", do_social_import, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "socedit", do_socialedit, POS_DEAD, COUNCIL,LOG_ALWAYS, 0 },
{ "socialedit", do_socialedit, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "spdebug", do_spelldebug, POS_DEAD, ML, LOG_NORMAL, 1 },
{ "stat", do_stat, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "string", do_string, POS_DEAD, HE, LOG_ALWAYS, 1 },
{ "stripaff", do_strip_affects, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "stransfer", do_stransfer, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "switch", do_switch, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "switchprefix", do_switchprefix, POS_DEAD, L6, LOG_ALWAYS, 1 },
{ "oextended", do_oextended, POS_DEAD, HE, LOG_ALWAYS, 1 },
{ "olcwizi", do_olcwizi, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "owizi", do_owizi, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "tadvance", do_tadvance, POS_DEAD, L1, LOG_ALWAYS, 1 },
{ "teleport", do_transfer, POS_DEAD, L5, LOG_ALWAYS, 1 },
{ "telnetga", do_telnetga, POS_DEAD, 0, LOG_ALWAYS, 0 },
{ "telnetga", do_telnetga, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "trapset", do_trapset, POS_DEAD, 1, LOG_ALWAYS, 1 },
{ "trapshow", do_trapshow, POS_DEAD, 1, LOG_NORMAL, 1 },
{ "trapremove", do_trapremove, POS_DEAD, 1, LOG_ALWAYS, 1 },
{ "transfer", do_transfer, POS_DEAD, L7, LOG_ALWAYS, 1 },
{ "trust", do_trust, POS_DEAD, L1, LOG_ALWAYS, 1 },
{ "testhelps", do_testhelps, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "tgive", do_tgive, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "tremove", do_tremove, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "ttimer", do_ttimer, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "tjunk", do_tjunk, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "toprpers", do_toprp, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "twhere", do_twhere, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "undeny", do_undeny, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "unletgain", do_unletgain, POS_DEAD, L3, LOG_ALWAYS, 1 },
{ "unlethero", do_unlethero, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "update", do_update, POS_DEAD, L1, LOG_ALWAYS, 1 },
{ "updatemagic", do_updatemagic, POS_DEAD, L1, LOG_ALWAYS, 1 },
{ "webpass", do_webpass, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "where", do_where, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "whovis", do_whovis, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "whoinvis", do_whoinvis, POS_DEAD, IM, LOG_NORMAL, 1 },
// { "who1234", do_who1234, POS_DEAD, IM, LOG_ALWAYS, 1 },
// { "who4321", do_who4321, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "whotext", do_whotext, POS_DEAD, AML, LOG_ALWAYS, 1 },
{ "wizhelp", do_wizhelp, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wizinvis", do_wizinvis, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wizlistedit", do_wizlistedit, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "wiznet", do_wiznet, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wiznetc", do_wiznetc, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wiznet2", do_wiznet2, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wiznet2c", do_wiznet2c, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wiznet3", do_wiznet3, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wiznet3c", do_wiznet3c, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "wiznetdefault", do_wiznetdefault, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "violate", do_violate, POS_DEAD, L2, LOG_ALWAYS, 1 },
{ "visualdebug", do_visualdebug, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "vnum", do_vnum, POS_DEAD, L6, LOG_NORMAL, 1 },
{ "vnummap", do_vnummap, POS_DEAD,COUNCIL-1, LOG_ALWAYS, 1 },
{ "xpen", do_xpen, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "zecho", do_zecho, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "zoecho", do_zoecho, POS_DEAD, L4, LOG_ALWAYS, 1 },
{ "notenet", do_notenet, POS_DEAD, IM, LOG_ALWAYS, 1 },
// OLC
{ "skillgroupedit", do_skillgroupedit, POS_DEAD, ML, LOG_ALWAYS, 0 },
{ "skgroupedit", do_skillgroupedit, POS_DEAD, ML, LOG_ALWAYS, 0 },
{ "skgrpedit", do_skillgroupedit, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "gameedit", do_gameedit, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "asave", do_asave, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "aslist", do_aslist, POS_DEAD, 0, LOG_OLC, 1 },
{ "alist", do_alist, POS_DEAD, 0, LOG_OLC, 1 },
{ "aroomlist", do_aroomlist, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "autobalance", do_autobalance, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "bolist", do_bolist, POS_DEAD, 0, LOG_OLC, 1 },
{ "bollist", do_bollist, POS_DEAD, 0, LOG_OLC, 1 },
{ "bovlist", do_bovlist, POS_DEAD, 0, LOG_OLC, 1 },
{ "bmlist", do_bmlist, POS_DEAD, 0, LOG_OLC, 1 },
{ "bmllist", do_bmllist, POS_DEAD, 0, LOG_OLC, 1 },
{ "bmvlist", do_bmvlist, POS_DEAD, 0, LOG_OLC, 1 },
{ "hlist", do_hlist, POS_DEAD, 0, LOG_OLC, 1 },
{ "resets", do_resets, POS_DEAD, 0, LOG_OLC, 1 },
{ "redit", do_redit, POS_DEAD, 0, LOG_OLC, 1 },
{ "rlist", do_rlist, POS_DEAD, 0, LOG_OLC, 1 },
{ "brlist", do_brlist, POS_DEAD, 0, LOG_OLC, 1 },
{ "rpurge", do_rpurge, POS_DEAD, 0, LOG_OLC, 1 },
{ "medi", do_huh, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "medit", do_medit, POS_DEAD, 0, LOG_OLC, 1 },
{ "mlist", do_mlist, POS_DEAD, 0, LOG_OLC, 1 },
{ "mobloglist", do_mobloglist, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "mxpmodlist", do_mxpmodlist, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "mobhelp", do_mobhelp, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "ifhelp", do_ifhelp, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "aedit", do_aedit, POS_DEAD, 0, LOG_OLC, 1 },
{ "ashow", do_ashow, POS_DEAD, 0, LOG_OLC, 1 },
{ "oedit", do_oedit, POS_DEAD, 0, LOG_OLC, 1 },
{ "olist", do_olist, POS_DEAD, 0, LOG_OLC, 1 },
{ "oshow", do_oshow, POS_DEAD, 0, LOG_OLC, 1 },
{ "hedit", do_hedit, POS_DEAD, 0, LOG_OLC, 1 },
{ "hsave", do_hsave, POS_DEAD, 0, LOG_OLC, 1 },
{ "mshow", do_mshow, POS_DEAD, 0, LOG_OLC, 1 },
{ "mpshow", do_mpshow, POS_DEAD, 0, LOG_OLC, 1 },
{ "rshow", do_rshow, POS_DEAD, 0, LOG_OLC, 1 },
{ "mpedit", do_mpedit, POS_DEAD, 0, LOG_OLC, 1 },
{ "vlist", do_vlist, POS_DEAD, 0, LOG_OLC, 1 },
{ "olcgoto", do_olcgoto, POS_DEAD, 0, LOG_ALWAYS, 1 },
{ "pkill", do_pkill, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "pknote", do_pknote, POS_DEAD, 0, LOG_NORMAL, 1 },
{ "pbackstab", do_pbackstab, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "pbs", do_pbackstab, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "pip", do_huh, POS_DEAD, ADMIN, LOG_ALWAYS, 0 },
{ "pipe", do_pipe, POS_DEAD, ADMIN, LOG_ALWAYS, 0 },
{ "syste", do_huh, POS_DEAD, ADMIN, LOG_ALWAYS, 0 },
{ "system", do_system, POS_DEAD, ADMIN, LOG_ALWAYS, 0 },
{ "crashloo", do_huh, POS_DEAD, ML, LOG_ALWAYS, 0 },
{ "crashloop", do_crashloop, POS_DEAD, ML, LOG_ALWAYS, 0 },
{ "mpreset", do_mpreset, POS_DEAD, 1, LOG_ALWAYS, 1 },
{ "mpinfo", do_mpinfo, POS_DEAD, 1, LOG_ALWAYS, 1 },
{ "mptrace", do_mptrace, POS_DEAD, 1, LOG_ALWAYS, 1 },
{ "showplayerlist", do_showplayerlist, POS_DEAD, ML, LOG_ALWAYS, 0 },
{ "reducelaston", do_reducelaston, POS_DEAD, COUNCIL-1,LOG_ALWAYS, 1 },
{ "remort", do_remort, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "resetroo", do_huh, POS_DEAD, COUNCIL-2,LOG_NORMAL, 0 },
{ "resetroom", do_resetroom, POS_DEAD, COUNCIL-2,LOG_ALWAYS, 1 },
{ "resetare", do_huh, POS_DEAD, COUNCIL-1,LOG_NORMAL, 0 },
{ "resetarea", do_resetarea, POS_DEAD, COUNCIL-1,LOG_ALWAYS, 1 },
{ "rinfo", do_rinfo, POS_DEAD, COUNCIL,LOG_NORMAL, 1 },
{ "showplayerlist", do_showplayerlist, POS_DEAD, ML, LOG_ALWAYS, 0 },
{ "commandsnoop", do_commandsnoop, POS_DEAD, COUNCIL,LOG_ALWAYS, 0 },
{ "comedit", do_comedit, POS_DEAD, ML-1, LOG_ALWAYS, 1 },
{ "csnoop", do_commandsnoop, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "dedit", do_dedit, POS_DEAD, COUNCIL,LOG_ALWAYS, 1 },
{ "owritepassw", do_huh, POS_DEAD, ML-1, LOG_ALWAYS, 0 },
{ "overwritepassw", do_huh, POS_DEAD, ML-1, LOG_ALWAYS, 0 },
{ "overwritepassword",do_overwritepasswd,POS_DEAD, ML-1, LOG_ALWAYS, 0 },
{ "owritepassword", do_overwritepasswd, POS_DEAD, ML-1, LOG_ALWAYS, 0 },
{ "owritepasswd", do_overwritepasswd, POS_DEAD, ML-1, LOG_ALWAYS, 1 },
{ "objrestrict", do_objrestrict, POS_DEAD, LEVEL_HERO,LOG_ALWAYS, 1 },
{ "savedeitydb", do_savedeities, POS_DEAD, ML-1, LOG_ALWAYS, 1 },
{ "saveherbs", do_saveherbs, POS_DEAD, COUNCIL-2,LOG_ALWAYS, 1 },
{ "savemixdb", do_savemixdb, POS_DEAD, COUNCIL-2,LOG_ALWAYS, 1 },
{ "relookup", do_relookup, POS_DEAD, ADMIN, LOG_ALWAYS, 1 },
{ "raceedit", do_raceedit, POS_DEAD,RACEEDIT_MINTRUST, LOG_OLC,1 },
{ "npcinfo", do_npcinfo, POS_DEAD, IM, LOG_OLC, 1 },
{ "racelist", do_racelist, POS_DEAD, COUNCIL,LOG_OLC, 1 },
{ "classedit", do_classedit, POS_DEAD, COUNCIL,LOG_OLC, 1 },
{ "write_skills", do_write_skills, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "write_languages",do_write_languages ,POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "cedit", do_classedit, POS_DEAD, ML, LOG_OLC, 1 },
{ "clanedit", do_clanedit, POS_DEAD, ML, LOG_OLC, 1 },
// { "write_dynamic_inc", do_write_dynamic_include, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "write_classes", do_write_classes, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "read_classes", do_read_classes, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "write_skillgroups",do_write_skillgroups, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "read_nameprofiles",do_read_nameprofiles,POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "write_nameprofiles",do_write_nameprofiles,POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "saveclans", do_saveclans, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "loadclans", do_loadclans, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "write_comtable", do_write_commandtable,POS_DEAD,ML-1, LOG_ALWAYS, 1 },
{ "saveraces", do_saveraces, POS_DEAD, RACEEDIT_MINTRUST, LOG_ALWAYS, 1 },
{ "savequestdb", do_savequestdb, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "savegameset", do_save_gamesettings, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "loadgameset", do_load_gamesettings, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "saveautostat", do_save_autostat_files, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "loadautostat", do_load_autostat_files, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "savecorpses", do_save_corpses, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "loadcorpses", do_load_corpses, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "material_list", do_material_list, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "sedit", do_sedit, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "sshow", do_sshow, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "spsklist", do_spellskilllist, POS_DEAD, IM, LOG_ALWAYS, 1 },
{ "qedit", do_qedit, POS_DEAD, IM+2, LOG_ALWAYS, 1 },
{ ":", do_immtalk, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "immtalk", do_immtalk, POS_DEAD, 0, LOG_NORMAL, 0 },
{ "saycolour", do_saycolour, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "saycolor", do_saycolour, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "motecolour", do_motecolour, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "motecolor", do_motecolour, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "textsearch", do_textsearch, POS_DEAD, IM, LOG_ALWAYS, 0 },
{ "debugroom", do_debugroom, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "debugmob", do_debugmob , POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "debugobject", do_debugobject, POS_DEAD, ML, LOG_ALWAYS, 1 },
{ "makecorefile", do_makecorefile, POS_DEAD, DIS, LOG_ALWAYS, 1 },
// { "manual_colour_convert", do_manual_colour_convert, POS_DEAD, DIS, LOG_ALWAYS, 1 },
{ "detect_oldstyle_note_writing", do_detect_oldstyle_note_writing, POS_DEAD,0,LOG_ALWAYS,0 },
/*
* End of list.
*/
{ "", 0, POS_DEAD, 0, LOG_NORMAL, 0 }
};
// memory tracking system
extern int nAllocString;
extern int nAllocPerm;
extern bool interpret_not_used;
/**************************************************************************/
/*
* The main entry point for executing commands.
* Can be recursively called from 'at', 'order', 'force'.
*/
void interpret( char_data *ch, char *argument )
{
char command[MIL];
char logline[MSL];
char argall[MIL];
int cmd;
int trust;
bool found;
interpret_not_used=false;
// memory checking
int string_count = nAllocString;
int perm_count = nAllocPerm;
char cmd_copy[MIL];
char buf[MSL];
// Implement freeze command.
if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_FREEZE) )
{
ch->println("You're totally frozen!");
return;
}
// SMASH THAT PESKY !!SOUND
// Admins are exempt cause we're better :) hehehe
if ( !IS_NULLSTR( argument ) && str_len(argument) > 7 )
{
if ( !IS_ADMIN( ch ))
{
if ( !str_infix( "!!SOUND", argument )
|| !str_infix( "!!MUSIC", argument ))
{
ch->println("Invalid input, don't try and defraud the MSP trigger.");
return;
}
}
}
strcpy(argall, argument);
// Strip leading spaces.
while ( is_space(*argument) ){
argument++;
}
// if no command remains, do nothing
if ( IS_NULLSTR(argument) ){
return;
}
// wiznet memory debuging
strcpy(cmd_copy, argument);
/*
* Grab the command word.
* Special parsing so ' can be a command,
* also no spaces needed after punctuation.
*/
strcpy( logline, argument );
if ( !is_alpha(argument[0]) && (!is_digit(argument[0]) || (argument[0]=='0') )) {
command[0] = argument[0];
command[1] = '\0';
argument++;
while ( is_space(*argument) ){
argument++;
}
}else if((argument[0]=='m' || argument[0]=='M') && (argument[1]=='q' || argument[1]=='Q')){
command[0] = 'm'; // support mq12 syntax
command[1] = 'q';
command[2] = '\0';
argument+=2;
while ( is_space(*argument) ){
argument++;
}
}else{
argument = one_argument( argument, command );
}
{ // MOB TRIGGER COMMAND
char_data *rch=ch->in_room->people;
int number_in_room=ch->in_room->number_in_room;
// note: number_in_room is used to prevent a mobprog on two mobs in
// a room creating an endless loop by removing themself from
// the room and putting themselves back in the room - Kal, June 01
for ( ;rch && --number_in_room>=0; rch= rch->next_in_room )
{
if ( IS_NPC(rch) && HAS_TRIGGER( rch, TRIG_COMMAND ))
{
if (mp_cmd_trigger( argall, rch, ch, NULL, NULL, TRIG_COMMAND )){
return;
}
}
}
}
// Look for command in command table.
found = false;
trust = get_trust( ch );
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if ( command[0] == cmd_table[cmd].name[0]
&& !str_prefix( command, cmd_table[cmd].name ))
{
if(cmd_table[cmd].level <= trust
|| (trust==ML && AML==ML && cmd_table[cmd].level-1 <= trust))
{
// complete the command name
sprintf(&logline[str_len(logline)], " (%s)", cmd_table[cmd].name);
found = true;
break;
}
}
}
// dyn stuff placed here
if ( !IS_IMMORTAL( ch ))
{
if ( IS_SET( cmd_table[cmd].flags, CMD_OOC )
&& !IS_OOC(ch)) {
ch->println("You can only use this command while in an OOC room.");
return;
}
if ( IS_SET( cmd_table[cmd].flags, CMD_IC )
&& IS_OOC(ch)) {
ch->println("You can only use this command while you are IC.");
return;
}
if ( IS_SET( cmd_table[cmd].flags, CMD_NO_TREEFORM )
&& IS_AFFECTED2( ch, AFF2_TREEFORM)) {
ch->println("You can't do this while in the form of a tree.");
return;
}
if ( IS_SET( cmd_table[cmd].flags, CMD_NO_STONE_GARGOYLE)
&& IS_AFFECTED2( ch, AFF2_STONE_GARGOYLE))
{
ch->println( "Not while you are a statue." );
return;
}
if ( IS_SET( cmd_table[cmd].flags, CMD_NO_STOCKADE )
&& IS_AFFECTED2( ch, AFF2_STOCKADE))
{
ch->printlnf( "The stocks prevent you from doing that." );
return;
}
}
if ( !IS_ADMIN( ch ))
{
if ( IS_SET( cmd_table[cmd].flags, CMD_NO_ORDER )
&& IS_SET( ch->dyn, DYN_IS_BEING_ORDERED ))
{
ch->println("You can't be ordered to do that.");
ch->master->println("Not going to happen.");
return;
}
}
// check it isn't for a restricted council
if (cmd_table[cmd].level>=LEVEL_IMMORTAL){
// If we have any council restriction limit it
if(cmd_table[cmd].council && !IS_ADMIN(ch)){
if( TRUE_CH(ch)->pcdata
&& IS_SET( TRUE_CH(ch)->pcdata->council, cmd_table[cmd].council))
{
// council restricted command, in council
}else{
ch->println("This command can only be used by a select group of councils.");
return;
}
}
}
// Log and snoop.
// - removed (so snoop gets directions)
if( cmd_table[cmd].log == LOG_NEVER && !(IS_NPC(ch) && IS_SET(ch->act,ACT_MOBLOG)) ){
strcpy( logline, "NOT SNOOPABLE" );
}
if (cmd_table[cmd].log < LOG_DONT_LOG) // log might be required
{
if (cmd_table[cmd].log == LOG_OLC)
{
char buffilename[MSL];
if (!IS_UNSWITCHED_MOB(ch))
{
sprintf(buffilename, OLC_LOGS_DIR"%.8s.olc", lowercase(ch->name));
append_logentry_to_file( ch, buffilename, logline);
}
append_logentry_to_file( ch, OLC_LOGFILE, logline);
}
if ( (!IS_NPC(ch) && IS_SET(ch->act, PLR_LOG))
|| fLogAll
|| cmd_table[cmd].log == LOG_ALWAYS
|| (!IS_NPC(ch) && cmd_table[cmd].log == LOG_PALWAYS) )
{
if (TRUE_CH(ch)!=ch){
sprintf( log_buf, "Log %s (%s)[%d]: %s", ch->name,
TRUE_CH(ch)->name, ch->in_room_vnum(), logline );
}else{
sprintf( log_buf, "Log %s<%d,%d>[%d]: %s",
ch->name, ch->vnum(), ch->level, ch->in_room_vnum(), logline );
}
if ((cmd_table[cmd].log != LOG_NEVER) &&
(fLogAll || (cmd_table[cmd].log == LOG_ALWAYS))
|| (!IS_NPC(ch) && cmd_table[cmd].log == LOG_PALWAYS))
{
log_string( log_buf );
}
if (!IS_SET(cmd_table[cmd].flags, CMD_NO_WIZNET_SECURE)
&& ( (cmd_table[cmd].log != LOG_NEVER)
&& ((cmd_table[cmd].log == LOG_ALWAYS))
|| (!IS_NPC(ch) && cmd_table[cmd].log == LOG_PALWAYS)
)
)
{
wiznet(log_buf,ch,NULL,WIZ_SECURE,0,get_trust(ch));
}
if (!IS_NPC(ch) && IS_SET(ch->act, PLR_LOG))
{
sprintf( log_buf, "PlayerLog %s: %s", ch->name, logline );
wiznet(log_buf,ch,NULL,WIZ_PLAYER_LOG,0,get_trust(ch));
append_playerlog( ch, logline);
}
}
}
if ( !found ){
bool procured = false;
// look for command in the socials table.
if ( check_social( ch, command, argument, false ) ){
procured=true;
}
// look for the command as a language
if(language_dynamic_command(ch, command, argument)){
procured=true;
}
if ( !procured ) {
do_huh(ch, command);
if (ch->level<2){
append_datetime_ch_to_file( ch, NEWBIE_HUH_FILE, argall);
}
}
return;
}
else if (check_disabled (ch, &cmd_table[cmd])) {
// a normal valid command.. check if it is globally disabled
ch->printlnf("The '%s' command has been temporarily disabled.", cmd_table[cmd].name);
return;
}
// Character not in position for command?
if ( ch->position < cmd_table[cmd].position )
{
switch( ch->position )
{
case POS_DEAD:
ch->println("Lie still; you are DEAD.");
break;
case POS_MORTAL:
case POS_INCAP:
ch->println("You are hurt far too bad for that.");
break;
case POS_STUNNED:
ch->println("You are too stunned to do that.");
break;
case POS_SLEEPING:
if(IS_NPC(ch)){
ch->printlnf( "In your dreams, or what? (you can't '%s' while sleeping)",
command);
}else{
ch->println("In your dreams, or what?");
}
if (IS_NEWBIE(ch))
ch->println("(try waking up first - type wake)");
break;
case POS_RESTING:
ch->println("Nah... You feel too relaxed...");
if (IS_NEWBIE(ch))
ch->println("(try standing up first - type stand)");
break;
case POS_SITTING:
ch->println("Better stand up first.");
break;
case POS_KNEELING:
ch->println("Better get off your knees and stand up first.");
if (IS_NEWBIE(ch))
ch->println("(try standing up first - type stand)");
break;
case POS_FIGHTING:
ch->println("No way! You are still fighting!");
break;
}
return;
}
// Record the command
sprintf (last_command, "[%5d] %s in [%5d] %s: %s",
IS_NPC(ch) ? ch->pIndexData->vnum : 0,
IS_NPC(ch) ? ch->short_descr : ch->name,
ch->in_room ? ch->in_room->vnum : 0,
ch->in_room ? ch->in_room->name : "(not in a room)",
logline);
// Record the moblog command
if( IS_NPC(ch) && IS_SET(ch->act,ACT_MOBLOG) ){
append_timestring_to_file( MOBLOG_LOGFILE,
FORMATF("[%5d] '%s' in room %d begin command '%s'",
(ch->pIndexData?ch->pIndexData->vnum:0),
ch->name,
(ch->in_room? ch->in_room->vnum:0),
logline));
}
// Dispatch the command.
(*cmd_table[cmd].do_fun) ( ch, argument );
// wiznet memcheck
if (string_count < nAllocString)
{
sprintf(buf,
"Memcheck : Increase in strings :: %s : %s", ch->name, cmd_copy) ;
wiznet(buf, NULL, NULL, WIZ_MEMCHECK,0,
get_trust(ch)==MAX_LEVEL?MAX_LEVEL:0);
}
if (perm_count < nAllocPerm)
{
sprintf(buf,
"Increase in perms :: %s : %s", ch->name, cmd_copy) ;
wiznet(buf, NULL, NULL, WIZ_MEMCHECK, 0,
get_trust(ch)==MAX_LEVEL?MAX_LEVEL:0);
}
// Record that the command was the last done, but it is finished
sprintf (last_command, "(Finished) [%5d] %s in [%5d] %s: %s",
IS_NPC(ch) ? ch->pIndexData->vnum : 0,
IS_NPC(ch) ? ch->short_descr : ch->name,
ch->in_room ? ch->in_room->vnum : 0,
ch->in_room ? ch->in_room->name : "(not in a room)",
logline);
tail_chain( );
return;
}
/**************************************************************************/
// allow beckon to work with just bec - instead of becomeactive
void do_bec(char_data *ch, char *argument)
{
if(!check_social( ch, "bec", argument, false)){
ch->println("To use becomeactive, type more than the first 3 characters of the command.");
};
}
/**************************************************************************/
// Return true if an argument is completely numeric.
bool is_number( const char *arg )
{
if ( *arg == '\0' )
return false;
if ( *arg == '+' || *arg == '-' )
arg++;
for ( ; *arg != '\0'; arg++ )
{
if ( !is_digit( *arg ) )
return false;
}
return true;
}
/**************************************************************************/
// Given a string like 14.foo, return 14 and 'foo'
int number_argument( char *argument, char *arg )
{
char *pdot;
int number;
for ( pdot = argument; *pdot != '\0'; pdot++ )
{
if ( *pdot == '.' )
{
*pdot = '\0';
if(!is_number(ltrim_string(argument))){
*pdot = '.';
strcpy( arg, argument );
return 1;
}
number = atoi( argument );
*pdot = '.';
strcpy( arg, pdot+1 );
return number;
}
}
strcpy( arg, argument );
return 1;
}
/**************************************************************************/
// Given a string like 14*foo, return 14 and 'foo'
int mult_argument(char *argument, char *arg)
{
char *pdot;
int number;
for ( pdot = argument; *pdot != '\0'; pdot++ )
{
if ( *pdot == '*' )
{
*pdot = '\0';
number = atoi( argument );
*pdot = '*';
strcpy( arg, pdot+1 );
return number;
}
}
strcpy( arg, argument );
return 1;
}
/**************************************************************************/
// Pick off one argument from a string and return the rest - Understands quotes.
char *one_argument( const char *argument, char *arg_first )
{
char cEnd;
while ( is_space(*argument) )
argument++;
cEnd = ' ';
if ( *argument == '\'' || *argument == '"' ){
cEnd = *argument++;
}
while ( *argument != '\0' )
{
if( (is_space(cEnd) && is_space(*argument)) || *argument== cEnd ){
argument++;
break;
}
*arg_first = LOWER(*argument);
arg_first++;
argument++;
}
*arg_first = '\0';
while ( is_space(*argument) ){
argument++;
}
return (char *)argument;
}
/**************************************************************************/
void do_wizhelp( char_data *ch, char *argument )
{
int cmd;
int col = 0;
int level = 0;
bool fShowAll=true;
argument=rtrim_string(argument);
if(!IS_NULLSTR(argument))
{
if ( is_number( argument )){
level = atoi( argument );
}else{
fShowAll=false;
}
}
if ( level < LEVEL_IMMORTAL ){
level = 0;
}
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
int clevel=cmd_table[cmd].level;
if(AML==ML && cmd_table[cmd].level==ML+1){
clevel=ML;
}
if(!fShowAll){
if(str_infix(argument,cmd_table[cmd].name))
continue;
}
if ( cmd_table[cmd].level >= LEVEL_HERO
&& clevel <= get_trust( ch )
&& cmd_table[cmd].show)
{
if ( !level ){
ch->printf("%-18s[%3d] ", cmd_table[cmd].name, clevel );
if ( ++col % 3 == 0 ){
ch->println("");
}
}else{
if ( cmd_table[cmd].level <= get_trust( ch )
&& clevel == level
&& cmd_table[cmd].show )
{
ch->printf( "%-18s[%3d] ",cmd_table[cmd].name, cmd_table[cmd].level );
if ( ++col % 3 == 0 ){
ch->println("");
}
}
}
}
}
if ( col % 6 != 0 ){
ch->println("");
}
ch->println("Type '`=Cwiz <level>`x' to filter by level, '`=Cwiz <partofword>`x' to filter on words.");
return;
}
/**************************************************************************/
void do_wizgrantlist( char_data *ch, char *argument )
{
int cmd;
int level = 0;
bool fShowAll=true;
argument=rtrim_string(argument);
if(!IS_NULLSTR(argument))
{
if ( is_number( argument )){
level = atoi( argument );
}else{
fShowAll=false;
}
}
if ( level < LEVEL_IMMORTAL )
level = 0;
for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
{
if(!fShowAll){
if(str_infix(argument,cmd_table[cmd].name))
continue;
}
if ( cmd_table[cmd].level >= LEVEL_HERO
&& cmd_table[cmd].level <= get_trust( ch )
&& cmd_table[cmd].show)
{
if ( !level )
{
ch->printlnf("%s[%3d] %s",
mxp_create_send(ch,FORMATF("comedit %s", cmd_table[cmd].name), FORMATF("%-25s", cmd_table[cmd].name)),
cmd_table[cmd].level,
flag_string(grantgroup_flags, cmd_table[cmd].grantgroups));
}
else
if ( cmd_table[cmd].level <= get_trust( ch )
&& cmd_table[cmd].level == level
&& cmd_table[cmd].show )
{
ch->printlnf("%s[%3d] %s",
mxp_create_send(ch,FORMATF("comedit %s", cmd_table[cmd].name), FORMATF("%-25s", cmd_table[cmd].name)),
cmd_table[cmd].level,
flag_string(grantgroup_flags, cmd_table[cmd].grantgroups));
}
}
}
ch->println("Type '`=Cwizgrant <level>`x' to filter by level, '`=Cwizgrant <partofword>`x' to filter on words.");
ch->println("PLEASE NOTE: The grant system is incomplete.");
return;
}
/**************************************************************************/
/* Syntax is:
disable - shows disabled commands
disable <command> - toggles disable status of command
*/
void do_disable (char_data *ch, char *argument)
{
int i;
DISABLED_DATA *p,*q;
if (IS_NPC(ch))
{
ch->println("RETURN first.");
return;
}
if (IS_NULLSTR(argument)) // Nothing specified. Show disabled commands.
{
if (!disabled_first) // Any disabled at all ?
{
ch->println("There are no commands disabled.");
return;
}
ch->println("Disabled commands:");
ch->println("Command Level Disabled by For");
for (p = disabled_first; p; p = p->next)
{
ch->printlnf("%-12s %5d %-12s %-12s",
p->command->name, p->level, p->disabled_by, p->disabled_for);
}
return;
}
// command given
// First check if it is one of the 'All' disabled commands
for (p = disabled_first; p ; p = p->next)
if (!str_cmp(argument, p->command->name)&&
!str_cmp("All", p->disabled_for))
break;
if (p) // this command is disabled
{
// Optional: The level of the imm to enable the command must
// equal or exceed level of the one that disabled it
if (get_trust(ch) < p->level){
ch->println("This command was disabled by a higher power.");
return;
}
// Remove
if (disabled_first == p){ // node to be removed == head ?
disabled_first = p->next;
}else{ // Find the node before this one
for (q = disabled_first; q->next != p; q = q->next){
// empty for loop in order to find the end of the list
}
q->next = p->next;
}
free_string (p->disabled_by); // free name of disabler
free_string (p->disabled_for); // free name who for
free_mem (p,sizeof(DISABLED_DATA)); // free node
save_disabled(); // save to disk
ch->printlnf("Command '%s' `Benabled`x for All.",argument);
}
else // not a disabled command, check if that command exists
{
// IQ test
if (!str_cmp(argument,"disable"))
{
ch->println("You cannot disable the disable command.");
return;
}
// Search for the command
for (i = 0; cmd_table[i].name[0] != '\0'; i++)
if (!str_cmp(cmd_table[i].name, argument))
break;
// Found?
if (cmd_table[i].name[0] == '\0')
{
ch->println("No such command.");
return;
}
// Can the imm use this command at all ?
if (cmd_table[i].level > get_trust(ch))
{
ch->println("You dont have access to that command; you cannot disable it.");
return;
}
// Disable the command
p = (DISABLED_DATA *)alloc_mem (sizeof(DISABLED_DATA));
p->command = &cmd_table[i];
p->disabled_by = str_dup (ch->name); // save name of disabler
p->level = get_trust(ch); // save trust
p->disabled_for = str_dup ("All"); // disable for everyone
p->next = disabled_first;
disabled_first = p; // add before the current first element
ch->printlnf("Command '%s' `RDISABLED`x for All.",argument);
save_disabled(); // save to disk
}
}
/**************************************************************************/
/* Syntax is:
pdisable - shows personally disabled commands
pdisable <command> <name|All> - toggles disable status of command
*/
bool check_parse_name args( ( char *name ) );
void do_pdisable (char_data *ch, char *argument)
{
char argname[MIL];
char argcommand[MIL];
int i;
DISABLED_DATA *p;
char buf[100];
if (IS_NPC(ch))
{
ch->println("RETURN first.");
return;
}
if (!argument[0]) // Nothing specified. Show disabled commands.
{
ch->println("Syntax: pdisable command name.");
if (!disabled_first){ // Any disabled at all ?
ch->println("There are no commands disabled.");
return;
}
ch->println("Pdisabled commands:");
ch->println("Command Level Disabled by For");
for (p = disabled_first; p; p = p->next)
{
ch->printlnf("%-12s %5d %-12s %-12s",
p->command->name, p->level, p->disabled_by, p->disabled_for);
}
ch->println("syntax: pdisable <command> <name|All>");
return;
}
// split command into name and command
argument = one_argument( argument, argcommand );
one_argument( argument, buf );
strcpy(argname,capitalize(buf));
if(IS_NULLSTR(argname)){
ch->printlnf("You must specify a name for who the command '%s' is personally disabled.",
argcommand);
return;
}
if (!check_parse_name(argname))
{
ch->printf("The name you specified '%s' may not be a legal name!\n", argname);
}
// command given
// First check if it is one of the disabled commands for a person
for(p = disabled_first; p ; p = p->next){
if (!str_cmp(argcommand, p->command->name) &&
!str_cmp(argname, p->disabled_for))
break;
}
if(p){ // this command is already disabled
ch->println("Use penable to enable the command.");
return;
}else{ // not a disabled command, check if that command exists
// IQ tests
if (!str_cmp(argcommand,"disable"))
{
ch->println("You cannot disable the disable command.");
return;
}
if (!str_cmp(argcommand,"pdisable"))
{
ch->println("You cannot disable the pdisable command.");
return;
}
if (!str_cmp(argcommand,"penable"))
{
ch->println("You cannot disable the penable command.");
return;
}
// Search for the command
for (i = 0; cmd_table[i].name[0] != '\0'; i++){
if (!str_cmp(cmd_table[i].name, argcommand)){
break;
}
}
// Found?
if (cmd_table[i].name[0] == '\0'){
ch->printlnf("No such command '%s'.", argcommand);
return;
}
// Can the imm use this command at all ?
if (cmd_table[i].level > get_trust(ch))
{
ch->println("You dont have access to that command; you cannot disable it.");
return;
}
// Disable the command
p = (DISABLED_DATA *)alloc_mem (sizeof(DISABLED_DATA));
p->command = &cmd_table[i];
p->disabled_by = str_dup(ch->name); // save name of disabler
p->level = ADMIN; // disable the command at admin level
p->disabled_for = str_dup(argname); // disable for person
p->next = disabled_first;
disabled_first = p; // add before the current first element
ch->printlnf("Command '%s' disabled for '%s'.", argcommand, argname);
save_disabled(); // save to disk
}
}
/**************************************************************************/
/* Syntax is:
penable - shows personally disabled commands
penable <command> <name|All> - toggles disable status of command
*/
void do_penable (char_data *ch, char *argument)
{
char argname[MIL];
char argcommand[MIL];
DISABLED_DATA *p,*q;
char buf[100];
if (IS_NPC(ch))
{
ch->println("RETURN first.");
return;
}
if (!argument[0]) /* Nothing specified. Show disabled commands. */
{
ch->println("Syntax: penable command name.");
if (!disabled_first) /* Any disabled at all ? */
{
ch->println("There are no commands disabled.");
return;
}
ch->println("Pdisabled commands:");
ch->println("Command Level Disabled by For");
for (p = disabled_first; p; p = p->next)
{
ch->printlnf("%-12s %5d %-12s %-12s",
p->command->name, p->level, p->disabled_by, p->disabled_for);
}
return;
}
/* split command into name and command */
argument = one_argument( argument, argcommand );
one_argument( argument, buf );
strcpy(argname, capitalize(buf));
/* command given */
/* First check if it is one of the disabled commands for a person*/
for (p = disabled_first; p ; p = p->next)
if (!str_cmp(argcommand, p->command->name) &&
!str_cmp(argname, p->disabled_for))
break;
if (p) /* this command is disabled */
{
/* Optional: The level of the imm to enable the command must equal or exceed level
of the one that disabled it */
if (get_trust(ch) < p->level)
{
ch->println("This command was disabled by a higher power.");
return;
}
/* Remove */
if (disabled_first == p) /* node to be removed == head ? */
disabled_first = p->next;
else /* Find the node before this one */
{
for (q = disabled_first; q->next != p; q = q->next); /* empty for */
q->next = p->next;
}
free_string (p->disabled_by); /* free name of disabler */
free_string (p->disabled_for); /* free name who for */
free_mem (p,sizeof(DISABLED_DATA)); /* free node */
save_disabled(); /* save to disk */
ch->println("Command enabled.");
}
else /* not a disabled command, check if that command exists */
{
ch->println("Use pdisable to disable that command.");
return;
}
}
/**************************************************************************/
/* Check if that command is disabled
Note that we check for equivalence of the do_fun pointers; this means
that disabling 'chat' will also disable the '.' command
*/
bool check_disabled (char_data *ch, const struct cmd_type *command)
{
DISABLED_DATA *p;
for (p = disabled_first; p ; p = p->next)
if ((p->command->do_fun == command->do_fun) &&
(!strcmp(ch->name, p->disabled_for) ||
!strcmp("All", p->disabled_for) ))
return true;
return false;
}
/**************************************************************************/
/* Load disabled commands */
void load_disabled()
{
FILE *fp;
DISABLED_DATA *p;
char *name;
int i;
disabled_first = NULL;
logf("Loading disabled commands from %s...", DISABLED_FILE);
fp = fopen (DISABLED_FILE, "r");
if (!fp) // No disabled file.. no disabled commands:
return;
name = fread_word (fp);
while (str_cmp(name, END_MARKER)) // as long as name is NOT END_MARKER :)
{
// Find the command in the table
for (i = 0; cmd_table[i].name[0] ; i++)
if (!str_cmp(cmd_table[i].name, name))
break;
if (!cmd_table[i].name[0]) // command does not exist?
{
bugf(" Skipping unknown command (%s) in '%s' file.", name, DISABLED_FILE);
fread_number(fp); // level
fread_word(fp); // disabled_by
fread_word(fp); // disabled_for
}
else // add new disabled command
{
p = (DISABLED_DATA *)alloc_mem(sizeof(DISABLED_DATA));
p->command = &cmd_table[i];
p->level = fread_number(fp);
p->disabled_by = str_dup(fread_word(fp));
p->disabled_for = str_dup(fread_word(fp));
p->next = disabled_first;
disabled_first = p;
}
name = fread_word(fp);
}
fclose (fp);
}
/**************************************************************************/
// Save disabled commands
void save_disabled()
{
FILE *fp;
DISABLED_DATA *p;
if (!disabled_first) /* delete file if no commands are disabled */
{
unlink (DISABLED_FILE);
return;
}
fp = fopen (DISABLED_FILE, "w");
if (!fp)
{
bugf("Could not open '%s' for writing", DISABLED_FILE);
return;
}
for (p = disabled_first; p ; p = p->next)
fprintf (fp, "%s %d %s %s\n",
p->command->name,
p->level,
p->disabled_by,
p->disabled_for);
fprintf (fp, "%s\n",END_MARKER);
fclose (fp);
}
/**************************************************************************/
// By Kerenos and Kalahn
void do_commands( char_data *ch, char *argument )
{
int i, j, col=0;
int maxcat, mincat;
int cat_index=-1;
char buf[MIL];
bool fShowAll=true;
bool infix_searching=false;
bool empty_section=false;
argument=rtrim_string(argument);
// find out if we are filtering by a category only, infix searching, or showing all
if( !IS_NULLSTR(argument))
{
if (( cat_index= com_category_lookup( argument )) != -1 ){
fShowAll=false;
}else{
infix_searching=true;
}
}
// find the maximum category
maxcat=0;
mincat=200;
for ( i = 0; !IS_NULLSTR(cmd_table[i].name); i++ )
{
maxcat=UMAX(maxcat, cmd_table[i].category);
mincat=UMIN(mincat, cmd_table[i].category);
}
// output
BUFFER *output= new_buf();
BUFFER *section_buffer= new_buf();
add_buf(output,"`?`#"); // get the random colour for title bars
if ( fShowAll )
{
sprintf( buf,"`^%s`x", makef_titlebar("CATEGORIES"));
add_buf(output,buf);
}
int last_col=1;
for (j=mincat;j<=maxcat;j++)
{
if ( fShowAll ){
add_buf( section_buffer,"\r\n");
}
col=0;
if (!IS_RP_SUPPORT(ch) && j == COMCAT_RPSUPPORT)
continue;
if (!IS_NEWBIE_SUPPORT(ch) && j == COMCAT_NSUPPORT)
continue;
if (!IS_NOBLE(ch) && j == COMCAT_NOBLE)
continue;
if (!HAS_SECURITY(ch,1) && j == COMCAT_OLC)
continue;
if ( fShowAll ){
sprintf( buf,"`^%s`x", makef_titlebar(com_category_indexlookup(j)));
add_buf(section_buffer,buf);
empty_section=infix_searching;
}else{ // we are doing a category only filter
if ( j!=cat_index){
continue;
}
sprintf( buf,"`^%s`x", makef_titlebar(com_category_indexlookup(j)));
add_buf(section_buffer,buf);
empty_section=false;
}
for(i=0; !IS_NULLSTR(cmd_table[i].name); i++)
{
if (cmd_table[i].category!=j)
{
continue;
}
if(!fShowAll)
{
if( cmd_table[i].category != cat_index)
continue;
}
if(infix_searching){
if(str_infix(argument,cmd_table[i].name)){
continue;
}
}
if ( cmd_table[i].level < LEVEL_HERO
&& cmd_table[i].level <= get_trust( ch )
&& cmd_table[i].show )
{
strcpy(buf, str_width(cmd_table[i].name, 15));
add_buf( section_buffer, buf);
empty_section=false;
if (++col%5==0){
add_buf( section_buffer,"\r\n");
}
}
}
if(!empty_section && !(j==CAT_UNDEFINED && col==0) ){
// only show sections with content when infix searching
// also: if listing the whole lot and there is nothing in the
// undefined category, don't show the header for it.
add_buf( output,buf_string(section_buffer));
last_col=col;
}
// reset the buffer
free_buf(section_buffer);
section_buffer= new_buf();
}
// add the blank bar at the bottom
if (last_col%6!=0){
add_buf( output,"\r\n");
}
sprintf( buf,"`^%s`x", makef_titlebar("-"));
add_buf( output,buf);
// show them the list
ch->sendpage(buf_string(output));
free_buf(output);
free_buf(section_buffer);
}
/**************************************************************************/
// returns -1 if the category can't be found
int com_category_lookup(char *name)
{
int flag;
// first attempt exact match
for ( flag = 0; com_category_types[flag].name!= NULL; flag++)
{
if (LOWER(name[0]) == LOWER(com_category_types[flag].name[0])
&& !str_cmp( name, com_category_types[flag].name))
return com_category_types[flag].bit;
}
// now attempt a prefix match
for ( flag = 0; com_category_types[flag].name!= NULL; flag++)
{
if (LOWER(name[0]) == LOWER(com_category_types[flag].name[0])
&& !str_prefix( name, com_category_types[flag].name))
return com_category_types[flag].bit;
}
// bugf("com_category_lookup(): Invalid category name '%s'!", name);
return -1;
};
/**************************************************************************/
char *com_category_indexlookup(int index)
{
int flag;
if(com_category_types[index].bit==index)
{
return (com_category_types[index].name);
}
for (flag = 0; com_category_types[flag].name; flag++)
{
if(com_category_types[flag].bit==index)
{
return (com_category_types[flag].name);
}
}
// bugf("com_category_indexlookup(): Invalid index %d!", index);
return ("");
};
/**************************************************************************/