// File : /cmds/xtra/_gate.c
// Creator : Watcher@TMI-2 (01/93)
//
// This is a wizard command which allows the moving of an
// object, player, or monster from one location to another.
#include <mudlib.h>
inherit DAEMON ;
#define SYNTAX "Syntax: gate [object] to [location | object]\n" + \
" gate [object] in [loc | obj] to [loc | obj]\n"
int cmd_gate(string str) {
object prev, whatp, wherep;
string prefix, loc, what, where, tmp_where;
int ret;
notify_fail(SYNTAX);
// Parse the input into proper command request
if( !str || str == "") return 0;
if( sscanf(str, "%s in %s to %s", what, loc, where) != 3 &&
sscanf(str, "%s to %s", what, where) != 2 &&
sscanf(str, "%s %s", what, where) !=2)
return 0;
// Locate the object to be moved
if(loc && loc != "") {
if(get_object(loc)) whatp = present(what, get_object(loc));
}
else whatp = get_object(what);
if(!whatp) {
write("Gate: Could not locate \"" + what + "\"");
if(loc) write(" in \"" + loc + "\"");
write(".\n");
return 1; }
// See if you have permission to move the object
if(wizardp(whatp) && whatp != this_player() &&
!adminp(geteuid(this_player()))) {
write("You do not have permission to move that user.\n");
return 1; }
// Locate where to move the object
wherep = get_object(where);
// Move living objects to environment, nonliving to actual object
if(wherep && living(wherep) && living(whatp))
wherep = environment(wherep);
if(!wherep) {
tmp_where = resolv_path( "cwd", where );
catch( call_other( tmp_where, "???" ) ); // Load the poss. location
wherep = get_object( tmp_where );
}
if(!wherep) {
write("Gate: Could not locate \"" + where + "\".\n");
return 1; }
where = file_name(wherep); // Get final location name
// Check to see if the object is already at the desired location
if(wherep == environment(whatp)) {
write("Gate: \"" + what + "\" is already at \"" + where + "\".\n");
return 1; }
// Note pre-move location of the moving object
prev = environment(whatp);
// Attempt to move the object to the new location
ret = whatp->move(wherep);
if(ret) {
write("Gate: Could not move \"" + what + "\" to \"" + where + "\".\n");
return 1; }
// Check to make sure object is still in existence.
if(!whatp) {
write("Gate: The object was moved and destroyed at the destination.\n");
return 1; }
// Give reaction messages to object, caller, and surroundings
if(living(whatp)) prefix = capitalize((string)whatp->query("name"));
else prefix = article(what) + " " + what;
tell_room(prev, capitalize(prefix) + " suddenly shimmers " +
"and fades away.\n", ({ whatp }) );
tell_object(whatp, "The air around you shimmers and you suddenly find" +
" yourself elsewhere.\n\n");
tell_room(wherep, "The air around you shimmers and " + prefix +
" suddenly forms before you.\n", ({ whatp }) );
if(interactive(whatp)) whatp->force_me("look");
if(member_array(this_player(), ({ wherep, prev })) == -1 &&
member_array(environment(this_player()), ({ wherep, prev })) == -1)
write("Ok.\n");
return 1; }
int help() {
write(SYNTAX + "\n" +
"This command allows the user to move an object, monster, or player\n" +
"to another location, living or nonliving object. If the moved object\n"+
"is living and the destination is living, it will be moved to the\n" +
"destination's environment, while an non-living object will actually\n" +
"be moved to that living object's inventory. The gate command also\n" +
"responds to such aliases as here, me, env, environment.\n");
return 1; }