nyuuzyou/wikis huggingface dataset:
LlFlee debugging

Note: you'll probably need to recompile the script after you add it to your object
<lsl>
float speed = 1.0; //speed the critter moves at
float sensorRange = 3.0; //how far the critter can see, if it;s a bit myopic (lol) increase this numer
vector wanderRange = <10.0, 10.0, 10.0>; //radius the critter wanders from the last place it was scared or rezzed/reset
float minFleeDistance = 3.0; //how far from the critter the agent must be to make it run (ie, less than this number)
float fleeDistance = 10; //the distance the critter will free from an avatar
integer extraHard = FALSE; //if this is set to true the critter will wander when it gets near the flee distance instead of when it get to the end of the flee distance, making it harder to control and less predictable
// -- don't mod anything below this line
float var = 5.0;
vector scale;
vector basePos;
vector scaryGiantPos;
debugMsg(string msg)
{
 //llOwnerSay(msg); //comment this line out to turn off debug messages
}
setup()
{
 llDeleteCharacter();
 llResetScript();
}
wander()
{
 llSensorRepeat("", "", AGENT, 5.0, PI, sensorRange);
 basePos = llGetPos();
 llWanderWithin(basePos, wanderRange, []);
}
default
{
 state_entry()
 {
 //if (llGetObjectDesc() != "0" && llGetObjectDesc() != "(No Description)") //should be zero if rezzed from inventory
 //{
 // speed = (float)llGetSubString(llGetObjectDesc(), 0, 1);
 // wanderRange = (float)llGetSubString(llGetObjectDesc(), 2, 3);
 //}
 llCreateCharacter([CHARACTER_DESIRED_SPEED, speed, CHARACTER_ORIENTATION, VERTICAL, CHARACTER_RADIUS, 0.2, CHARACTER_LENGTH, 0.5]);
 wander(); //either replace this with your functionality or replace the function doStuff()
 }
 
 //touch_start(integer total_number)
 //{
 // setup(); //comment this handler line out when done testing unless touch events desired
 //}
 
 on_rez(integer start_param)
 { 
 // llSetObjectDesc((string)start_param);
 setup();
 }
 
 sensor(integer num_detected)
 {
 
 string thisAgent = "";
 integer agentNum;
 for (agentNum=0; agentNum<num_detected; agentNum++)
 {
 key thisKey = llDetectedKey(agentNum);
 scaryGiantPos = llList2Vector(llGetObjectDetails(thisKey, [OBJECT_POS]), 0);
 float distance = llVecDist(llGetPos(), scaryGiantPos);
 debugMsg("detected at distance of " + (string)distance);
 if (distance < minFleeDistance)
 {
 debugMsg("I should be running");
 //llFleeFrom(scaryGiantPos, fleeDistance, []);
 llEvade(thisKey, []);
 }
 else wander();
 }
 }
 
 path_update(integer update, list none)
 {
 if (update == 0) //near goal
 {
 debugMsg("");
 }
 else if (update == 1) //goal reached
 {
 debugMsg("");
 wander();
 }
 else //errors
 {
 debugMsg("");
 }
 }
}
LlForceMouseLook Test

