// 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, -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 } }