This is Crystaline’s excellent door script, which I love to use for my builds. It is meant fro single prim, non root doors. I added a bit of code to make the door “phantom” (actually [PRIM_PHYSICS_SHAPE_TYPE, 1]) when it is open.
//FREE SCRIPTS - TESTED AND WORKING ON KITELY
// If you paid for this script, you were ripped off.
// You may use in your creations.
// You may not sell it as a script or in a script collection.
/* Crystaline's door script v1.1
License: This script may be modified and copied. If you modify it,
please add a comment below in the modifications section
explaining the modification along with your name.
You may not resell or distribute this script except when it
is included as part of a product you have created.
Use: This door script is intended for use on linked non-root prims -
anotherwards, doors that are attached to something (such as a
door frame or wall) and are not the root prim of the link set.
All customizable values will be read in from a notecard.
Modifications:
If you modify this script from the original, please add your name
and a comment explaining the modification to this section.
Modified by Brayla Sana:
* I added physics changes to the open doors,
so now open doors do not block you.
* I created 3 versions, one for each axis.
*/
// The name of the notecard that contains the door settings
string NotecardName = "Door Settings";
// ------------------------------------------------------------------------------------
// Default values for settings that are read from the notecard. These will be
// overwritten by things in the notecard.
// ------------------------------------------------------------------------------------
// The amount to rotate the door in degrees
float DoorRotation;
// The number of seconds before auto-closing the door, or 0 to disable
float AutoCloseTime;
// The set to link this door with. All doors that are linked to this one and share
// the same DoorSet will open and close together. Can be any valid integer, setting
// it to -1 will disable linking with other doors
integer DoorSet;
// The sound to play when the door opens. This can be a UUID or the name of a
// sound in the prim's inventory. Set to empty string to disable.
string OpenSound;
// The sound to play when the door closes. This can be a UUID or the name of a
// sound in the prim's inventory. Set to empty string to disable.
string CloseSound;
// The volume to play the door opening sound at from 0.0 to 1.0
float OpenVolume;
// The volume to play the door closing sound at from 0.0 to 1.0
float CloseVolume;
// ------------------------------------------------------------------------------------
// Script implementation
// Whether the door is currently open
integer DoorOpen = 0;
// The original position and rotation of the door
vector OriginalPosition;
rotation OriginalRotation;
// The amount of rotation to apply when opening the door, derived from DoorRotation
rotation RotationOffset;
// The key of the last notecard that was read
key NotecardKey;
// The notecard line currently being read
integer CurrentLine;
// The key to use for dataserver queries
key QueryKey;
// Toggles the open state of the door (opens or closes it)
ToggleDoor()
{
if (DoorOpen)
{
CloseDoor();
}
else
{
OpenDoor();
}
}
// Opens the door
OpenDoor()
{
DoorOpen = 1;
llSetPrimitiveParams([PRIM_PHYSICS_SHAPE_TYPE, 1]); //Makes the door "Phantom" when open
llSetTimerEvent(AutoCloseTime);
OriginalPosition = llGetLocalPos();
OriginalRotation = llGetLocalRot();
if (OpenSound != "") llTriggerSound(OpenSound, OpenVolume);
llSetLocalRot(RotationOffset * OriginalRotation);
}
// Closes the door
CloseDoor()
{
DoorOpen = 0;
llSetPrimitiveParams([PRIM_PHYSICS_SHAPE_TYPE, 2]); //Makes the door "Solid"
llSetTimerEvent(0.0);
if (CloseSound != "") llTriggerSound(CloseSound, CloseVolume);
llSetLocalRot(OriginalRotation);
llSetPos(OriginalPosition);
}
// Read the script setup from the notecard if needed
ReadSetup()
{
key ncKey = llGetInventoryKey(NotecardName);
if (ncKey != NotecardKey)
{
// If the key is not the same as last time, it means either the
// notecard has changed, or we just have not read it yet
NotecardKey = ncKey;
CurrentLine = 0;
llSetText("* Loading *", <1.0, 0.0, 0.0>, 1.0);
QueryKey = llGetNotecardLine(NotecardName, CurrentLine);
}
}
// Sets all values to their defaults
SetDefaults()
{
DoorRotation = 90;
AutoCloseTime = 15;
DoorSet = -1;
OpenSound = "cb340647-9680-dd5e-49c0-86edfa01b3ac";
CloseSound = "e7ff1054-003d-d134-66be-207573f2b535";
OpenVolume = 1.0;
CloseVolume = 1.0;
}
// Perform any setup needed after the notecard has been read
PerformSetup()
{
RotationOffset = llEuler2Rot(<DoorRotation * DEG_TO_RAD, 0, 0>);
llSetText("", <1.0, 1.0, 1.0>, 1.0);
}
// Parse a line from the notecard and store anything we need from it
ParseLine(string line)
{
if (llStringTrim(line, STRING_TRIM) == "")
{
// Skip empty lines
return;
}
if (llGetSubString(llStringTrim(line, STRING_TRIM_HEAD), 0, 0) == "#")
{
// Lines whose first non-whitepace character is a # are comments
return;
}
list splitLine = llParseString2List(line, ["="], [""]);
if (llGetListLength(splitLine) != 2)
{
llOwnerSay("Skipping line " + (string)CurrentLine + " in setup notecard because it could not be parsed:\n" + line);
return;
}
// It appears we have a variable to set on this line, so let's try it
string varName = llStringTrim(llList2String(splitLine, 0), STRING_TRIM);
string varValue = llStringTrim(llList2String(splitLine, 1), STRING_TRIM);
if (varName == "DoorRotation")
{
DoorRotation = (float)varValue;
}
else if (varName =="AutoCloseTime")
{
AutoCloseTime = (float)varValue;
}
else if (varName =="DoorSet")
{
DoorSet = (integer)varValue;
}
else if (varName =="OpenSound")
{
OpenSound = varValue;
}
else if (varName =="CloseSound")
{
CloseSound = varValue;
}
else if (varName =="OpenVolume")
{
OpenVolume = (float)varValue;
}
else if (varName =="CloseVolume")
{
CloseVolume = (float)varValue;
}
}
default
{
state_entry()
{
// Perform setup once to ensure good defaults in case there
// is a problem reading the notecard
SetDefaults();
PerformSetup();
// Read the notecard to setup the script
NotecardKey = NULL_KEY;
ReadSetup();
}
on_rez(integer param)
{
llResetScript();
}
touch_start(integer total_number)
{
if (DoorSet == -1)
{
// We are not part of a set, so just toggle ourself
ToggleDoor();
}
else
{
// We are part of a set that opens/closes together, send a toggle
// message. We will also get the message ourself.
llMessageLinked(LINK_SET, DoorSet, "ToggleDoor", NULL_KEY);
}
}
moving_end()
{
// If someone moves the door, assume that it is closed and is in its
// new closed position. This event is not dependable and probably will
// not fire most of the time, but we don't really care in this case.
if(DoorOpen)
{
DoorOpen = 0;
llSetTimerEvent(0.0);
}
}
timer()
{
CloseDoor();
}
link_message(integer sender_num, integer num, string str, key id)
{
if (num == DoorSet && str == "ToggleDoor")
{
ToggleDoor();
}
}
changed(integer change)
{
if (change & CHANGED_INVENTORY)
{
SetDefaults();
ReadSetup();
}
}
dataserver(key query_id, string data)
{
if (query_id == QueryKey)
{
if (data == EOF)
{
llOwnerSay("Door Ready");
PerformSetup();
}
else
{
ParseLine(data);
++CurrentLine;
QueryKey = llGetNotecardLine(NotecardName, CurrentLine);
}
}
}
}