[LLForceMouselookTest]
[VERSION] 0.1
[LENGTH] 00:15
[TESTERS] 1
[OVERVIEW] This test has been designed to exercise the llForceMouselook LSL function.
[SETUP] To compare functionality and interoperability, run tests with llSetCameraEyeOffset 
and llSetCameraAtOffset.
[*]
[Basic Test]
[INV] ForceMouselookTestObject
[0010] With your avatar near the ForceMouselookTestObject, Left-click on it until "TRUE" 
is displayed above it, and Right-click and select "Sit Here".
[0020] Verify that the avatar will sit on the Object and Mouselook will be forced as the 
avatar sits.
[*]
[Distance test]
[0030] Right-click on the Ground and Select "Create" From the Pie Menu, Rez 2 Default 
Cubes.
[0040] Right-click on the first cube, Select "More >>" if necessary and Click 
the "Contents" Tab
[0050] Click "New Script" and Replace the Default Script with the Following.
[SCRIPT] llForceMouseLookScript
[0060] Click "Save" and close the Script and Edit Windows
[0070] Right-click on the second cube, Select "More >>" if necessary and Click 
the "Contents" Tab
[0080] Click "New Script" and Replace the Default Script with the Following.
[SCRIPT] llForceMouseLookCamAtScript
[0090] Click "Save" and close the Script and Edit Windows
[0100] Left-click on both cubes until the word "TRUE" Appears above them
[0110] Move your avatar far from the cubes (20 m or so), Right-click on the Objects and 
select "Sit Here", Repeat that for Both (Clicking "Stand Up" inbetween)
[0120] Verify that the avatar will sit on the object and mouselook will be forced as the 
avatar sits. Look for the chance that avatar enters mouselook before reaching target.
[0130] "Stand-up" from the Cubes, and Left-click on Both until you See "FALSE" above each 
cube
[0140] Right-click on the Objects and select "Sit Here" Watch your camera position on 
each, Repeat that for Both (Clicking "Stand Up" inbetween)
[0150] Verify that sitting on the second object (using the llForceMouseLookCamAtScript) 
points your camera up heigher than the first object
[0160] Clean up your work area
[*]
[NOTE] The following script will toggle llForceMouseLook between TRUE and FALSE. It will 
be contained in the ForceMouselookTestObject.
[END]
[llForceMouseLookScript]
integer bool = TRUE;
default
{
 touch_start(integer num)
 {
 llForceMouselook(bool);
 if (bool) llSetText("TRUE",<1,0,0>,1);
 else llSetText("FALSE",<1,0,0>,1);
 llSetCameraEyeOffset(<-2, 0, 1>);
 bool = !bool;
 }
}
[llForceMouseLookCamAtScript]
integer bool = TRUE;
default
{
 touch_start(integer num)
 {
 llForceMouselook(bool);
 if (bool) llSetText("TRUE",<1,0,0>,1);
 else llSetText("FALSE",<1,0,0>,1);
 llSetCameraEyeOffset(<-2, 0, 1>);
 llSetCameraAtOffset(<2, 0, 2>);
 bool = !bool;
 }
}
Category:QA Portal
Category:Quality Assurance
LlForeach

integer llForeach(array name);
 instructions;
llEndForeach;
walks through the name
Returns 0 if array name does not exist and 1 otherwise.
===Reasons against this proposal in its current incarnation===
#This proposed syntax does not fit with the style of LSL. The C# syntax for foreach would be more in place with LSL.
#The function return is nonsensical, the code shouldn't compile if the array doesn't exist. LSL is strong typed.
#Because of LSL's strongly typed bytecode, support for heterogeneous lists or arrays would be if not impossible, cumbersome.
#New bytecodes would have to be implemented for this feature not to very bytecode intensive.
LlGetChannel

This article is a feature request
Freedom of speech is a very important thing, both in real life and in second life. In second life, objects can speak. They can speak only to their owner, speak over instant message to any object or they can even llWhisper, llSay or llShout to a channel of choice.
This is where the problem starts to form: With a constantly growing number of objects containing scripts, the number of used channels is climbing fast. The chance that two objects (perhaps two copies of the same thing) use the same channel to communicate is getting bigger and bigger. If such a thing would happen, the chance of undefined behavior of objects would be very realistic. I would consider such undefined behavior to be a bug and i personally see any bug as a way for certain people to bring the grid to it's knees or do other bad things..
A way to prevent these problems is to limit the choice of channel to use, by enforcing a rule. We could allow every object free use of channels 0-9999. Channels above 9999 would then not be free to choose, but would have to be requested, so the server may ensure that the channel is not used by any other objects in the grid. The way to request such a channel for usage is to use the function llGetChannel() which returns an integer, identifying the channel.
The object that requested a channel, becomes owner of this channel and must decide which objects may or may not communicate on it. Therefor a few other functions would need to be added. Other objects could use a new function like llRequestChannelUsage(integer channel), upon which an event would be fired in the script of the channel owner. This could be perhaps a channel_request(integer channel, key id) event and the owner could then llAllowChannelUsage(integer channel, key id) or llDenyChannelUsage(integer channel, key id). The requesting object would then receive this answer through a new channel_permission(integer channel, bool allowed) event.
This is just an idea and it might still need some thinking over, but i think the idea is clear enough.
See also:
Category:Feature Requests
LlGetInventoryType Test

