• All submissions to this site are governed by Second Life Project Contribution Agreement. By submitting patches and other information using this site, you acknowledge that you have read, understood, and agreed to those terms.
Issue Details (XML | Word | Printable)

Key: SVC-1389
Type: Bug Bug
Status: Resolved Resolved
Resolution: Won't Finish
Priority: Critical Critical
Assignee: Unassigned
Reporter: Henry Grumiaux
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
2. Second Life Service - SVC

After the region restart today - My scripts does not works anymore....(Timeless Door)

Created: 31/Jan/08 04:34 PM   Updated: 01/Feb/08 01:19 PM
Return to search
Component/s: Scripts
Affects Version/s: 1.18.6 Server
Fix Version/s: None

Issue Links:
Relates


 Description  « Hide
Well...I've a Prefab Store...very huge store with thousands of customers...So, I use the same scripts since I started my business...

When I go to the region Star Gazer to install a home I received a Pop Up message telling me that this region is running a server software different of the previous region..

Ok, Np !

So, when I rezzed the home...I start to receive several error messages from my scripts...in particular...door scripts...

The doors scripts does not works at this region...

I decided to back to my region to test there...wortking fine...

back to the Star Gazer....error again...

So, me and my wife talked with Rowan Linden that's suggested to us to open a Jira about it...

Ok, I've bad feelings about....

1) I've thousands of customers running this script....Probally tomorrow I will receive several messages "My Doors ! My Doors !!Unable to render embedded object: File (" and others message like "This home does not work anymore) not found. I want refund !!!"

2) I use the Timeless Door Script..a very popular script that probally several prefab builders use too...It means that this situation will not affect just me or my customers...but probally several customers of several other store and current SL residents too because everybody use this script.

Bellow a copy:

//------------------------------------------------------
// Timeless Linked Door Script by Timeless Prototype
//------------------------------------------------------
// The latest version of this script can always be found
// in the Library section of the wiki:
// http://www.secondlife.com/badgeo/
// This script is free to use, but whereever it is used
// the SCRIPT's permissions MUST be set to:
// [x] Next owner can modify
// [x] Next owner can copy
// [x] Next owner can transfer
// [x] Allow anyone to copy
// [x] Share with group

//------------------------------------------------------
// USAGE INSTRUCTIONS FOR EVERYDAY USE:
//------------------------------------------------------
// Say the following commands on channel 0:
// 'unlock' - Unlocks all doors in range.
// 'lock' - Locks all doors in range and allows
// only the permitted users to open it.
// To open the door, either Touch it, Walk into it or
// say 'open' or say 'close'.

//------------------------------------------------------
// USAGE INSTRUCTIONS FOR BUILDERS:
//------------------------------------------------------
// 1. Copy and paste this script into the door prim and
// change the settings (see further down).
// 2. The door prim must be linked to at least one other
// prim (could be linked to the house for example).
// 3. The door prim MUST NOT be the root prim.
// 4. Use Edit Linked Parts to move, rotate and size the
// door prim for the closed state.
// 5. When ready, stand close to the door and say
// '/door closed' (this records the closed door
// position, rotation and size to the object's
// name and description).
// 6. Use the Edit Linked parts to move, rotate and size
// the door prim for the opened state.
// 7. When ready, stand close to the door and say
// '/door opened' (this records the opened door
// position, rotation and size).
// 8. Once recorded it will not accept these commands
// again. If you do need to redo the settings then
// delete the Name and Description of the door prim
// (these are where the position information is
// stored), and then follow the steps above again.
// Note: deleting the object name won't save, so set
// the object name to 'Object' to reset the object
// name.

