// File : /cmds/xtra/_dest.c // Creator : Huthar/Wayfarer@Portals // Updated : Watcher@TMI (02/19/93) to search with get_object() // and an optional object wipe before destruction // : Bonzo (270593) to use query_mdest() // : Robocoder@TMI-2 (94.08.14) to provide global destruction // : Leto (95-28-02) prevented dest -a env(user) // // This is the wizard destruct command. #include <mudlib.h> inherit DAEMON; #define SYNTAX "Syntax: dest [-ag] [object|pattern]\n" #define GUEST_NO_DEST 1 static int cnt; int strncmp(string str, string sub, int i) { int j; j = strlen(str); if (i > j) return strcmp(str, sub); else return strcmp(str[0..i-1], sub); } int dest_all(object act_ob, int silent) { int s; object *ob; ob = deep_inventory(act_ob); s = sizeof(ob); cnt += s; while (s--) { if (!ob[s]) continue; if (!silent) write("Desting: " + identify(ob[s]) + "\n"); if (!(ob[s]->is_player() && interactive(ob[s]))) { if (adminp(geteuid(previous_object()))) { catch(ob[s]->remove()); if(ob[s]) destruct(ob[s]); } else write("Not allowed to remove players, Bad !\n"); } } return 1 ; } int cmd_dest(string str) { object ob, act_ob, *obs; string msg, opt; int clean, global, l, s; act_ob = previous_object(); seteuid(geteuid(act_ob)); notify_fail( SYNTAX ); if (!str || str == "") return 0; #ifdef GUEST_NO_DEST if (getuid(previous_object()) == "guest") { write ("Guest is not permitted to dest objects.\n") ; return 1 ; } #endif if (str == "all") return dest_all(act_ob, 0); if (sscanf(str, "-%s %s", opt, str) == 2) { if (strsrch(opt, 'a') != -1) clean = 1; if (strsrch(opt, 'g') != -1) global = 1; } if (global) { if (!adminp(geteuid(act_ob))) { write("Global Dest: Permission denied.\n"); return 1; } str = resolv_path("cwd", str); l = strlen(str); obs = objects(); s = sizeof(obs); write("Global destructing: " + str + "\n"); cnt = 0; while (s--) { if (!obs[s]) continue; if (strncmp(file_name(obs[s]), str, l) == 0) { if (clean) dest_all(obs[s], 1); cnt++; if (obs[s]) { catch(obs[s]->remove()); destruct(obs[s]); } } } write("object(s) destructed: " + cnt + "\n"); } else { if (!(ob = get_object(str))) { write("Dest: Could not locate that object.\n"); return 1; } if (interactive(ob) && !adminp(geteuid(act_ob))) { write("Dest: Permission denied.\n"); return 1; } if (clean) dest_all(ob, 1); write("Destructing: " + identify(ob) + "\n"); msg = (string)act_ob->query_mdest(ob); if (environment(ob) == this_player() || environment(ob) == environment(this_player())) say( capitalize(msg) + "\n"); catch(ob->remove()); if (ob) destruct(ob); } return 1; } int help() { write( SYNTAX + "\n" + "This command will search for the inputed object, and remove it\n" + "from existence. Only admin may remove interactive objects. If\n" + "the -a flag is used, it will clean the object's inventory first.\n" + "If the -g flag is used, the specified pattern is used to destroy\n" + "objects with matching file names. (Use with caution!)\n"); return 1; }