[LLGetInventoryTypeTest]
[VERSION] 0.1
[LENGTH] 00:15
[TESTERS] 1
[OVERVIEW] This test has been designed to exercise the LLGetInventoryType LSL function.
[SETUP] This test requires 1 Tester and rezzable land
[*]
[0010] Right-click on the ground and select "Create" from the pie menu and Rez a default 
cube
[0020] Click "more >>" if neccesary and select the contents tab
[0040] Open your Inventory and locate/copy or create one of each of the following to the 
cubes contents folder
[0050] An animation, bodypart, item of clothing, gesture, landmark, notecard, an object, a 
script, sound, a texture or image.
[0060] Also insert the following script into the cubes contents
[SCRIPT] llGetInventoryTypeTest
[0070] Close the edit window
[0080] Left-click on the cube
[0090] Verify the type of item it chats corresponds to the name and actual type of item it 
is.
[0100] Delete the cube
[END]
[llGetInventoryTypeTest]
list INVENTORY_TYPES = [
 INVENTORY_NONE,
 INVENTORY_ANIMATION,
 INVENTORY_BODYPART,
 INVENTORY_CLOTHING,
 INVENTORY_GESTURE,
 INVENTORY_LANDMARK,
 INVENTORY_NOTECARD,
 INVENTORY_OBJECT,
 INVENTORY_SCRIPT,
 INVENTORY_SOUND,
 INVENTORY_TEXTURE ];
 
list INVENTORY_DESCRIPTIONS = [
 "not a known item",
 "an animation",
 "a bodypart",
 "a clothing item",
 "a gesture",
 "a landmark",
 "a notecard",
 "an object",
 "a script",
 "a sound",
 "a texture" ];
default
{
 touch_start(integer num_detected)
 {
 integer NumItems = llGetInventoryNumber(INVENTORY_ALL);
 integer i;
 for (i = 0; i < NumItems; i++)
 {
 string Name = llGetInventoryName(INVENTORY_ALL, i);
 integer Type = llGetInventoryType(Name);
 integer TypeIndex = llListFindList(INVENTORY_TYPES, [Type]);
 if (TypeIndex == -1)
 {
 llOwnerSay("ERROR: Unknown type for item '" + Name + "'.");
 return;
 }
 string Desc = llList2String(INVENTORY_DESCRIPTIONS, TypeIndex);
 llOwnerSay("'" + Name + "' is " + Desc + "."); 
 }
 }
}
Category:QA Portal
Category:Quality Assurance
LlGetMass

==Lindograms==
"Lindograms" is the name of the primary unit of mass used in Second Life.
While Second Life primarily makes use of the , mass seems to be an exception.
Some speculate that lindograms were intended to be kilograms, but a mistake was made when factoring object density, causing the mass value returned to be 100 times less than the actual kilogram value. As a result, some new functions were implemented (such as llGetMassMKS) which report the correct kilogram weight of an object.
Functionally speaking, lindograms can be used in the same way kilograms are usedWith exception to some functions, such as llSetPhysicsMaterial, which use kilograms, not lindograms. llGetMassMKS returns a kilogram value, not a lindogram value., however only within the bounds of Second Life. Trying to export mass values from Second Life will often run into issues, caused by the use of lindograms as a base unit of measurement.
From a technical point-of-view, a lindogram is equivalent to a , however it is not treated as such.
LlGetNotecard

array llGetNotecard(string name)
gets all lines of the notecard named name or with UUID name 
and saves them into an []
If notecard name does not exist it will be created with
empty content.
----
Notecard requests are dependent on a dataserver call, which may or may not return. It is unreasonable to hault the script during this time. -- Strife Onizuka 16:23, 27 July 2007 (PDT)
: It would also require Linden Labs to create a new datatype. --   ¥    Reynard  21:19, 8 April 2011 (PDT)
: It should return them as a list, not an array, no new datatype needed. --Sharie Criss 11:14, 25 February 2012 (PST)
: This could be reached by using llGetNotecardLine along with llGetNumberOfNotecardLines --Shadow Siamendes 10:04, 5 July 2012 (PDT)
LlGetObjectPermMask Test

