// Improved locking door script
//
// Started by: Eric Linden
// Modified by: Bjorn Nordlicht
//
//My friend wanted a decent locking door script for his new
// home but we could only find broken free scripts.
// This script has been modified so it works well enough.
//
//Seconds before open door will close on it's own
float timeout = 360.0;
// This number must match the channel number of the lock
// and unlock objects you want to use. If multiple doors
// have the same channel, then a single lock can lock all of
// them at once.
integer gLockChannel = 243;
integer locked = FALSE;
door(integer doorState)
{
rotation rot = llGetRot();
rotation delta = llEuler2Rot(<0,0,doorState*PI/3>);
rot = delta * rot;
llSetRot(rot);
llSleep(0.25);
rot = delta * rot;
llSetRot(rot);
}
default
{
on_rez(integer param)
{
llResetScript();
}
state_entry()
{
llOwnerSay("Door: Say lock or unlock on channel "+(string)gLockChannel);
state closed;
}
}
state closed
{
on_rez(integer param)
{
llResetScript();
}
state_entry()
{
llListen(gLockChannel, "", llGetOwner(), "");
//Close door
// llTriggerSound("Door close", 0.5);
door(-1);
}
listen(integer channel, string name, key id, string message)
{
if (channel == gLockChannel)
{
if (message == "unlock")
{
locked = FALSE;
//llTriggerSound("door unlock", 10.0);
llSay(0, "unlocked");
}
else if(message == "lock")
{
locked = TRUE;
//llTriggerSound("door lock", 10.0);
llSay(0, "locked");
}
}
}
touch_start(integer total_number)
{
key id = llDetectedKey(0);
if (id == llGetOwner() || !locked)
{
// llTriggerSound("Door open", 0.5);
state open;
}
else
{
// llTriggerSound("Door knock", 0.5);
}
}
}
state open
{
on_rez(integer param)
{
llResetScript();
}
state_entry()
{
//Open door
door(1);
llSetTimerEvent(timeout);
}
touch_start(integer num)
{
state closed;
}
timer()
{
state closed;
}
}