/* Do not remove the headers from this file! see /USAGE for more info. */ private mixed handle_blocks(string str); private void we_moved(); string array current_blocks = ({}); function hook = (: handle_blocks :); function move_hook = (: we_moved :); object env; mixed block_action; void add_hook(string, mixed); void remove_hook(string, mixed); private void we_moved() { if (env) { foreach (string dir in current_blocks) env->remove_hook("block_" + dir, hook); } else { foreach (string dir in current_blocks) remove_hook("block_" + dir, hook); } env = environment(); if (env) { foreach (string dir in current_blocks) env->add_hook("block_" + dir, hook); } else { foreach (string dir in current_blocks) add_hook("block_" + dir, hook); } } //:FUNCTION add_block //Adds the exits specified to the list of exits this object is blocking //'all' can be used to block all exits void add_block(string array exits...) { current_blocks += exits; if (env) foreach (string dir in exits) env->add_hook("block_" + dir, hook); else foreach (string dir in exits) add_hook("block_" + dir, hook); if (sizeof(current_blocks)) add_hook("move", move_hook); } //:FUNCTION remove_block //Removes the exits specified to the list of exits this object is blocking void remove_block(string array exits...) { current_blocks -= exits; if (env) foreach (string dir in exits) env->remove_hook("block_" + dir, hook); else foreach (string dir in exits) remove_hook("block_" + dir, hook); if (!sizeof(current_blocks)) remove_hook("move", move_hook); } //:FUNCTION set_block_action //If given a string, that 'targetted_action' will be done when someone //tries to move a direction we are blocking, unless it starts with a //'#', in which case it is just written to the user. If it is a function, //then that function will be called with the direction and the person //as args, and the move will be allowed only if the function returns 1. void set_block_action(mixed ba) { block_action = ba; } varargs void targetted_action(); mixed handle_blocks(string dir) { // sanity check if (env != environment(this_object())) { we_moved(); return 0; // don't block, we weren't even in the room we thought // we were } if (stringp(block_action)) { if (block_action[0] == '#') write(block_action[1..]); else targetted_action(block_action, this_body(), dir, this_object()); return 1; } if(!functionp(block_action)) error("Blocked exit, but set_block_action() not called.\n"); return !evaluate(block_action, dir, this_body()); } mapping lpscript_attributes() { return ([ "block" : ({ LPSCRIPT_STRING, "setup", "add_block" }), "unblock" : ({ LPSCRIPT_STRING, "setup", "remove_block" }), "block_action" : ({ LPSCRIPT_STRING, "setup", "set_block_action" }), ]); }