[LLGetObjectPermMaskTest]
[VERSION] 0.2
[LENGTH] 00:30
[TESTERS] 2
[OVERVIEW] This test has been designed to test if permissions are transferred correctly between users. It also tests the functionality of the llGetObjectPermMask LSL Function.
[SETUP] This test requires 2 users and rezzable land
[*]
[0010] User A: Create 8 simple cubes on the ground, name them "Object1" through "Object8"
[0020] User A: Set the Permissions for each as follows:
[0030] full permissions, shared with group, anyone can copy, anyone can move
[0040] full permissions
[0050] no copy
[0060] no mod
[0070] no copy, no mod
[0080] no mod, no transfer
[0090] no transfer
[0100] full permissions, locked
[0110] User A: Create then Add the script to each item. (unlock the locked box and relock 
it after)
[SCRIPT] llGetObjectPermMaskScript
[*]
[NOTE] Make sure the script is full permissions for the next user: copyable, modable, 
transferrable !!!
[*]
[0130] User A: Take a Copy of each item and give each to User B:
[0140] User A: Leave the items on the ground in a row to make it easier to test all at 
once.
[0150] User B: Accept all items from User A:
[0160] User B: Rez the items on the ground next to User A's items.
[0170] User B: Close the Edit Window if it is open.
[0180] User B: One at a time, left-click each box to touch it.
[0190] Observe the output for each. Compare the perms reported with the actual perms of 
the box.
[0200] Verify all permissions reported match up; on failures, indicate which object and 
which permissions.
[NOTE] (Base permissions are the least restrictive that the object has, owner permissions 
are what permissions the owner of the object has, group permissions are what permissions 
the group has, which should only work with shared with group, everyone permissions are 
what anyone can do, NEXT permissions are what the next owner can do.)
[END]
[llGetObjectPermMaskScript]
doPermIter(integer perm) 
{ 
if(PERM_MOVE & perm) 
llWhisper(0,"moVe: ON"); 
else 
llWhisper(0,"moVe: OFF"); 
if(PERM_MODIFY & perm) 
llWhisper(0,"Modify: ON"); 
else 
llWhisper(0,"Modify: OFF"); 
if(PERM_COPY & perm) 
llWhisper(0,"Copy: ON"); 
else 
llWhisper(0,"Copy: OFF"); 
if(PERM_TRANSFER & perm) 
llWhisper(0,"Transfer: ON"); 
else 
llWhisper(0,"Transfer: OFF"); 
if(PERM_ALL & perm) 
llWhisper(0,"PERM_ALL: ON"); 
else 
llWhisper(0,"PERM_ALL: OFF"); 
} 
default 
{ 
touch_start(integer total_number) 
{ 
llWhisper(0, "Beginning llObjectPermMark test!"); 
llWhisper(0, "Testing Base Permissions..."); 
integer theperm = llGetObjectPermMask(MASK_BASE); 
doPermIter(theperm); 
llWhisper(0, "Testing Owner Permissions..."); 
theperm = llGetObjectPermMask(MASK_OWNER); 
doPermIter(theperm); 
llWhisper(0, "Testing Group Permissions..."); 
theperm = llGetObjectPermMask(MASK_GROUP); 
doPermIter(theperm); 
llWhisper(0, "Testing Everyone Permissions..."); 
theperm = llGetObjectPermMask(MASK_EVERYONE); 
doPermIter(theperm); 
llWhisper(0, "Testing NEXT Permissions..."); 
theperm = llGetObjectPermMask(MASK_NEXT); 
doPermIter(theperm); 
} 
}
Category:QA Portal
Category:Quality Assurance
LlGetParcelFlags Test

