private mixed *callout; /* call_out key */ /* * NAME: call_out() * DESCRIPTION: handle a call_out */ static varargs void call_out(string func, int delay, mixed args...) { ARGCHECK(func, call_out, 1); if (func != "_F_reset") { lock(add_call_out(), ::call_out("_F_call_out", delay, callout, func, this_player(), args...)); } } /* * NAME: _F_call_out() * DESCRIPTION: handle a call_out */ nomask varargs void _F_call_out(mixed *key, string func, object player, mixed args...) { if (key == callout) { del_call_out(); set_this_player(player); call_other(this_object(), func, args...); } } /* * NAME: find_call_out() * DESCRIPTION: find a call_out */ static int find_call_out(string func) { mixed **clist, *c; int i, sz; clist = status(this_object())[O_CALLOUTS]; for (i = 0, sz = sizeof(clist); i < sz; i++) { if (sizeof(c=clist[i]) > 3 && c[4] == func) { return c[2]; } } return -1; } /* * NAME: remove_call_out() * DESCRIPTION: remove a call_out */ static int remove_call_out(string func) { mixed **clist, *c; int i, sz; clist = status(this_object())[O_CALLOUTS]; for (i = 0, sz = sizeof(clist); i < sz; i++) { if (sizeof(c=clist[i]) > 3 && c[4] == func) { return lock(del_call_out(), ::remove_call_out(c[0])); } } return -1; } /* * NAME: set_heart_beat() * DESCRIPTION: start or stop the heart_beat */ static int set_heart_beat(int flag) { if (flag) { if (callout[0] == 0) { lock(add_heart_beat(), callout[0] = ::call_out("_F_heart_beat", 1 + (time() & 1), callout)); return 1; } } else { if (callout[0] > 0) { lock(del_heart_beat(), ::remove_call_out(callout[0]), callout[0] = 0); return 1; } callout[0] = 0; } return 0; } /* * NAME: _F_heart_beat() * DESCRIPTION: handle heart_beat calls */ nomask void _F_heart_beat(mixed *key) { if (key == callout) { key[0] = -1; del_heart_beat(); if (living(this_object())) { set_this_player(this_object()); } else { set_this_player(0); } this_object()->heart_beat(); if (key[0] < 0) { lock(add_heart_beat(), key[0] = ::call_out("_F_heart_beat", 1 + (time() & 1), key)); } } }