/* -*- LPC -*- */
/*
* $Locker: $
* $Id: ca_ll.c,v 1.5 2001/06/08 02:16:26 presto Exp $
* $Log: ca_ll.c,v $
* Revision 1.5 2001/06/08 02:16:26 presto
* Fixed type warnings
*
* Revision 1.4 2001/05/23 00:49:12 presto
* Type error: retobj was object, should have been mixed
*
* Revision 1.3 2000/07/02 10:15:14 taffyd
* Added a reference_allowed() call.
*
* Revision 1.2 1999/04/08 11:07:38 terano
* Removed no score check from informs
*
* Revision 1.1 1998/01/06 05:10:49 ceres
* Initial revision
*
*/
/* call command, trial out by Turrican for a commands daemon. */
#include <creator.h>
#include <parser.h>
#define LMASTER "/d/liaison/master"
inherit "/cmds/base";
mixed cmd(string str) {
/* call fish(x,y,z) object */
mixed *args, file, f;
mixed retobj;
string *s, s1, s2;
string fn,os, obvarname;
string *argv;
object *ov;
object fish, shad, ob;
notify_fail("USAGE : call [obvar=]lfun(arg[,arg[,arg...]]) object[s]\n");
if (!str)
return 0;
obvarname = (string)0;
sscanf(str, "%s=%s", obvarname, str);
s = explode("&"+str+"&", ")");
if (sizeof(s) < 2 || sscanf(s[0], "%s(%s", s1, s2) != 2)
return 0;
fn = replace(s1[1..], " ", "");
s[0] = s2;
args = PARSER->parse_args(implode(s, ")"), ")");
if (!args) return 1;
argv = args[0];
os = args[1][0..<2];
while (strlen(os) && os[0] == ' ')
os = os[1..];
notify_fail("Can't find object "+os+".\n");
ov = WIZ_PRESENT->wiz_present(os, this_player());
ov = filter( ov, (: reference_allowed( $1, $( this_player() ) ) :) );
if (!sizeof(ov)) return 0;
if (sizeof(argv) < 6) argv += allocate(6 - sizeof(argv));
foreach (ob in ov) {
fish = ob;
while (shad = shadow(fish, 0)) {
fish = shad;
if (f = function_exists(fn, fish)) file = f;
}
if (!file) file = function_exists(fn, ob);
if (file) {
if ( ( ob != this_player() && ob->query_property( "player" ) ) ) {
unguarded((: write_file,
(LMASTER->query_member(this_player()->query_name()) ?
"/d/admin/log/CALL_LIAISONS.log" :
"/d/admin/log/CALL_CREATORS.log" ),
sprintf("%s: %s (%O) called %s(%s) on %s (%O)\n",
ctime(time()),
this_player()->query_name(), this_player(),
fn, implode(argv - ({0}), ", "),
ob->query_name(), ob) :));
user_event("inform", sprintf("%s called %s(%s) on %s",
this_player()->query_name(), fn, implode(argv - ({0}), ", "),
ob->query_name()), "calls");
}
retobj = call_other(ob,fn,argv...);
/* inform_of_call(ov[i], ({ fn }) + argv); */
printf("*** function on '%s' found in %s ***\n",
WIZ_PRESENT->desc_object(ob), file);
write(sprintf("$P$Call result$P$Returned: %O\n", retobj));
if (obvarname) {
if (objectp(retobj)) this_player()->set_obvar(obvarname, retobj);
/* others could be done ... like arrays etc, but phuck it */
}
} else
printf("*** function on '%s' Not found ***\n",
WIZ_PRESENT->desc_object(ob));
file = 0;
}
return 1;
}