# Create a box, add the script below to the box.
# Touch the box. It will say a lot of lines about parcel and region flags.
# Open the About Land dialog for the parcel the object is on.
# - Verify that the PARCEL_FLAG statements made by the object match those shown in the About Land window. (Will require looking at multiple tabs.)
# As a non-God or Estate Owner open the Region/Estate window (from the World menu)
# - Verify the REGION_FLAG statements match what you can find in the Region/Estate menu.
* There are some REGION_FLAGs that aren't currently showing to everyone, including direct teleport. Verify as a god or estate owner that the statements made by the box match. 
// llGetRegionFlags() and llGetParcelFlags() test lsl script
testFlag(integer flags, integer flag, string flag_name)
{
 if (flags & flag)
 {
 llOwnerSay(flag_name + " is set to TRUE");
 }
 else
 {
 llOwnerSay(flag_name + " is set to FALSE");
 } 
}
default
{
 touch_start(integer total_number)
 {
 integer rf = llGetRegionFlags();
 integer pf = llGetParcelFlags(llGetPos());
 
 llOwnerSay("Parcel flags: (" + (string)pf + ")");
 testFlag(pf,PARCEL_FLAG_ALLOW_CREATE_OBJECTS,"PARCEL_FLAG_ALLOW_CREATE_OBJECTS");
 testFlag(pf,PARCEL_FLAG_ALLOW_DAMAGE,"PARCEL_FLAG_ALLOW_DAMAGE");
 testFlag(pf,PARCEL_FLAG_ALLOW_FLY,"PARCEL_FLAG_ALLOW_FLY");
 testFlag(pf,PARCEL_FLAG_ALLOW_LANDMARK,"PARCEL_FLAG_ALLOW_LANDMARK");
 testFlag(pf,PARCEL_FLAG_ALLOW_SCRIPTS,"PARCEL_FLAG_ALLOW_SCRIPTS");
 testFlag(pf,PARCEL_FLAG_ALLOW_TERRAFORM,"PARCEL_FLAG_ALLOW_TERRAFORM");
 testFlag(pf,PARCEL_FLAG_LOCAL_SOUND_ONLY,"PARCEL_FLAG_LOCAL_SOUND_ONLY");
 testFlag(pf,PARCEL_FLAG_USE_ACCESS_GROUP,"PARCEL_FLAG_USE_ACCESS_GROUP");
 testFlag(pf,PARCEL_FLAG_USE_ACCESS_LIST,"PARCEL_FLAG_USE_ACCESS_LIST");
 testFlag(pf,PARCEL_FLAG_USE_BAN_LIST,"PARCEL_FLAG_USE_BAN_LIST");
 testFlag(pf,PARCEL_FLAG_USE_LAND_PASS_LIST,"PARCEL_FLAG_USE_LAND_PASS_LIST");
 
 llOwnerSay("Region flags: (" + (string)rf + ")");
 testFlag(rf,REGION_FLAG_ALLOW_DAMAGE,"REGION_FLAG_ALLOW_DAMAGE");
 testFlag(rf,REGION_FLAG_ALLOW_DIRECT_TELEPORT,"REGION_FLAG_ALLOW_DIRECT_TELEPORT");
 testFlag(rf,REGION_FLAG_BLOCK_FLY,"REGION_FLAG_BLOCK_FLY");
 testFlag(rf,REGION_FLAG_BLOCK_TERRAFORM,"REGION_FLAG_BLOCK_TERRAFORM");
 testFlag(rf,REGION_FLAG_DISABLE_COLLISIONS,"REGION_FLAG_DISABLE_COLLISIONS");
 testFlag(rf,REGION_FLAG_DISABLE_PHYSICS,"REGION_FLAG_DISABLE_PHYSICS");
 testFlag(rf,REGION_FLAG_FIXED_SUN,"REGION_FLAG_FIXED_SUN");
 testFlag(rf,REGION_FLAG_SANDBOX,"REGION_FLAG_SANDBOX");
 }
}
Category:QA Portal
Category:Quality Assurance
LlGetSimRating Test

[LLGetSimRating]
[VERSION] 0.1
[LENGTH] 00:10
[TESTERS] 1
[OVERVIEW] This test has been designed to exercise the Sim Rating function of llRequestSimulatorData.
[SETUP] This test requires 1 Tester and rezzable land
[*]
[0010] Right-click on the ground and select "Create" from the pie menu and rez a default 
cube
[0020] In edit, click "more >>" if necessary and select the contents tab, and copy the 
following script there
[SCRIPT] llGetSimRatingtest
[0030] Upon copying the script will chat the sim names in the "sim list" field followed by 
their rating PG, MATURE etc
[0040] Verify that this data is correct for this sim names
[0050] Feel free to edit the script to add or change the sim names and then reset the 
script to get it to rechat new ratings and reverify them.
[0060] Once complete, delete the prim
[END]
[llGetSimRatingtest]
// Replace with appropriate sim names to test
list sims = ["Da Boom","Ahern"];
list ids = [];
default
{
 state_entry()
 {
 integer i;
 integer max = llGetListLength(sims);
 for (i=0;i<max;++i)
 {
 ids += llRequestSimulatorData(llList2String(sims,i),DATA_SIM_RATING);
 } 
 }
 dataserver(key id, string data)
 {
 llSay(0, llList2String(sims,llListFindList(ids,[id])) + ": " + data);
 }
}
Category:QA Portal
Category:Quality Assurance
LlGetUnixTime Test

