// File : /cmds/xtra/_trace.c
// Creator : Watcher@TMI (03/04/93)
//
// This command allows you to locate any object, as well as
// any clones of it active in the mud. Descriptors and
// systematic destruction are options available.
#include <mudlib.h>
inherit DAEMON ;
#define SYNTAX "Syntax: trace -[d/m/v] [object/filename]\n"
#define PROTECT ({ "/std/user" , "/std/connection" })
int cmd_trace(string str) {
object target;
mixed *clones;
string para, hold, tmp1, tmp2;
int loop, dest, view, More, original;
notify_fail( SYNTAX );
if(!str || str == "") return 0;
// Check for requested command parameters
if(sscanf(str, "-%s %s", para, str) == 2) {
if(sscanf(" " + para + " ", "%sd%s", tmp1, tmp2) == 2) dest = 1;
if(sscanf(" " + para + " ", "%sv%s", tmp1, tmp2) == 2) view = 1;
if(sscanf(" " + para + " ", "%sm%s", tmp1, tmp2) == 2) More = 1;
}
// Try to locate the requested object
target = get_object( str );
// Oh well, couldn't find the object
if(!target) {
write("Trace: Could not locate requested object.\n");
return 1; }
hold = "Trace: " + identify(target);
if(environment(target))
hold += " in " + identify(environment(target)) + "\n";
else hold += "\n";
// Try to located all copies of the object
clones = children( file_name(target) );
// Its either the Master object or has no other copies around
if(sizeof(clones) == 1) {
if(base_name(clones[0]) != file_name(clones[0])) write(hold);
else write(hold + "There are no active copies of this object.\n");
if(dest) {
if((interactive(target) ||
member_array(base_name(target), PROTECT) != -1) &&
!adminp(geteuid(this_player()))) {
write("You do not have authorization to destruct that object.\n");
return 1; }
target->remove();
if(target) destruct(target);
if(target) write("Could not remove or destroy object.\n");
else write("Object has been removed and destructed.\n");
}
return 1; }
// Remove the target object from the clone array
else clones -= ({ target });
// Get original number of clones of designated object
original = sizeof( clones );
if(!(dest && !(More || view))) {
hold += "\n There are " + sizeof(clones) + " copies active.\n\n";
// Loop through the clone array to display contents
for(loop=0; loop<sizeof(clones); loop++) {
if(interactive(clones[loop])) hold += " I "; else hold += " ";
hold += identify( clones[loop] );
// If the object has an environment, display it...
if(environment( clones[loop] ))
hold += "\tin " + identify(environment(clones[loop])) + "\n";
else hold += "\n";
}
}
if(!More) write(hold + "\n");
else this_player()->more( explode(hold, "\n"), 0 ,1 );
// If the destruct flag is set, attempt to destruct
// all active copies of the requested object.
if(dest) {
if(More) write("\n");
// Security check...don't want anyone just wiping out
// specific file objects like /std/user.c
if(!adminp(geteuid(this_player())) &&
member_array(base_name(target), PROTECT) != -1) {
write("You do not have authorization to destruct that object group.\n");
return 1; }
// Try to remove all clone copies
clones->remove();
clones = children( file_name(target) );
clones -= ({ target });
// If there are any copies left...this should get rid of them
for(loop=0; loop<sizeof(clones); loop++)
destruct( clones[loop] );
clones = children( file_name(target) );
clones -= ({ target });
write("All " + original + " copies of " + file_name(target) + " have " +
"been removed and destroyed");
if(!sizeof(clones)) { write(".\n"); return 1; }
write("except:\n");
for(loop=0; loop<sizeof(clones); loop++)
write(" " + clones[loop] + "\n");
}
return 1; }
int help() {
write( SYNTAX + "\n" +
"This command allows the user to locate the requested object\n" +
"and any active clones with their respective locations. The\n" +
"parameter 'd' can be used to remove and destruct every copy.\n" +
"When the 'd' parameter is envoked, the clones and locations\n" +
"will not be displayed. This can be overridden with the 'v'\n" +
"parameter. The 'm' parameter can be used to have the output\n" +
"given in a more format.\n\n" +
"The parameters can be given together and in any combination.\n" +
"For example: trace -dm /obj/dagger will destruct every copy\n" +
"of /obj/dagger and display their respective ids and locations\n" +
"in a more format.\n");
return 1; }