// Was asked to modify an existing door script. I was just given
// this to update so afraid I can't give credit, but if you know where
// the original came from, do let me know.
//
// Swinging door LSL script #1
// Handles the touch event.
// Handles the collision event.
// Handles closing the door automatically via a timer event.
// Triggers sounds when the door opens or closes.
//
// Updated by Kimm Paulino, April 2010, for Synonyme Toll,
// to use local coords for the rotations instead of global
// coords.
//
// Updated by Kimm Paulino, May 2010, for Synonyme Toll,
// to use messages to link two doors together.
//
// Note: For this to work, you need a door with a path cut
// of 0.375 to 0.875 and a width that is twice as wide
// as you need (the cut brings it back down to the right
// size). Without this, it will just rotate on the spot,
// not swing at the edge.
//
// Parameters you might want to change
float delay = 3.0; // time to wait before automatically closing door
// set to 0.0 to not automatically close
float direction = 1.0; // set to 1.0 or -1.0 to control direction the door swings
float volume = 0.5; // 0.0 is off, 1.0 is loudest
integer linked_doors = 0; // set to 1 if using this script in a linked set of doors
float angle = 90.0; // angle to open in degrees
integer coll_detect = 1; // set to 1 to make door open on approach
// Variables you will most likely leave the same
key open_sound = "cb340647-9680-dd5e-49c0-86edfa01b3ac";
key close_sound = "e7ff1054-003d-d134-66be-207573f2b535";
// KP: Link send/recv functions
// IMPORTANT
// If you only have one pair of doors using this script, then
// these will be fine. If you have several doors using this
// script that you don't want all opening together, then
// you'll have to change these to something unique.
//
integer LINK_MSG_NUM = 452345;
string LINK_MSG_STR_OPEN = "Open the door";
string LINK_MSG_STR_CLOSE = "Close the door";
linkSend (string dir)
{
if (linked_doors)
{
// Note: Could try to work out the link numbers of the doors,
// but simplest is to send to all other prims in the build.
llMessageLinked (LINK_ALL_OTHERS, LINK_MSG_NUM, dir, NULL_KEY);
}
}
integer linkRecv (integer sender_num, integer num, string str, key id, string str_to_check)
{
if (linked_doors)
{
// Check it really is a message for these doors
if (num == LINK_MSG_NUM)
{
if (str == str_to_check)
{
// All good
return 1;
}
}
}
// not for us
return 0;
}
// Processing for the script when it first starts up
default {
// What we do when we first enter this state
state_entry() {
state open; // Move to the open state
}
}
// Processing for the script when it is in the closed state
state closed {
// What we do when we first enter this state
state_entry() {
llTriggerSound(close_sound, volume); // Trigger the sound of the door closing
llSetLocalRot(llEuler2Rot(<0, 0, direction * angle * DEG_TO_RAD>) * llGetLocalRot());
}
// What we do when the door is clicked (”touched”) with the mouse
touch_start(integer total_number) {
linkSend (LINK_MSG_STR_OPEN); // KP: Tell everyone else we are now in the open state
state open; // Move to the open state
}
// What to do when something hits the door
collision_start(integer total_number)
{
if (coll_detect != 0)
{
linkSend (LINK_MSG_STR_OPEN); // KP: Tell everyone else we are now in the open state
state open; // Move to the open state
}
}
// KP: Handle link messages
link_message (integer sender_num, integer num, string str, key id)
{
if (linkRecv (sender_num, num, str, id, LINK_MSG_STR_OPEN))
{
state open; // Move to the open state
}
}
// What to do when the timer goes off
timer()
{
llSetTimerEvent(0.0); // Set the timer to 0.0 to turn it off
}
}
// Processing for the script when it is in the open state
state open {
// What we do when we first enter this state
state_entry() {
llTriggerSound(open_sound, volume);// Trigger the sound of the door opening
llSetLocalRot(llEuler2Rot(0><0, 0, -direction * angle * DEG_TO_RAD>) * llGetLocalRot());
llSetTimerEvent(delay); // Set the timer to automatically close it
}
// What do do when pulling the door from Inventory if it was saved while open
on_rez(integer start_param) {
state closed;
}
// What we do when the door is clicked (”touched”) with the mouse
touch_start(integer total_number) {
linkSend (LINK_MSG_STR_CLOSE); // KP: Tell everyone else we are now in the open state
state closed; // Move to the closed state
}
// What to do when something hits the door
collision_start(integer total_number)
{
// Do nothing, the door is already open
}
// KP: Handle link messages
link_message (integer sender_num, integer num, string str, key id)
{
if (linkRecv (sender_num, num, str, id, LINK_MSG_STR_CLOSE))
{
state closed; // Move to the open state
}
}
// What to do when the timer goes off
timer()
{
llSetTimerEvent(0.0); // Set the timer to 0.0 to turn it off
state closed; // Move to the closed state
}
}0>