# Put this script on an object in world
# Touch the object
# Copy the number after 'Unix time ='
# Paste the number into the Timestamp box on http://www.4webhelp.net/us/timestamp.php
# Press 'Convert to a date'
# Verify the date shown near the top of the web page matches the date and time said by the box
# Repeat 2 - 6 a few times
default
{
 touch_start(integer total_number)
 {
 string time;
 float ft = llGetGMTclock();
 integer ut = llGetUnixTime();
 integer hours = llFloor(ft / 3600);
 integer minutes = llFloor((ft - (hours*3600)) / 60.0);
 time = (string)hours+ ":" + (string)minutes + ":" + (string)(llFloor(ft) % 60);
 llOwnerSay("This object was touched at " + llGetDate() + " " + time + ". Unix time = " + (string)ut);
 }
}
Category:QA Portal
Category:Quality Assurance
LlGiveInventory All Test

[LLInventoryAllTest]
[VERSION] 0.1
[LENGTH] 00:10
[TESTERS] 1
[OVERVIEW] This test has been designed to test the LSL function, llGetInventoryNumber with 
the flag INVENTORY_ALL. This should return the total number of items in the object 
(including the script) followed by a list of their names.
[SETUP] Tester must be in an area where building and scripting are enabled.
[*]
[INV] INVENTORY_ALL
[NOTE] INVENTORY_ALL_INVENTORYLIST
[0010] Open the object named 'INVENTORY_ALL' that just rezzed, and verify its contents 
against the list in the notecard you were just given.
[0020] Compare the output from the INVENTORY_ALL object in your chat history against the 
results from the previous step.
[0030] Right-click on the ground and select "Create" from the Pie menu and Rez a cube
[0040] Right-click on the new cube and Select "Edit", Rename the cube to a name with the 
max amount of characters, 64 is the current longest length
[0050] Close the edit window, Right-click on the cube and Select "Take"
[0060] Open you Inventory and Locate the cube you just took
[0070] Right Click and "Edit" the "INVENTORY_ALL" prim, Click "More >>" if necessary and 
Select the content tab, and drag the cube you created from your inventory to the contents 
of this prim
[0080] Edit or Replace the Script with the Following Script
[SCRIPT] Inventoryalltouchscript
[0090] Saving any changes and Closing the Script and Edit windows.
[0100] Touch the Prim and Verify that the Object List chatted matches that in the notecard 
you recieved earlier but also includes the cube with the long name, and the long name is 
displayed in full.
[0110] Right Click and "Edit" the "INVENTORY_ALL" prim, Click "More >>" if necessary and 
Select the content tab
[0120] Delete all the objects from the folder, leaving only the Script and Close the edit 
window
[0130] Touch the Prim and Verify that only one item is chatted and that is the name of the 
Script.
[0140] Clean up your workarea
[END]
[Inventoryallscript]
default
{
 state_entry()
 {
 integer i;
 integer max = llGetInventoryNumber(INVENTORY_ALL);
 llSay(0, "There are " + (string)max + " items in the inventory of this object.");
 for (i=0;i<max;++i)
 {
 llSay(0,llGetInventoryName(INVENTORY_ALL,i));
 }
 }
}
[Inventoryalltouchscript]
default
{
 touch_start(integer total_number)
 {
 integer i;
 integer max = llGetInventoryNumber(INVENTORY_ALL);
 llSay(0, "There are " + (string)max + " items in the inventory of this object.");
 for (i=0;i<max;++i)
 {
 
 llSay(0,llGetInventoryName(INVENTORY_ALL,i));
 
 }
 }
}
Category:QA Portal
Category:Quality Assurance
LlHTTPRequest Pro Tip(s)

Pro Tip!
llHTTPRequest can return null key. Means you're llHTTPRequest-ing too fast, generally. To keep it reliable, you need to do something like this: 
<lsl>
 key req;
 while(NULL_KEY == req=llHTTPRequest("http://example.com/",[],"")) {
 llOwnerSay("uh oh throttle");
 llSleep(5.0);
 
 }
</lsl>
The sleep should probably be longer, perhaps 20 seconds. Even better, defer the HTTP request for 10 or 20 seconds with a timer so your event queue can be serviced while the llHTTPRequest throttle is in effect.