//------------------------------------------------------
// Change these settings to suit your needs.
//------------------------------------------------------
// To mute any/all of the sounds set the sound string(s)
// to "" (empty string).
// To get the UUID of a sound, right click on the sound
// in your inventory and choose "Copy Asset UUID", then
// paste the UUID in here.
string doorOpenSound = "cb340647-9680-dd5e-49c0-86edfa01b3ac";
string doorCloseSound = "e7ff1054-003d-d134-66be-207573f2b535";
string confirmedSound = "69743cb2-e509-ed4d-4e52-e697dc13d7ac";
string accessDeniedSound = "58da0f9f-42e5-8a8f-ee51-4fac6c247c98";
string doorBellSound = "ee871042-e272-d8ec-3d40-0b0cb3371346"; // Setting to empty stops door announcements too.
float autoCloseTime = 120.0; // 0 seconds to disable auto close.
integer allowGroupToo = TRUE; // Set to FALSE to disallow same group access to door.
list allowedAgentUUIDs = ["8efecbac-35de-4f40-89c1-2c772b83cafa"]; // Comma-separated, quoted list of avatar UUIDs who are allowed access to this door.
integer listenChannel = 0;

//------------------------------------------------------
// Leave the rest of the settings alone, these are
// handled by the script itself.
//------------------------------------------------------
integer isLocked = FALSE; // Only when the door is locked do the permissions apply.
integer isOpen = TRUE;
vector openPos = ZERO_VECTOR;
rotation openRot = ZERO_ROTATION;
vector openScale = ZERO_VECTOR;
vector closedPos = ZERO_VECTOR;
rotation closedRot = ZERO_ROTATION;
vector closedScale = ZERO_VECTOR;
key openerKey = NULL_KEY;
key closerKey = NULL_KEY;
integer isSetup = FALSE;
integer listenHandle = 0;
string avatarName = "";

mySayName(integer channel, string objectName, string message)
{
string name = llGetObjectName();
llSetObjectName(objectName);
llSay(0, "/me " + message);
llSetObjectName(name);
}

mySay(integer channel, string message)
{
string name = llGetObjectName();
llSetObjectName("Door");
llSay(0, message);
llSetObjectName(name);
}

myOwnerSay(string message)
{
string name = llGetObjectName();
llSetObjectName("Door");
llOwnerSay(message);
llSetObjectName(name);
}

mySoundConfirmed()
{
if (confirmedSound != "")

{ llTriggerSound(confirmedSound, 1.0); }

}

mySoundAccessDenied()
{
if (accessDeniedSound != "")

{ llTriggerSound(accessDeniedSound, 1.0); }

}

myGetDoorParams()
{
isSetup = FALSE;
if (llSubStringIndex(llGetObjectDesc(), "door;") == 0 && llSubStringIndex(llGetObjectName(), "door;") == 0)
{
list nameWords = llParseString2List(llGetObjectName(), [";"], []);
list descWords = llParseString2List(llGetObjectDesc(), [";"], []);
if (llGetListLength(nameWords) != 4 || llGetListLength(descWords) != 4)

{ myOwnerSay("The door prim's name and/or description has invalid syntax and/or number of parameters. Delete the door prim's name and description and setup the door prim again."); }

else

{ openPos = (vector)llList2String(nameWords, 1); openRot = (rotation)llList2String(nameWords, 2); openScale = (vector)llList2String(nameWords, 3); closedPos = (vector)llList2String(descWords, 1); closedRot = (rotation)llList2String(descWords, 2); closedScale = (vector)llList2String(descWords, 3); isSetup = TRUE; }

}
}

mySetDoorParams(vector openPos, rotation openRot, vector openScale, vector closedPos, rotation closedRot, vector closedScale)
{
llSetObjectName("door;" +
(string)openPos + ";" +
(string)openRot + ";" +
(string)openScale);
llSetObjectDesc("door;" +
(string)closedPos + ";" +
(string)closedRot + ";" +
(string)closedScale);
isSetup = TRUE;
}

integer myPermissionCheck(key id)
{
integer hasPermission = FALSE;
if (isLocked == FALSE)
{ hasPermission = TRUE; }
else if (llGetOwnerKey(id) == llGetOwner())
{ hasPermission = TRUE; } }
else if (allowGroupToo == TRUE && llSameGroup(id))
{ hasPermission = TRUE; }
else if (llListFindList(allowedAgentUUIDs, [(string)id]) != -1)
{ hasPermission = TRUE; } }
return hasPermission;
}

