@q
@program freelock.muf
1 9999 d
i
( FreeLock.muf v1.0 Jessy @ FurryMUCK 5/97
This program provides a way for players other than the owner of
an exit to lock or unlock it, and includes routines that insure
the lock will be cleared if the room the exit leads to becomes
vacant. Its intended use is to allow public rooms to be locked for
privacy, without the danger that players will disconnect or depart
the room without unlocking it, leaving it inaccessible for others.
INSTALLATION:
Set FreeLock.muf M3 and L.
SET-UP
A separate action locks and unlocks the exit. Normally, this lock/unlock
command will be located inside the room to be locked. The command name
should include two aliases, one including the string 'unlock' and one
including the string 'lock', such as 'lock;unlock' or 'lock booth;unlock
booth.' Then, designate the exit to be locked/unlocked with the #link
argument, and @lock it to this program. Example:
@open lock booth;unlock booth
@link lock booth = <#dbref of FreeLock.muf>
lock booth #link #123
@lock #123 = <#dbref of FreeLock.muf>
Exit #123 is the exit leading into the booth room. Players inside the
booth may type 'lock booth' for privacy. To unlock it, they can type
'unlock booth', or simply leave.
The self-clearing routine is only used if the locked exit leads to a
room. In other cases, the lock remains in place until it is explicitly
unlocked.
FreeLock.muf may be freely ported. Please comment any changes.
)
$include $lib/strings
: DoHelp ( -- ) (* direct user to @view *)
prog "_docs" "@list #" prog intostr strcat "=1-37" strcat setprop
"Type '@view #" prog intostr strcat "' for information on "
"configuring a publically lockable exit." strcat strcat .tell
;
: DoLink ( s -- ) (* set props designating exit controlled
by a FreeLock lock/unlock command. *)
" " STRsplit dup not if (* parse exit dbref *)
DoHelp pop exit
then
dup "#*" smatch if
"" "#" subst atoi dbref
else
match dup not if
"I can't find the exit you want to make lockable."
.tell pop exit
else
dup #-2 dbcmp if
"I'm not sure which one you mean." .tell pop exit
then
then
then
(* check: allowed? *)
me @ over controls not if
"Permission denied." .tell pop exit
then
(* designate exit *)
dup trig "_lock_to" rot setprop
"Lock set." .tell
(* remind about locking exit to program *)
dup getlockstr "" "#" subst
prog intostr smatch not if
"Now lock the action to this program: @lock #"
swap intostr strcat " = #" strcat prog intostr strcat .tell
then
;
: DoLock ( -- ) (* freelock designated exit *)
trig "_lock_to" getprop dup not if
"No action has been designated for this lock." .tell pop exit
then
"_freelocked" trig setprop
trig "_/sc" getpropstr not if
"Locked." .tell
then
;
: DoUnlock ( -- ) (* unlock designated exit *)
trig "_lock_to" getprop dup not if
"No action has been designated for this lock." .tell pop exit
then
"_freelocked" remove_prop
trig "_/sc" getpropstr not if
"Unlocked." .tell
then
;
: main
"me" match me !
(* this way if exit is LOCKED to program *)
trig getlockstr dup if
"" "#" subst
prog intostr smatch if
(* is it freelocked? Return true if not... *)
trig "_freelocked" getprop not if
1 exit
else
(* ...otherwise check for awake players... *)
trig getlink dup room? not if
pop 1 exit
then
contents
begin
dup while
dup player? if
dup awake? if (* found awake player )
pop 0 exit ( in locked room... )
then ( lock fails *)
then
next
repeat
trig "_freelocked" remove_prop (* ...or, didn't find )
1 exit ( one: clear lock prop )
then ( and return true *)
then
then
(* this way if exit is LINKED to program. *)
(* figure out what player wants to do... *)
trig getlink prog dbcmp if
dup if
dup "#help" swap stringpfx if DoHelp exit else
dup "#link*" smatch if DoLink exit
then then
then
command @ "unlock" instr if
DoUnlock
else
command @ "lock" instr if
DoLock
then
then
exit
then
;
.
c
q