myOpenDoor()
{
isOpen = FALSE;
myToggleDoor();
}

myCloseDoor()
{
isOpen = TRUE;
myToggleDoor();
}

myToggleDoor()
{
if (isSetup == FALSE)

{ myOwnerSay("The door prim has not been configured yet. Please read the usage instructions in the door script."); }

else if (llGetLinkNumber() == 0 || llGetLinkNumber() == 1)

{ myOwnerSay("The door prim must be linked to at least one other prim and the door prim must not be the root prim"); }

else
{
isOpen = !isOpen;
if (isOpen)
{
if (doorBellSound != "")
{
llTriggerSound(doorBellSound, 1.0);
if (avatarName != "")

{ mySayName(0, avatarName, "is at the door."); avatarName = ""; }

}
if (doorOpenSound != "")

{ llTriggerSound(doorOpenSound, 1.0); }

llSetPrimitiveParams([ PRIM_POSITION, openPos, PRIM_ROTATION, ZERO_ROTATION * openRot / llGetRootRotation(), PRIM_SIZE, openScale ]);
// Door API.
llMessageLinked(LINK_SET, 255, "cmd|door|opened", NULL_KEY);
}
else
{
if (doorCloseSound != "")

{ llTriggerSound(doorCloseSound, 1.0); }

llSetPrimitiveParams([ PRIM_POSITION, closedPos, PRIM_ROTATION, ZERO_ROTATION * closedRot / llGetRootRotation(), PRIM_SIZE, closedScale ]);
// Door API.
llMessageLinked(LINK_SET, 255, "cmd|door|closed", NULL_KEY);
}

llSetTimerEvent(0.0);
if (isOpen == TRUE && autoCloseTime != 0.0)

{ llSetTimerEvent(autoCloseTime); }

}
}

default
{
state_entry()

{ listenHandle = llListen(listenChannel, "", NULL_KEY, ""); myGetDoorParams(); }

touch_start(integer total_number)
{
if (myPermissionCheck(llDetectedKey(0)) == TRUE)

{ avatarName = llDetectedName(0); myToggleDoor(); }

else

{ mySoundAccessDenied(); }

}

timer()

{ myCloseDoor(); }

link_message(integer sender_num, integer num, string str, key id)
{
// Door API. The API is here in case you want to create PIN entry keypads or whatever.
if (num == llGetLinkNumber())
{
if (str == "cmd|door|doOpen")

{ myOpenDoor(); }

else if (str == "cmd|door|doClose")

{ myCloseDoor(); }

}
if (str == "cmd|door|discover")

{ llMessageLinked(LINK_SET, 255, "cmd|door|discovered|" + (string)llGetKey(), id); }

}

listen(integer channel, string name, key id, string message)
{
// Performance note: it's quicker to compare the strings than to compare permissions each time anyone says anything on this channel.
if (message == "open")
{
if (myPermissionCheck(id) == TRUE)

{ // Only open the door if the person is quite close to this door. openerKey = id; closerKey = NULL_KEY; avatarName = name; llSensor(name, id, AGENT, 5.0, TWO_PI); }

else
{ mySoundAccessDenied(); }
}
else if (message == "close")
{
if (myPermissionCheck(id) == TRUE)
{ openerKey = NULL_KEY; closerKey = id; avatarName = name; // Only close the door if the person is quite close to this door. llSensor(name, id, AGENT, 5.0, TWO_PI); }
else
{ mySoundAccessDenied(); } }
}
else if (message == "lock")
{
if (myPermissionCheck(id) == TRUE)

{ isLocked = TRUE; mySoundConfirmed(); }

else
{ mySoundAccessDenied(); }
}
else if (message == "unlock")
{
if (myPermissionCheck(id) == TRUE)
{ isLocked = FALSE; mySoundConfirmed(); }
else
{ mySoundAccessDenied(); } }
}
else if (message == "/door opened" && llSubStringIndex(llGetObjectName(), "door;") == -1)
{
if (llGetOwnerKey(id) == llGetOwner())
{
mySoundConfirmed();
openPos = llGetLocalPos();
openRot = llGetLocalRot();
openScale = llGetScale();
isOpen = TRUE;
if (! (closedPos == ZERO_VECTOR && closedRot == ZERO_ROTATION && closedScale == ZERO_VECTOR))
{ mySetDoorParams(openPos, openRot, openScale, closedPos, closedRot, closedScale); }
}
else
{ mySoundAccessDenied(); }
}
else if (message == "/door closed" && llSubStringIndex(llGetObjectDesc(), "door;") == -1)
{
if (llGetOwnerKey(id) == llGetOwner())
{
mySoundConfirmed();
closedPos = llGetLocalPos();
closedRot = llGetLocalRot();
closedScale = llGetScale();
isOpen = FALSE;
if (! (openPos == ZERO_VECTOR && openRot == ZERO_ROTATION && openScale == ZERO_VECTOR))
{ mySetDoorParams(openPos, openRot, openScale, closedPos, closedRot, closedScale); } }
}
else

{ mySoundAccessDenied(); }

}
}

sensor(integer num_detected)
{
if (openerKey != NULL_KEY)
{
integer i;
for (i = 0; i < num_detected; i++)
{
if (llDetectedKey == openerKey && myPermissionCheck(llDetectedKey) == TRUE)

{ myOpenDoor(); }

}
openerKey = NULL_KEY;
}
else
{
integer i;
for (i = 0; i < num_detected; i++)
{
if (llDetectedKey == closerKey && myPermissionCheck(llDetectedKey) == TRUE)

{ myCloseDoor(); }

}
closerKey = NULL_KEY;
}
}

//------------------------------------------------------
// Uncomment the following code if you particularly want
// collisions to affect the door state.
//------------------------------------------------------

// collision_start(integer num_detected)
// {
// integer i;
// for (i = 0; i < num_detected; i++)
// {
// if (myPermissionCheck(llDetectedKey) == TRUE)
// { // avatarName = llDetectedName(i); // myOpenDoor(); // }
// else if (llDetectedType & AGENT)
// { // mySoundAccessDenied(); // }
// }
// }

} // End of default state and end of script.



 All   Comments   Change History      Sort Order: Ascending order - Click to sort in descending order
Henry Grumiaux added a comment - 31/Jan/08 04:59 PM
Just some more additional infos:

if you use commands /door opened and closed...

Yes, will works...

however.,..if you reset the script...this will stop to work because probally the script is unable to read the llGetObjectName and llGetObject Desc


Henry Grumiaux added a comment - 31/Jan/08 07:04 PM
Found something....Debugging in both regions...Very instresting...

Linked Object Name: door;<0.55040, 0.83800, 0.00000>;<0.00000, 0.00000, -0.70711, 0
Linked Object Description: door;<0.10991, 0.38390, 0.00000>;<0.00000, 0.00000, -0.00000, 1.00000>;<0.98058, 0.10000, 0.80000>

At the myGetDoorParams() function there is...

list nameWords = llParseString2List(llGetObjectName(), [";"], []);
list descWords = llParseString2List(llGetObjectDesc(), [";"], []);

In a non restarted and not uptaded region...

llGetListLength(nameWords) returns 3

In a restarted region

llGetListLength(nameWords) returns 4 !!!!

This cause the script to fail when...

if (llGetListLength(nameWords) != 4 || llGetListLength(descWords) != 4)

{ FAIL TRAP }

Harleen Gretzky added a comment - 31/Jan/08 08:41 PM - edited
The object name is being truncated. This was done on purpose, see SVC-1394 and SVC-674.

Also the exploit from SVC-997 (removed because it described the exploit).


Dedric Mauriac added a comment - 01/Feb/08 01:19 PM
This script is wasting a lot of valuable space in the description. For example, <0.00000, 0.00000, -0.00000, 1.00000> is the same as <0,0,0,1> but takes up lots more characters. You may want to truncate some of the other floats or round them out to use only 2 digits after the decimal.