<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BETLOG+Hax</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BETLOG+Hax"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/BETLOG_Hax"/>
	<updated>2026-06-26T15:45:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetObjectDetails&amp;diff=740043</id>
		<title>LlGetObjectDetails</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetObjectDetails&amp;diff=740043"/>
		<updated>2010-02-24T05:55:30Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/limits}}{{LSL_Function/uuid|id|sim=*}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func_id=332|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetObjectDetails&lt;br /&gt;
|p1_type=key|p1_name=id|p1_desc=&amp;amp;#32;or adjacent regions[[#id_Parameter|*]]&lt;br /&gt;
|p2_type=list|p2_name=params|p2_desc=OBJECT_* flags&lt;br /&gt;
|return_type=list|return_text=of the details for &#039;&#039;&#039;id&#039;&#039;&#039;, specifically those requested in &#039;&#039;&#039;params&#039;&#039;&#039;. &lt;br /&gt;
|func_footnote=An empty list if &#039;&#039;&#039;id&#039;&#039;&#039; is not found.{{PBR}}&lt;br /&gt;
{{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is returned when passed an invalid integer parameter.&lt;br /&gt;
|spec=&amp;lt;div style=&amp;quot;padding: 1px; float: left;&amp;quot;&amp;gt;[[Image:LlGetObjectdetails-avatar-range.png|thumb|none|250px|Avatar detection range for SL Server 1.34]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;h5 style=&amp;quot;margin:0;&amp;quot;&amp;gt;id Parameter&amp;lt;/h5&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;id&#039;&#039;&#039; holds the UUID of the avatar or prim this function is going to get the details of.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;&#039;id&#039;&#039;&#039; is not found in the region, adjacent regions are searched for avatars which match &#039;&#039;&#039;id&#039;&#039;&#039;. An avatar is only considered to have been found if it is inside the region, or within a 34 meter zone outside the region boundaries (see diagram). A single valid result may be returned after the avatar leaves this zone.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 style=&amp;quot;margin:0;&amp;quot;&amp;gt;params Parameter&amp;lt;/h5&amp;gt;&lt;br /&gt;
The &#039;&#039;&#039;params&#039;&#039;&#039; list is used to indicate which object attributes of interest. The order they are supplied in determines the order of the corresponding return values in the return list.&lt;br /&gt;
{{{!}} cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
{{!}}&lt;br /&gt;
*If &#039;&#039;&#039;params&#039;&#039;&#039; contains unsupported integer values, {{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is placed in the output list.&lt;br /&gt;
*If &#039;&#039;&#039;params&#039;&#039;&#039; contains non-[[integer]] types, those values will be silently ignored.&lt;br /&gt;
{{!}}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|caveats=&lt;br /&gt;
*Adjacent regions are not searched for prims which match &#039;&#039;&#039;id&#039;&#039;&#039;.&lt;br /&gt;
*Information for avatars that can no longer be found will still be available for a short period (about 45 seconds) but it is not updated.&lt;br /&gt;
*Items in &#039;&#039;&#039;params&#039;&#039;&#039; that are not integers are silently ignored, {{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is not returned.&lt;br /&gt;
*This function does not return information about items in inventory.&lt;br /&gt;
*[[llTargetOmega]] will only effect the return of [[OBJECT_ROT]] if the object is [[STATUS_PHYSICS|physical]]. If the object is not physical then the original start rotation is returned, [[llTargetOmega]] is a {{LSLGC|Effects|client side effect}}.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    collision_start(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        list a = llGetObjectDetails(llDetectedKey(0), ([OBJECT_NAME, &lt;br /&gt;
                    OBJECT_DESC, OBJECT_POS, OBJECT_ROT, OBJECT_VELOCITY,&lt;br /&gt;
                    OBJECT_OWNER, OBJECT_GROUP, OBJECT_CREATOR]));&lt;br /&gt;
        llWhisper(0,&amp;quot;UUID: &amp;quot;         + (string)llDetectedKey(0) +&lt;br /&gt;
                  &amp;quot;\nName: \&amp;quot;&amp;quot;       + llList2String(a,0) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
                  &amp;quot;\nDescription: \&amp;quot;&amp;quot; + llList2String(a,1) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
                  &amp;quot;\nPosition: &amp;quot;     + llList2String(a,2) +&lt;br /&gt;
                  &amp;quot;\nRotation: &amp;quot;     + llList2String(a,3) +&lt;br /&gt;
                  &amp;quot;\nVelocity: &amp;quot;     + llList2String(a,4) +&lt;br /&gt;
                  &amp;quot;\nOwner: &amp;quot;        + llList2String(a,5) +&lt;br /&gt;
                  &amp;quot;\nGroup: &amp;quot;        + llList2String(a,6) +&lt;br /&gt;
                  &amp;quot;\nCreator: &amp;quot;      + llList2String(a,7));&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Group join inviter&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        llInstantMessage(llDetectedKey(0),&amp;quot;Click on Join in my group profile:\n&amp;quot; +&lt;br /&gt;
            &amp;quot; secondlife:///app/group/&amp;quot; + llList2String(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0) + &amp;quot;/about &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// aim &amp;amp; shoot&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   if(change &amp;amp; pressed &amp;amp; CONTROL_ML_LBUTTON)&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT|PASSIVE|ACTIVE, 96.0, PI/16.0);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {   if(perm&amp;amp;PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
            llTakeControls(0x7FFFFFFF, TRUE, TRUE); &lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer n)&lt;br /&gt;
    {   key uuid=llDetectedKey(0);&lt;br /&gt;
        list a = llGetObjectDetails(uuid, ([&lt;br /&gt;
            OBJECT_NAME, OBJECT_DESC, OBJECT_POS, OBJECT_ROT,&lt;br /&gt;
            OBJECT_VELOCITY,OBJECT_OWNER, OBJECT_GROUP, OBJECT_CREATOR]));&lt;br /&gt;
        llOwnerSay(&amp;quot;UUID: &amp;quot; + (string)uuid +&lt;br /&gt;
            &amp;quot;\nName: \&amp;quot;&amp;quot; + llList2String(a,0)+ &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
            &amp;quot;\nDecription: \&amp;quot;&amp;quot; + llList2String(a,1) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
            &amp;quot;\nPosition: &amp;quot; + llList2String(a,2) +&lt;br /&gt;
            &amp;quot;\nRotation: &amp;quot; + llList2String(a,3) +&lt;br /&gt;
            &amp;quot;\nVelocity: &amp;quot; + llList2String(a,4) +&lt;br /&gt;
            &amp;quot;\nOwner: &amp;quot; + llList2String(a,5) +&lt;br /&gt;
            &amp;quot;\nGroup: &amp;quot; + llList2String(a,6) +&lt;br /&gt;
            &amp;quot;\nCreator: &amp;quot; + llList2String(a,7)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|spec&lt;br /&gt;
|constants={{LSL Constants/Object Details}}&lt;br /&gt;
|helpers=See {{LSLGC|Link/Get}} for some {{LSLGC|Link|link}} related helper functions. Since there is no function to get linked prim parameters, this can be useful if you need to get the position and rotation of a linked prim.&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llKey2Name]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetParcelDetails]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles={{LSL DefineRow||{{LSLGC|Detected}}}}&lt;br /&gt;
{{LSL DefineRow||[[Prim Attribute Overloading]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|history=Introduced in SL 1.18.3(2)&lt;br /&gt;
|cat1=Object&lt;br /&gt;
|cat2=Prim&lt;br /&gt;
|cat3=Avatar&lt;br /&gt;
|cat4=Owner&lt;br /&gt;
|cat5=Creator&lt;br /&gt;
|cat6=Group&lt;br /&gt;
|cat7=Link&lt;br /&gt;
|cat8&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=697452</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=697452"/>
		<updated>2010-01-05T02:34:16Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A lot of this is basically just rubbish. But it is a useful reference for various things, possibly not specifically the thing the script addresses, but often just secondary stuff.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generally I put things here to refer people to when they ask (again).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although a lot of it is here simply to reinforce in peoples minds that when I write something for them, and add an attribution license, that I expect them to comply with it, and that by making it public here it means that not only can others benefit, but that others know who actually wrote it, and often for whom, and why.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes its just here because i&#039;ve seen something else inworld that was so bad i felt i needed to contribute something less insane.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
But like almost everything i write; when i re-read it months later theres almost always some glaring oversight, or completely trash/facepalm/&#039;ZOMG WTF was i thinking?&#039; elements in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Days_Since&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Send_home_and_ban_avs_less_than_description_field_days_old&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Animation_triggered_sound_loop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Rotation_that_points_from_A_to_B&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/DoorHax&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Tool-Texture_cube_hollow_face&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Tool-Texture_cube_hollow_face&amp;diff=697442</id>
		<title>Tool-Texture cube hollow face</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Tool-Texture_cube_hollow_face&amp;diff=697442"/>
		<updated>2010-01-05T02:33:18Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====Tool-Texture cube hollow face v0.1.0==== --BETLOG Hax GMT+10: 20090210 0222 [SLT:  20090209 0922]  A tool for adjusting texture repeats for...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Tool-Texture cube hollow face v0.1.0====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] GMT+10: 20090210 0222 [SLT:  20090209 0922]&lt;br /&gt;
&lt;br /&gt;
A tool for adjusting texture repeats for inside (hollow) face of cubes.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I made some attempt to accommodate other prim types, but never actually finished it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
f_setHollowX(float Xrepeats)&lt;br /&gt;
{   list data = llGetPrimitiveParams([PRIM_TYPE]);&lt;br /&gt;
    vector cut = llList2Vector(data, 2);&lt;br /&gt;
    float hollow = llList2Float(data, 3);&lt;br /&gt;
    if (hollow == 0.0)&lt;br /&gt;
    {   llOwnerSay(&amp;quot;ERROR: not hollow.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llList2Integer(data, 0) != PRIM_TYPE_BOX)&lt;br /&gt;
    {   llOwnerSay(&amp;quot;WARNING: not a box. This is completely UNTESTED&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    integer face = 5;&lt;br /&gt;
    if (cut.y - cut.x &amp;lt;= 0.75)  face = 4;&lt;br /&gt;
    if (cut.y - cut.x &amp;lt;= 0.5)   face = 3;&lt;br /&gt;
    if (cut.y - cut.x &amp;lt;= 0.25)  face = 2;&lt;br /&gt;
//llOwnerSay((string)cut+&amp;quot;\t&amp;quot;+(string)face);        &lt;br /&gt;
    float rpt = Xrepeats/-hollow;&lt;br /&gt;
    float ofs = (((Xrepeats/-hollow)+Xrepeats) / 2.0)+(Xrepeats/2.0/Xrepeats);&lt;br /&gt;
    if ((ofs &amp;gt; 1.0) ||  (ofs &amp;lt; -1.0))&lt;br /&gt;
        ofs -= (float)llFloor(ofs);&lt;br /&gt;
    vector o = llGetTextureOffset(face);&lt;br /&gt;
    vector r = llGetTextureScale(face);    &lt;br /&gt;
    llSetPrimitiveParams([PRIM_TEXTURE, face&lt;br /&gt;
        , llGetTexture(face)&lt;br /&gt;
        , &amp;lt;rpt, r.y, 0.0&amp;gt;//repeats&lt;br /&gt;
        , &amp;lt;ofs, o.y, 0.0&amp;gt;//offsets&lt;br /&gt;
        , 0*DEG_TO_RAD&lt;br /&gt;
    ]);    &lt;br /&gt;
}&lt;br /&gt;
//======================================================================================&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer start_param)&lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   llOwnerSay(&lt;br /&gt;
            &amp;quot;\n Type number of X texture repeats for the hollow face of a cube.&amp;quot;&lt;br /&gt;
            +&amp;quot;\n Type &#039;done&#039; to delete script and finish.&amp;quot;);&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {   if ((float)message != 0.0)&lt;br /&gt;
        {   f_setHollowX((float)message);&lt;br /&gt;
        }&lt;br /&gt;
        if (llToLower(message) == &amp;quot;done&amp;quot;)&lt;br /&gt;
        {   llOwnerSay(&amp;quot;OK, removing script.&amp;quot;);&lt;br /&gt;
            llRemoveInventory(llGetScriptName());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=650532</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=650532"/>
		<updated>2009-11-10T11:33:42Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A lot of this is basically just rubbish. But it is a useful reference for various things, possibly not specifically the thing the script addresses, but often just secondary stuff.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generally I put things here to refer people to when they ask (again).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although a lot of it is here simply to reinforce in peoples minds that when I write something for them, and add an attribution license, that I expect them to comply with it, and that by making it public here it means that not only can others benefit, but that others know who actually wrote it, and often for whom, and why.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes its just here because i&#039;ve seen something else inworld that was so bad i felt i needed to contribute something less insane.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
But like almost everything i write; when i re-read it months later theres almost always some glaring oversight, or completely trash/facepalm/&#039;ZOMG WTF was i thinking?&#039; elements in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Days_Since&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Send_home_and_ban_avs_less_than_description_field_days_old&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Animation_triggered_sound_loop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Rotation_that_points_from_A_to_B&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/DoorHax&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=DoorHax&amp;diff=650522</id>
		<title>DoorHax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=DoorHax&amp;diff=650522"/>
		<updated>2009-11-10T11:24:33Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====DoorHax v0.1.0====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091110 2120 [SLT: 20091110 0420]&lt;br /&gt;
&lt;br /&gt;
A smooth swinging door.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It seemed to work. Almost completely untested.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091110 2001 [SLT: 20091110 0301]&lt;br /&gt;
// For Gutterblood Spoonhammer&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//          https://wiki.secondlife.com/wiki/DoorHax&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
float       gShutAngle      = 0.0;&lt;br /&gt;
float       gShutTau        = 3.0;&lt;br /&gt;
//&lt;br /&gt;
float       gOpenAngle      = 90.0;&lt;br /&gt;
float       gOpenTau        = 0.75;&lt;br /&gt;
//&lt;br /&gt;
string      gSndOpening     = &amp;quot;cb340647-9680-dd5e-49c0-86edfa01b3ac&amp;quot;;&lt;br /&gt;
float       gVolOpening     = 1.0;&lt;br /&gt;
string      gSndOpened      = &amp;quot;2ffd48fb-293c-d8c8-f2c5-c0ca76126baa&amp;quot;;&lt;br /&gt;
float       gVolOpened      = 1.0;&lt;br /&gt;
&lt;br /&gt;
string      gSndClosing     = &amp;quot;e7ff1054-003d-d134-66be-207573f2b535&amp;quot;;&lt;br /&gt;
float       gVolClosing     = 1.0;&lt;br /&gt;
string      gSndClosed      = &amp;quot;31b0c4db-e126-47c5-ac1c-60edb1c0103a&amp;quot;;&lt;br /&gt;
float       gVolClosed      = 1.0;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
integer     gOpen;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
f_toggle()&lt;br /&gt;
{   float f;&lt;br /&gt;
    llResetTime();&lt;br /&gt;
    if(gOpen)&lt;br /&gt;
    {   llTriggerSound(gSndOpening, gVolOpening);//opening&lt;br /&gt;
        do{ f=gShutAngle+(llGetTime()/gOpenTau*llFabs(gShutAngle-gOpenAngle));&lt;br /&gt;
//llSetText((string)f, &amp;lt;.0, 1.0, .0&amp;gt;, 1.0);&lt;br /&gt;
            llRotLookAt(llEuler2Rot(&amp;lt;0.0, 0.0, f&amp;gt;*DEG_TO_RAD),0.05,0.05);&lt;br /&gt;
        }while(f&amp;lt;=gOpenAngle);&lt;br /&gt;
        llTriggerSound(gSndOpened,gVolOpened);//opening end&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {   llTriggerSound(gSndClosing, gVolClosing);//closing&lt;br /&gt;
        do{ f=gOpenAngle-(llGetTime()/gShutTau*llFabs(gShutAngle-gOpenAngle));&lt;br /&gt;
//llSetText((string)f, &amp;lt;1.0, .0, .0&amp;gt;, 1.0);        &lt;br /&gt;
            llRotLookAt(llEuler2Rot(&amp;lt;0.0, 0.0, f&amp;gt;*DEG_TO_RAD),0.05,0.05);&lt;br /&gt;
        }while(f&amp;gt;=gShutAngle);&lt;br /&gt;
        llTriggerSound(gSndClosed, gVolClosed);//closing end&lt;br /&gt;
    }&lt;br /&gt;
//llOwnerSay((string)llGetTime());&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   llSetText(&amp;quot;&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {   gOpen=!gOpen;&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=DoorHax&amp;diff=650512</id>
		<title>DoorHax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=DoorHax&amp;diff=650512"/>
		<updated>2009-11-10T11:23:55Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====DoorHax v0.1.0==== --BETLOG Hax UTC+10: 20091110 2120 [SLT: 20091110 0420]  A smooth swinging door. &amp;lt;br&amp;gt; It seemed to work. Almost complete...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====DoorHax v0.1.0====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091110 2120 [SLT: 20091110 0420]&lt;br /&gt;
&lt;br /&gt;
A smooth swinging door.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
It seemed to work. Almost completely untested.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091110 2001 [SLT: 20091110 0301]&lt;br /&gt;
// For Gutterblood Spoonhammer&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
float       gShutAngle      = 0.0;&lt;br /&gt;
float       gShutTau        = 3.0;&lt;br /&gt;
//&lt;br /&gt;
float       gOpenAngle      = 90.0;&lt;br /&gt;
float       gOpenTau        = 0.75;&lt;br /&gt;
//&lt;br /&gt;
string      gSndOpening     = &amp;quot;cb340647-9680-dd5e-49c0-86edfa01b3ac&amp;quot;;&lt;br /&gt;
float       gVolOpening     = 1.0;&lt;br /&gt;
string      gSndOpened      = &amp;quot;2ffd48fb-293c-d8c8-f2c5-c0ca76126baa&amp;quot;;&lt;br /&gt;
float       gVolOpened      = 1.0;&lt;br /&gt;
&lt;br /&gt;
string      gSndClosing     = &amp;quot;e7ff1054-003d-d134-66be-207573f2b535&amp;quot;;&lt;br /&gt;
float       gVolClosing     = 1.0;&lt;br /&gt;
string      gSndClosed      = &amp;quot;31b0c4db-e126-47c5-ac1c-60edb1c0103a&amp;quot;;&lt;br /&gt;
float       gVolClosed      = 1.0;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
integer     gOpen;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
f_toggle()&lt;br /&gt;
{   float f;&lt;br /&gt;
    llResetTime();&lt;br /&gt;
    if(gOpen)&lt;br /&gt;
    {   llTriggerSound(gSndOpening, gVolOpening);//opening&lt;br /&gt;
        do{ f=gShutAngle+(llGetTime()/gOpenTau*llFabs(gShutAngle-gOpenAngle));&lt;br /&gt;
//llSetText((string)f, &amp;lt;.0, 1.0, .0&amp;gt;, 1.0);&lt;br /&gt;
            llRotLookAt(llEuler2Rot(&amp;lt;0.0, 0.0, f&amp;gt;*DEG_TO_RAD),0.05,0.05);&lt;br /&gt;
        }while(f&amp;lt;=gOpenAngle);&lt;br /&gt;
        llTriggerSound(gSndOpened,gVolOpened);//opening end&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {   llTriggerSound(gSndClosing, gVolClosing);//closing&lt;br /&gt;
        do{ f=gOpenAngle-(llGetTime()/gShutTau*llFabs(gShutAngle-gOpenAngle));&lt;br /&gt;
//llSetText((string)f, &amp;lt;1.0, .0, .0&amp;gt;, 1.0);        &lt;br /&gt;
            llRotLookAt(llEuler2Rot(&amp;lt;0.0, 0.0, f&amp;gt;*DEG_TO_RAD),0.05,0.05);&lt;br /&gt;
        }while(f&amp;gt;=gShutAngle);&lt;br /&gt;
        llTriggerSound(gSndClosed, gVolClosed);//closing end&lt;br /&gt;
    }&lt;br /&gt;
//llOwnerSay((string)llGetTime());&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   llSetText(&amp;quot;&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {   gOpen=!gOpen;&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=649263</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=649263"/>
		<updated>2009-11-08T09:49:48Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A lot of this is basically just rubbish. But it is a useful reference for various things, possibly not specifically the thing the script addresses, but often just secondary stuff.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generally I put things here to refer people to when they ask (again).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although a lot of it is here simply to reinforce in peoples minds that when I write something for them, and add an attribution license, that I expect them to comply with it, and that by making it public here it means that not only can others benefit, but that others know who actually wrote it, and often for whom, and why.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes its just here because i&#039;ve seen something else inworld that was so bad i felt i needed to contribute something less insane.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
But like almost everything i write; when i re-read it months later theres almost always some glaring oversight, or completely trash/facepalm/&#039;ZOMG WTF was i thinking?&#039; elements in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Days_Since&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Send_home_and_ban_avs_less_than_description_field_days_old&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Animation_triggered_sound_loop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Rotation_that_points_from_A_to_B&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Rotation_that_points_from_A_to_B&amp;diff=649253</id>
		<title>Rotation that points from A to B</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Rotation_that_points_from_A_to_B&amp;diff=649253"/>
		<updated>2009-11-08T09:49:05Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====f_rotDir()==== --BETLOG Hax UTC+10: 20091108 1939 [SLT: 20091108 0239]  You are at vector A and you want to know what rotation (quaternion)...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====f_rotDir()====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091108 1939 [SLT: 20091108 0239]&lt;br /&gt;
&lt;br /&gt;
You are at vector A and you want to know what rotation (quaternion) will intercept vector B.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Yes it&#039;s trivial, but after asking numerous very mathematically intelligent persons, and having them invariably misunderstand what I meant/wanted I feel the need to post it here.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Almost instant understanding and elegant answer courtesy of Nomad Padar. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Dude, I say this a lot, but you are seriously awesome.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The code below is merely a test/example harness for something I cannot post here and would only confuse the solution anyway. So yes, it may appear a little redundant. If you are one of the few people who is pleased to learn how this works by finding this example please comment.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
vector      gTarget;&lt;br /&gt;
rotation    gAngle;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
rotation f_rotDir(vector localAxisToPointWith, vector target, vector origin)&lt;br /&gt;
{   return llRotBetween(localAxisToPointWith*ZERO_ROTATION, target-origin);&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   llSensor(&amp;quot;B&amp;quot;, &amp;quot;&amp;quot;, AGENT|PASSIVE|SCRIPTED, 3.0, PI);&lt;br /&gt;
//        llStopLookAt();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {   if(llDetectedKey(0)==llGetOwner())&lt;br /&gt;
        {   llSensor(&amp;quot;B&amp;quot;, &amp;quot;&amp;quot;, AGENT|PASSIVE|SCRIPTED, 3.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer num)&lt;br /&gt;
    {   vector p=llGetPos();&lt;br /&gt;
        gTarget=llDetectedPos(0);&lt;br /&gt;
//        gAngle=llRotBetween(&amp;lt;1.0, 0.0, 0.0&amp;gt;* &amp;lt;0,0,0,1&amp;gt;, gTarget-p);&lt;br /&gt;
        gAngle=f_rotDir(&amp;lt;1.0, 0.0, 0.0&amp;gt;, gTarget, p);&lt;br /&gt;
        llRotLookAt(gAngle, 0.1, 0.1);&lt;br /&gt;
/*&lt;br /&gt;
llSetText(&amp;quot;&amp;quot;&lt;br /&gt;
    +&amp;quot;\n gAngle: &amp;quot;+(string)gAngle&lt;br /&gt;
    +&amp;quot;\n SHOULD equal:&amp;quot;&lt;br /&gt;
    +&amp;quot;\n llGetRot : &amp;quot;+(string)llGetRot()&lt;br /&gt;
, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
*/&lt;br /&gt;
    }&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    {   llOwnerSay(&amp;quot;B not found!&amp;quot;);&lt;br /&gt;
        llSetText(&amp;quot;B not found!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=586933</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=586933"/>
		<updated>2009-10-11T07:00:45Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A lot of this is basically just rubbish. But it is a useful reference for various things, possibly not specifically the thing the script addresses, but often just secondary stuff.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generally I put things here to refer people to when they ask (again).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although a lot of it is here simply to reinforce in peoples minds that when I write something for them, and add an attribution license, that I expect them to comply with it, and that by making it public here it means that not only can others benefit, but that others know who actually wrote it, and often for whom, and why.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes its just here because i&#039;ve seen something else inworld that was so bad i felt i needed to contribute something less insane.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
But like almost everything i write; when i re-read it months later theres almost always some glaring oversight, or completely trash/facepalm/&#039;ZOMG WTF was i thinking?&#039; elements in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Days_Since&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Send_home_and_ban_avs_less_than_description_field_days_old&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Animation_triggered_sound_loop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Animation_triggered_sound_loop&amp;diff=586923</id>
		<title>Animation triggered sound loop</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Animation_triggered_sound_loop&amp;diff=586923"/>
		<updated>2009-10-11T06:52:07Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Animation triggered sound loop====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091011 1615 [SLT: 20091010 2315]&lt;br /&gt;
&lt;br /&gt;
You want a specific animation (thats already handled by your AO) to play a special sound.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script does the sound bit. (LOOPS the sound FOR AS LONG AS you play the animation)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091011 1601 [SLT: 20091010 2301]&lt;br /&gt;
// For Eln Alter&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
//        -Exception for Eln ALter to protect the commercial viability of his animations&#039; UUID&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//        https://wiki.secondlife.com/wiki/Animation_triggered_sound_loop&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//==============================================================&lt;br /&gt;
string      gAnimUUID       = &amp;quot;&amp;quot;;//***THIS HAS TO BE INSERTED BY YOU***&lt;br /&gt;
string      gSound          = &amp;quot;&amp;quot;;//having a sound in contents will override&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer     gAnimState;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle(integer on)&lt;br /&gt;
{   if(on)&lt;br /&gt;
    {   string n = llGetInventoryName(INVENTORY_SOUND,0);&lt;br /&gt;
        if(n!=&amp;quot;&amp;quot;)&lt;br /&gt;
            gSound=n;&lt;br /&gt;
        if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llLoopSound(gSound,1.0);&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;ERROR: No sound defined in script and none in object contents.&lt;br /&gt;
                Without one or the other I cant work.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        llStopSound();&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_perms() //make it still operate when entering no script areas&lt;br /&gt;
{   if(llGetAttached())&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   if(llGetAttached())//DEV&lt;br /&gt;
            f_perms();&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;You must be wearing me for this to operate.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id) &lt;br /&gt;
    {   f_perms();&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm) &lt;br /&gt;
    {   if(perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
        {   f_toggle(gAnimState=FALSE);&lt;br /&gt;
            llSetTimerEvent(0.444444);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   //make it still operate when entering no script areas&lt;br /&gt;
    }&lt;br /&gt;
    timer() &lt;br /&gt;
    {   if(-1&amp;lt;llListFindList(llGetAnimationList(llGetOwner()), [(key)gAnimUUID]))&lt;br /&gt;
        {   if(!gAnimState)&lt;br /&gt;
                f_toggle(gAnimState=TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if(gAnimState)&lt;br /&gt;
            f_toggle(gAnimState=FALSE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Animation triggered sound NOloop====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091011 1615 [SLT: 20091010 2315]&lt;br /&gt;
&lt;br /&gt;
You want a specific animation (thats already handled by your AO) to play a special sound.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This script does the sound bit. (Plays the sound ONCE each time you start the animation)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091011 1601 [SLT: 20091010 2301]&lt;br /&gt;
// For Eln Alter&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
//        -Exception for Eln ALter to protect the commercial viability of his animations&#039; UUID&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//          https://wiki.secondlife.com/wiki/Animation_triggered_sound_loop&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//==============================================================&lt;br /&gt;
string      gAnimUUID       = &amp;quot;&amp;quot;;//***THIS HAS TO BE INSERTED BY YOU***&lt;br /&gt;
string      gSound          = &amp;quot;&amp;quot;;//having a sound in contents will override&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer     gAnimState;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_perms() //make it still operate when entering no script areas&lt;br /&gt;
{   if(llGetAttached())&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   if(llGetAttached())//DEV&lt;br /&gt;
            f_perms();&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;You must be wearing me for this to operate.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id) &lt;br /&gt;
    {   f_perms();&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm) &lt;br /&gt;
    {   if(perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
            llSetTimerEvent(0.444444);&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   //make it still operate when entering no script areas&lt;br /&gt;
    }&lt;br /&gt;
    timer() &lt;br /&gt;
    {   if(-1&amp;lt;llListFindList(llGetAnimationList(llGetOwner()), [(key)gAnimUUID]))&lt;br /&gt;
        {   if(!gAnimState)&lt;br /&gt;
            {   string n = llGetInventoryName(INVENTORY_SOUND,0);//not ideal-meh&lt;br /&gt;
                if(n!=&amp;quot;&amp;quot;)&lt;br /&gt;
                    gSound=n;&lt;br /&gt;
                if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
                {   gAnimState=TRUE;&lt;br /&gt;
                    llPlaySound(gSound,1.0);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                    llOwnerSay(&amp;quot;ERROR: No sound defined in script and none in object contents.&lt;br /&gt;
                        Without one or the other I cant work.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if(gAnimState)&lt;br /&gt;
            gAnimState=FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Animation_triggered_sound_loop&amp;diff=586913</id>
		<title>Animation triggered sound loop</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Animation_triggered_sound_loop&amp;diff=586913"/>
		<updated>2009-10-11T06:20:05Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Animation triggered sound loop====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091011 1615 [SLT: 20091010 2315]&lt;br /&gt;
&lt;br /&gt;
You want a specific animation (thats already handled by your AO) to play a special sound.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This script does the sound bit.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091011 1601 [SLT: 20091010 2301]&lt;br /&gt;
// For Eln Alter&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
//        -Exception for Eln ALter to protect the commercial viability of his animations&#039; UUID&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//        https://wiki.secondlife.com/wiki/Animation_triggered_sound_loop&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//==============================================================&lt;br /&gt;
string      gAnimUUID       = &amp;quot;&amp;quot;;//***THIS HAS TO BE INSERTED BY YOU***&lt;br /&gt;
string      gSound          = &amp;quot;&amp;quot;;//having a sound in contents will override&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer     gAnimState;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle(integer on)&lt;br /&gt;
{   if(on)&lt;br /&gt;
    {   string n = llGetInventoryName(INVENTORY_SOUND,0);&lt;br /&gt;
        if(n!=&amp;quot;&amp;quot;)&lt;br /&gt;
            gSound=n;&lt;br /&gt;
        if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llLoopSound(gSound,1.0);&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;ERROR: No sound defined in script and none in object contents.&lt;br /&gt;
                Without one or the other I cant work.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        llStopSound();&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_perms() //make it still operate when entering no script areas&lt;br /&gt;
{   if(llGetAttached())&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   if(llGetAttached())//DEV&lt;br /&gt;
            f_perms();&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;You must be wearing me for this to operate.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id) &lt;br /&gt;
    {   f_perms();&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm) &lt;br /&gt;
    {   if(perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
        {   f_toggle(gAnimState=FALSE);&lt;br /&gt;
            llSetTimerEvent(0.444444);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   //make it still operate when entering no script areas&lt;br /&gt;
    }&lt;br /&gt;
    timer() &lt;br /&gt;
    {   if(-1&amp;lt;llListFindList(llGetAnimationList(llGetOwner()), [(key)gAnimUUID]))&lt;br /&gt;
        {   if(!gAnimState)&lt;br /&gt;
                f_toggle(gAnimState=TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if(gAnimState)&lt;br /&gt;
            f_toggle(gAnimState=FALSE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Animation_triggered_sound_loop&amp;diff=586903</id>
		<title>Animation triggered sound loop</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Animation_triggered_sound_loop&amp;diff=586903"/>
		<updated>2009-10-11T06:18:22Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Animation triggered sound loop====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091011 1615 [SLT: 20091010 2315]&lt;br /&gt;
&lt;br /&gt;
You want a specific animation (thats already handled by your AO) to play a special sound.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This script does the sound bit.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091011 1601 [SLT: 20091010 2301]&lt;br /&gt;
// For Eln Alter&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//        https://wiki.secondlife.com/wiki/Animation_triggered_sound_loop&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//==============================================================&lt;br /&gt;
string      gAnimUUID       = &amp;quot;&amp;quot;;//***THIS HAS TO BE INSERTED BY YOU***&lt;br /&gt;
string      gSound          = &amp;quot;&amp;quot;;//having a sound in contents will override&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer     gAnimState;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle(integer on)&lt;br /&gt;
{   if(on)&lt;br /&gt;
    {   string n = llGetInventoryName(INVENTORY_SOUND,0);&lt;br /&gt;
        if(n!=&amp;quot;&amp;quot;)&lt;br /&gt;
            gSound=n;&lt;br /&gt;
        if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llLoopSound(gSound,1.0);&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;ERROR: No sound defined in script and none in object contents.&lt;br /&gt;
                Without one or the other I cant work.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        llStopSound();&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_perms() //make it still operate when entering no script areas&lt;br /&gt;
{   if(llGetAttached())&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   if(llGetAttached())//DEV&lt;br /&gt;
            f_perms();&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;You must be wearing me for this to operate.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id) &lt;br /&gt;
    {   f_perms();&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm) &lt;br /&gt;
    {   if(perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
        {   f_toggle(gAnimState=FALSE);&lt;br /&gt;
            llSetTimerEvent(0.444444);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   //make it still operate when entering no script areas&lt;br /&gt;
    }&lt;br /&gt;
    timer() &lt;br /&gt;
    {   if(-1&amp;lt;llListFindList(llGetAnimationList(llGetOwner()), [(key)gAnimUUID]))&lt;br /&gt;
        {   if(!gAnimState)&lt;br /&gt;
                f_toggle(gAnimState=TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if(gAnimState)&lt;br /&gt;
            f_toggle(gAnimState=FALSE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Animation_triggered_sound_loop&amp;diff=586893</id>
		<title>Animation triggered sound loop</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Animation_triggered_sound_loop&amp;diff=586893"/>
		<updated>2009-10-11T06:18:01Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====Animation triggered sound loop==== --BETLOG Hax UTC+10: 20091011 1615 [SLT: 20091010 2315]  You want a specific animation (thats already ha...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Animation triggered sound loop====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091011 1615 [SLT: 20091010 2315]&lt;br /&gt;
&lt;br /&gt;
You want a specific animation (thats already handled by your AO) to play a special sound.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This script does the sound bit.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091011 1601 [SLT: 20091010 2301]&lt;br /&gt;
// For Eln Alter&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//        https://wiki.secondlife.com/wiki/Typing_linkset_alpha_toggle&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//==============================================================&lt;br /&gt;
string      gAnimUUID       = &amp;quot;&amp;quot;;//***THIS HAS TO BE INSERTED BY YOU***&lt;br /&gt;
string      gSound          = &amp;quot;&amp;quot;;//having a sound in contents will override&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer     gAnimState;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle(integer on)&lt;br /&gt;
{   if(on)&lt;br /&gt;
    {   string n = llGetInventoryName(INVENTORY_SOUND,0);&lt;br /&gt;
        if(n!=&amp;quot;&amp;quot;)&lt;br /&gt;
            gSound=n;&lt;br /&gt;
        if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llLoopSound(gSound,1.0);&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;ERROR: No sound defined in script and none in object contents.&lt;br /&gt;
                Without one or the other I cant work.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        llStopSound();&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_perms() //make it still operate when entering no script areas&lt;br /&gt;
{   if(llGetAttached())&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   if(llGetAttached())//DEV&lt;br /&gt;
            f_perms();&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;You must be wearing me for this to operate.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id) &lt;br /&gt;
    {   f_perms();&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm) &lt;br /&gt;
    {   if(perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
        {   f_toggle(gAnimState=FALSE);&lt;br /&gt;
            llSetTimerEvent(0.444444);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   //make it still operate when entering no script areas&lt;br /&gt;
    }&lt;br /&gt;
    timer() &lt;br /&gt;
    {   if(-1&amp;lt;llListFindList(llGetAnimationList(llGetOwner()), [(key)gAnimUUID]))&lt;br /&gt;
        {   if(!gAnimState)&lt;br /&gt;
                f_toggle(gAnimState=TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if(gAnimState)&lt;br /&gt;
            f_toggle(gAnimState=FALSE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=No_Limit_Teleporter&amp;diff=504383</id>
		<title>No Limit Teleporter</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=No_Limit_Teleporter&amp;diff=504383"/>
		<updated>2009-10-04T19:02:28Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Simple Teleporter - No Limitation&#039;&#039;&#039;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Zero - Lag&amp;lt;br&amp;gt;&lt;br /&gt;
You can do anything, change the code and all more...&lt;br /&gt;
To use:&amp;lt;br&amp;gt;&lt;br /&gt;
[+] Set stapos (end of script) to the object position (where to back when the destination is reach).&amp;lt;br&amp;gt;&lt;br /&gt;
[+] Set dest (end of script) to the object destination.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Leave that here&lt;br /&gt;
//Script created by Morgam Biedermann&lt;br /&gt;
vector posnow;&lt;br /&gt;
vector stapos;&lt;br /&gt;
rotation rotnow;&lt;br /&gt;
teleport(vector dest)&lt;br /&gt;
{&lt;br /&gt;
    if(llGetPos() != dest)&lt;br /&gt;
    {&lt;br /&gt;
        llSetPos(dest);&lt;br /&gt;
        teleport(dest);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llUnSit(llAvatarOnSitTarget());&lt;br /&gt;
        teleports(stapos);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
teleports(vector dest)&lt;br /&gt;
{&lt;br /&gt;
    if(llGetPos() != stapos)&lt;br /&gt;
    {&lt;br /&gt;
        llSetPos(stapos);&lt;br /&gt;
        teleports(stapos);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        stapos = &amp;lt;141,19,30&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer vez)&lt;br /&gt;
    {&lt;br /&gt;
        if(llDetectedKey(0) == llGetOwner())&lt;br /&gt;
        teleport(&amp;lt;141,19,505&amp;gt;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
The above example is a really bad approach to use for many reasons. Not least of which is that lag is precisely what it *will* generate.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An equivalency check that respects SLs somewhat wiggly precision system, and isn&#039;t trying to match a movement to EXACTLY 6 decimal places of precision is needed.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
if(llGetPos() != dest)&lt;br /&gt;
//is bad&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
if(llVecDist(llGetPos(),dest)&amp;lt;0.001)&lt;br /&gt;
//is MUCH better&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
ie:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
teleports(vector dest)&lt;br /&gt;
{&lt;br /&gt;
//    if(llGetPos() != stapos) &lt;br /&gt;
// This an inherently bad approach; given 6 decimal places on 3 floats in a vector its &lt;br /&gt;
// very UNlikely the equivalency will be precisely equal even if its VERY close, this &lt;br /&gt;
// will become especially evident at high altitude. It&#039;ll look  like its stopped, &lt;br /&gt;
// but the llSetPos() will be still thrashing away. Possibly for quite some time/forever.&lt;br /&gt;
//&lt;br /&gt;
// the below will stop in a timely manner.&lt;br /&gt;
    if(llVecDist(llGetPos(),dest) &amp;lt;= 0.001)&lt;br /&gt;
    {   llSetPos(dest); //corrected variable&lt;br /&gt;
        teleports(dest); //corrected variable&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
And a system that has a user function call itself from within itself is probably not good.&lt;br /&gt;
This is MUCH Better. [MUST be compiled in MONO]&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
teleports(vector dest)&lt;br /&gt;
{   list l=[PRIM_POSITION,dest];&lt;br /&gt;
    l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;&lt;br /&gt;
    llSetPrimitiveParams(l);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=No_Limit_Teleporter&amp;diff=504373</id>
		<title>No Limit Teleporter</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=No_Limit_Teleporter&amp;diff=504373"/>
		<updated>2009-10-04T19:01:37Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Simple Teleporter - No Limitation&#039;&#039;&#039;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Zero - Lag&amp;lt;br&amp;gt;&lt;br /&gt;
You can do anything, change the code and all more...&lt;br /&gt;
To use:&amp;lt;br&amp;gt;&lt;br /&gt;
[+] Set stapos (end of script) to the object position (where to back when the destination is reach).&amp;lt;br&amp;gt;&lt;br /&gt;
[+] Set dest (end of script) to the object destination.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Leave that here&lt;br /&gt;
//Script created by Morgam Biedermann&lt;br /&gt;
vector posnow;&lt;br /&gt;
vector stapos;&lt;br /&gt;
rotation rotnow;&lt;br /&gt;
teleport(vector dest)&lt;br /&gt;
{&lt;br /&gt;
    if(llGetPos() != dest)&lt;br /&gt;
    {&lt;br /&gt;
        llSetPos(dest);&lt;br /&gt;
        teleport(dest);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llUnSit(llAvatarOnSitTarget());&lt;br /&gt;
        teleports(stapos);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
teleports(vector dest)&lt;br /&gt;
{&lt;br /&gt;
    if(llGetPos() != stapos)&lt;br /&gt;
    {&lt;br /&gt;
        llSetPos(stapos);&lt;br /&gt;
        teleports(stapos);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        stapos = &amp;lt;141,19,30&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer vez)&lt;br /&gt;
    {&lt;br /&gt;
        if(llDetectedKey(0) == llGetOwner())&lt;br /&gt;
        teleport(&amp;lt;141,19,505&amp;gt;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
The above example is a really bad approach to use for many reasons. Not least of which is that lag is precisely what it *will* generate.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
An equivalency check that respects SLs somewhat wiggly precision system, and isn&#039;t trying to match a movement to EXACTLY 6 decimal places of precision is needed.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
if(llGetPos() != dest)&lt;br /&gt;
//is bad&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
if(llVecDist(llGetPos(),dest)&amp;lt;0.001)&lt;br /&gt;
//is MUCH better&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
ie:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
teleports(vector dest)&lt;br /&gt;
{&lt;br /&gt;
//    if(llGetPos() != stapos) &lt;br /&gt;
// This an inherently bad approach; given 6 decimal places on 3 floats in a vector its &lt;br /&gt;
// very UNlikely the equivalency will be precisely equal even if its VERY close, this &lt;br /&gt;
// will become especially evident at high altitude. It&#039;ll look  like its stopped, &lt;br /&gt;
// but the llSetPos() will be still thrashing away. Possibly for quite some time/forever.&lt;br /&gt;
//&lt;br /&gt;
// the below will stop in a timely manner.&lt;br /&gt;
    if(llVecDist(llGetPos(),dest) &amp;lt;= 0.001)&lt;br /&gt;
    {   llSetPos(dest); //corrected variable&lt;br /&gt;
        teleports(dest); //corrected variable&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
And a system that has a user function call itself from within itself is probably not good.&lt;br /&gt;
This is MUCH Better. [MUST be compiled in MONO]&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
teleports(vector dest)&lt;br /&gt;
{   list l=[PRIM_POSITION,dest];&lt;br /&gt;
    l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;l+=l;&lt;br /&gt;
    llSetPrimitiveParams(l);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Greeting_Card&amp;diff=504212</id>
		<title>Greeting Card</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Greeting_Card&amp;diff=504212"/>
		<updated>2009-10-04T10:27:41Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Greeting Card====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091004 0012 [SLT: 20091003 0712]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The prims are dimpled, root 0.0-0.5 and child 0.5-1.0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The child prim is cut 0.375-0.875&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Texture repeats are adjusted accordingly&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You&#039;ll figure out which way to orient the prims when you link and touch it.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091003 2019 [SLT: 20091003 0319]&lt;br /&gt;
// For eKitten Magic&lt;br /&gt;
//==============================================================&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//          https://wiki.secondlife.com/wiki/Greeting_Card&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
string          gSound          = &amp;quot;&amp;quot;;//optional, one in contents will work too&lt;br /&gt;
float           gVolume         = 1.0;&lt;br /&gt;
//&lt;br /&gt;
string          gAnim           = &amp;quot;&amp;quot;;//optional, one in contents will work too&lt;br /&gt;
//&lt;br /&gt;
float           gAngle          = 160.0;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
integer         gOpen;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle()&lt;br /&gt;
{   if(gOpen)&lt;br /&gt;
    {   if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llLoopSound(gSound,gVolume);&lt;br /&gt;
        if(gAnim!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llStartAnimation(gAnim);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {   llStopSound();&lt;br /&gt;
        if(gAnim!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llStopAnimation(gAnim);&lt;br /&gt;
    }&lt;br /&gt;
    llSetLinkPrimitiveParams(2,[PRIM_ROTATION&lt;br /&gt;
        ,llEuler2Rot(&amp;lt;gAngle*(float)gOpen, 0.0, 0.0&amp;gt;*DEG_TO_RAD)/llGetLocalRot()&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   if(gSound==&amp;quot;&amp;quot;)&lt;br /&gt;
        {   string sound = llGetInventoryName(INVENTORY_SOUND,0);&lt;br /&gt;
            if(sound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            {   gSound=sound;&lt;br /&gt;
                llPreloadSound(gSound);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(gAnim==&amp;quot;&amp;quot;)&lt;br /&gt;
        {   string anim = llGetInventoryName(INVENTORY_ANIMATION,0);&lt;br /&gt;
            if(anim!=&amp;quot;&amp;quot;)&lt;br /&gt;
            {   gAnim=anim;&lt;br /&gt;
                llPreloadSound(gAnim);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   gOpen=!gOpen;&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Greeting_Card&amp;diff=504202</id>
		<title>Greeting Card</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Greeting_Card&amp;diff=504202"/>
		<updated>2009-10-04T10:26:21Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Greeting Card====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091004 0012 [SLT: 20091003 0712]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The prims are dimpled, root 0.0-0.5 and child 0.5-1.0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The child prim is cut 0.375-0.875&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Texture repeats are adjusted accordingly&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You&#039;ll figure out which way to orient the prims when you link and touch it.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091003 2019 [SLT: 20091003 0319]&lt;br /&gt;
// For eKitten Magic&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//          https://wiki.secondlife.com/wiki/Greeting_Card&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
string          gSound          = &amp;quot;&amp;quot;;//optional, one in contents will work too&lt;br /&gt;
float           gVolume         = 1.0;&lt;br /&gt;
//&lt;br /&gt;
string          gAnim           = &amp;quot;&amp;quot;;//optional, one in contents will work too&lt;br /&gt;
//&lt;br /&gt;
float           gAngle          = 160.0;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
integer         gOpen;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle()&lt;br /&gt;
{   if(gOpen)&lt;br /&gt;
    {   if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llLoopSound(gSound,gVolume);&lt;br /&gt;
        if(gAnim!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llStartAnimation(gAnim);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {   llStopSound();&lt;br /&gt;
        if(gAnim!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llStopAnimation(gAnim);&lt;br /&gt;
    }&lt;br /&gt;
    llSetLinkPrimitiveParams(2,[PRIM_ROTATION&lt;br /&gt;
        ,llEuler2Rot(&amp;lt;gAngle*(float)gOpen, 0.0, 0.0&amp;gt;*DEG_TO_RAD)/llGetLocalRot()&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   if(gSound==&amp;quot;&amp;quot;)&lt;br /&gt;
        {   string sound = llGetInventoryName(INVENTORY_SOUND,0);&lt;br /&gt;
            if(sound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            {   gSound=sound;&lt;br /&gt;
                llPreloadSound(gSound);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(gAnim==&amp;quot;&amp;quot;)&lt;br /&gt;
        {   string anim = llGetInventoryName(INVENTORY_ANIMATION,0);&lt;br /&gt;
            if(anim!=&amp;quot;&amp;quot;)&lt;br /&gt;
            {   gAnim=anim;&lt;br /&gt;
                llPreloadSound(gAnim);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   gOpen=!gOpen;&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Greeting_Card&amp;diff=503603</id>
		<title>Greeting Card</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Greeting_Card&amp;diff=503603"/>
		<updated>2009-10-03T14:15:55Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Greeting Card====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091004 0012 [SLT: 20091003 0712]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The prims are dimpled, root 0.0-0.5 and child 0.5-1.0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The child prim is cut 0.375-0.875&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Texture repeats are adjusted accordingly&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You&#039;ll figure out which way to orient the prims when you link and touch it.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091003 2019 [SLT: 20091003 0319]&lt;br /&gt;
// For eKitten Magic&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//          https://wiki.secondlife.com/wiki/Greeting_Card&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
string          gSound          = &amp;quot;&amp;quot;;&lt;br /&gt;
float           gVolume         = 1.0;&lt;br /&gt;
//&lt;br /&gt;
float           gAngle          = 160.0;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
integer         gOpen;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle()&lt;br /&gt;
{   if(gOpen)&lt;br /&gt;
    {   if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llLoopSound(gSound,gVolume);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        llStopSound();&lt;br /&gt;
    llSetLinkPrimitiveParams(2,[PRIM_ROTATION&lt;br /&gt;
        ,llEuler2Rot(&amp;lt;gAngle*(float)gOpen, 0.0, 0.0&amp;gt;*DEG_TO_RAD)/llGetLocalRot()&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   if(gSound==&amp;quot;&amp;quot;)&lt;br /&gt;
        {   string sound = llGetInventoryName(INVENTORY_SOUND,0);&lt;br /&gt;
            if(sound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            {   gSound=sound;&lt;br /&gt;
                llPreloadSound(gSound);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   gOpen=!gOpen;&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Greeting_Card&amp;diff=503593</id>
		<title>Greeting Card</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Greeting_Card&amp;diff=503593"/>
		<updated>2009-10-03T14:15:29Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====Greeting Card==== --BETLOG Hax UTC+10: 20091004 0012 [SLT: 20091003 0712]  &amp;lt;br&amp;gt; The prims are dimpled, root 0.0-0.5 and child 0.5-1.0 &amp;lt;br&amp;gt; ...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Greeting Card====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20091004 0012 [SLT: 20091003 0712]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The prims are dimpled, root 0.0-0.5 and child 0.5-1.0&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The child prim is cut 0.375-0.875&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Texture repeats are adjusted accordingly&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You&#039;ll figure out which way to orient the prims when you link and touch it.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20091003 2019 [SLT: 20091003 0319]&lt;br /&gt;
// For eKitten Magic&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
string          gSound          = &amp;quot;&amp;quot;;&lt;br /&gt;
float           gVolume         = 1.0;&lt;br /&gt;
//&lt;br /&gt;
float           gAngle          = 160.0;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
integer         gOpen;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle()&lt;br /&gt;
{   if(gOpen)&lt;br /&gt;
    {   if(gSound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            llLoopSound(gSound,gVolume);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        llStopSound();&lt;br /&gt;
    llSetLinkPrimitiveParams(2,[PRIM_ROTATION&lt;br /&gt;
        ,llEuler2Rot(&amp;lt;gAngle*(float)gOpen, 0.0, 0.0&amp;gt;*DEG_TO_RAD)/llGetLocalRot()&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   if(gSound==&amp;quot;&amp;quot;)&lt;br /&gt;
        {   string sound = llGetInventoryName(INVENTORY_SOUND,0);&lt;br /&gt;
            if(sound!=&amp;quot;&amp;quot;)&lt;br /&gt;
            {   gSound=sound;&lt;br /&gt;
                llPreloadSound(gSound);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {   gOpen=!gOpen;&lt;br /&gt;
        f_toggle();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Do_while&amp;diff=503523</id>
		<title>Do while</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Do_while&amp;diff=503523"/>
		<updated>2009-10-03T04:54:21Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#vardefine:p_loop_desc|Executes once, then executes &#039;&#039;&#039;condition&#039;&#039;&#039;.&lt;br /&gt;
}}{{#vardefine:p_condition_desc|If condition executes true, it then loops back and executes &#039;&#039;&#039;loop&#039;&#039;&#039; again.&lt;br /&gt;
}}{{LSL_Conditional&lt;br /&gt;
|statement=do while&lt;br /&gt;
|statement_header&lt;br /&gt;
|statement_desc=Any of the statements can be null statements. A do...while loop is slightly faster than a while or for loop, and requires fewer bytes of memory than a while or for loop.&lt;br /&gt;
|statement_title=do {{LSL Param|loop}} while ({{LSL Param|condition}});&lt;br /&gt;
|p1_name=loop&lt;br /&gt;
|p2_name=condition&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|examples=&amp;lt;div style=&amp;quot;display:inline-block; vertical-align:top;&amp;quot;&amp;gt;&amp;lt;lsl&amp;gt;//Counts from 1 to 5&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer olf;&lt;br /&gt;
        do&lt;br /&gt;
            llSay(0, (string) (++olf));&lt;br /&gt;
        while(olf&amp;lt;5);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block; vertical-align:top;&amp;quot;&amp;gt;&amp;lt;lsl&amp;gt;//Counts from 0 to 4&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer olf;&lt;br /&gt;
        do&lt;br /&gt;
            llSay(0, (string)olf);&lt;br /&gt;
        while((++olf)&amp;lt;5);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block; vertical-align:top;&amp;quot;&amp;gt;&amp;lt;lsl&amp;gt;//Counts from 0 to 4 and coments as it loops (block statement demo)&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer olf;&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, (string)olf);&lt;br /&gt;
            llSay(0, &amp;quot;looping&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        while((++olf)&amp;lt;5);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:inline-block; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Practical example of where a do/while loop is more immediately useful than a while loop:&lt;br /&gt;
//Note that a sensor event always contains input data, so the &#039;do&#039; always has something to process&lt;br /&gt;
    sensor(integer num)&lt;br /&gt;
    {   if(num&amp;gt;12)&lt;br /&gt;
            num=12;&lt;br /&gt;
        do&lt;br /&gt;
        {   gNameList += [llGetSubString(llDetectedName(--num),0,23)];//sometimes avatar names are too long for dialog display&lt;br /&gt;
            gKeyList +=  [llDetectedKey(num)];//we will dialog select avatar by name, but still need their key&lt;br /&gt;
                                              //even if their name has not been truncated above&lt;br /&gt;
        }while(num&amp;gt;0);&lt;br /&gt;
        llDialog(llGetOwner(),&amp;quot;Choose an avatar.&amp;quot;,gNameList,gDlgChan);//channel is pre-defined when llSensor is triggered&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|cat1=Conditional&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Typing_linkset_alpha_toggle&amp;diff=497293</id>
		<title>Typing linkset alpha toggle</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Typing_linkset_alpha_toggle&amp;diff=497293"/>
		<updated>2009-09-28T07:11:54Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Typing linkset alpha toggle====&lt;br /&gt;
&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090928 1705 [SLT: 20090928 0005]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Put script in root prim of your fancy &amp;quot;i am typing now&amp;quot; novelty prim keyboard.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Start typing -&amp;gt; prims become visible&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Stop typing -&amp;gt; prims become INvisible&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Only one script required.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I just wrote it, didn&#039;t test much, It&#039;s trivial but there will probably be a glaring oversight in there somewhere.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20090928 1642 [SLT: 20090927 2342]&lt;br /&gt;
// For Jullalana Mornington because I saw the ye-olde one she was using had a script in every prim. This sort of script does NOT need a script in every prim. Yes realy.&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//        https://wiki.secondlife.com/wiki/Typing_linkset_alpha_toggle&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//==============================================================&lt;br /&gt;
integer     gVisible;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle(integer visible)&lt;br /&gt;
{   llSetLinkAlpha(LINK_SET, (float)visible, ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_perms() //make it still operate when entering no script areas&lt;br /&gt;
{   if(llGetAttached())&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   if(llGetAttached())//DEV&lt;br /&gt;
            f_perms();&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;You must be wearing me for this to operate.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id) &lt;br /&gt;
    {   f_perms();&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm) &lt;br /&gt;
    {   if(perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
        {   f_toggle(gVisible=FALSE);&lt;br /&gt;
            llSetTimerEvent(0.444444);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   //make it still operate when entering no script areas&lt;br /&gt;
    }&lt;br /&gt;
    timer() &lt;br /&gt;
    {   if(AGENT_TYPING &amp;amp; llGetAgentInfo(llGetOwner()) )&lt;br /&gt;
        {   if(!gVisible)&lt;br /&gt;
            {   f_toggle(gVisible=TRUE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {   if(gVisible)&lt;br /&gt;
            {   f_toggle(gVisible=FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Typing_linkset_alpha_toggle&amp;diff=497283</id>
		<title>Typing linkset alpha toggle</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Typing_linkset_alpha_toggle&amp;diff=497283"/>
		<updated>2009-09-28T07:11:01Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====Typing linkset alpha toggle====  --BETLOG Hax UTC+10: 20090928 1705 [SLT: 20090928 0005] &amp;lt;br&amp;gt; Put script in root prim of your fancy &amp;quot;i am t...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Typing linkset alpha toggle====&lt;br /&gt;
&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090928 1705 [SLT: 20090928 0005]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Put script in root prim of your fancy &amp;quot;i am typing now&amp;quot; novelty prim keyboard.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Start typing -&amp;gt; prims become visible&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Stop typing -&amp;gt; prims become INvisible&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Only one script required.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I just wrote it, didn&#039;t test much, It&#039;s trivial but there will probably be a glaring oversight in there somewhere.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20090928 1642 [SLT: 20090927 2342]&lt;br /&gt;
// For Jullalana Mornington because I saw the ye-olde one she was using had a script in every prim. This sort of script does NOT need a script in every prim. Yes realy.&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//==============================================================&lt;br /&gt;
integer     gVisible;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_toggle(integer visible)&lt;br /&gt;
{   llSetLinkAlpha(LINK_SET, (float)visible, ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_perms() //make it still operate when entering no script areas&lt;br /&gt;
{   if(llGetAttached())&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   if(llGetAttached())//DEV&lt;br /&gt;
            f_perms();&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(&amp;quot;You must be wearing me for this to operate.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id) &lt;br /&gt;
    {   f_perms();&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm) &lt;br /&gt;
    {   if(perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
        {   f_toggle(gVisible=FALSE);&lt;br /&gt;
            llSetTimerEvent(0.444444);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   //make it still operate when entering no script areas&lt;br /&gt;
    }&lt;br /&gt;
    timer() &lt;br /&gt;
    {   if(AGENT_TYPING &amp;amp; llGetAgentInfo(llGetOwner()) )&lt;br /&gt;
        {   if(!gVisible)&lt;br /&gt;
            {   f_toggle(gVisible=TRUE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {   if(gVisible)&lt;br /&gt;
            {   f_toggle(gVisible=FALSE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Sneakin&amp;diff=493352</id>
		<title>Sneakin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Sneakin&amp;diff=493352"/>
		<updated>2009-09-19T07:29:53Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Theme music when you  walk/run/crouchwalk====&lt;br /&gt;
&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090810 0403 [SLT: 20090809 1103]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20090728 0733 [SLT: 20090727 1433]&lt;br /&gt;
// Was Messamo House&#039;s script, which he may have copy pasted from Hen Streeter or vice versa, but i *totally* rewrote it.. TOTALLY&lt;br /&gt;
// https://wiki.secondlife.com/wiki/Sneakin&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
key     gMode            = NULL_KEY;&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   llStopSound();&lt;br /&gt;
        llSetTimerEvent(0.333333);&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   integer i = llGetAgentInfo(llGetOwner());&lt;br /&gt;
        key mode=NULL_KEY;&lt;br /&gt;
        if(i &amp;amp; AGENT_WALKING)&lt;br /&gt;
        {   if(llVecMag(llList2Vector(llGetObjectDetails(llGetOwner(), ([OBJECT_VELOCITY])),0))&amp;gt;4.0)&lt;br /&gt;
                mode=&amp;quot;770cf677-5fda-56fe-85dd-ee1f07c63005&amp;quot;;//run&lt;br /&gt;
            else if(i &amp;amp; AGENT_CROUCHING)&lt;br /&gt;
                mode=&amp;quot;f7db8364-4369-712f-f034-92799ee26193&amp;quot;;//crouch&lt;br /&gt;
            else&lt;br /&gt;
                mode=&amp;quot;cc493463-b22d-cf0f-49ef-285e641a87f4&amp;quot;;//walk&lt;br /&gt;
        }&lt;br /&gt;
        if(gMode!=mode)&lt;br /&gt;
        {   gMode=mode;&lt;br /&gt;
            llStopSound();        &lt;br /&gt;
            if(mode!=NULL_KEY)&lt;br /&gt;
                llLoopSound(mode, 1.0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Send_home_and_ban_avs_less_than_description_field_days_old&amp;diff=485542</id>
		<title>Send home and ban avs less than description field days old</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Send_home_and_ban_avs_less_than_description_field_days_old&amp;diff=485542"/>
		<updated>2009-09-10T01:34:09Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Send home and ban avs less than description field days old====&lt;br /&gt;
=====Modified from script: Days Since=====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090909 1421 [SLT: 20090908 2121]&lt;br /&gt;
&lt;br /&gt;
UTC+10: 20090910 1106 [SLT: 20090909 1806]&lt;br /&gt;
NOTE: I have not tested this at all. Yes really.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Superficially the &#039;kick their ass out&#039; logic seems to work... and I am likely to get distractred from this for some time, so am posting it here so it&#039;s intended purpose/person I wrote it for doesn&#039;t get completely forgotten (by me).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If an avatar that is younger than the number of days specified in the prims description field, collides with this prim, they will be sent home, and banned for the number of days it will take till they are old enough to come back.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The script endeavors (by waiting a bit) to make sure that the message it whispers just prior to ejecting them will be present in their history buffer. So they should know what has happened. Banning them ensures that they don&#039;t keep trying to return... which would cause the object to load up and spam anyone within 10m with their repeated ejection message.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20090909 2049 [SLT: 20090909 0349]&lt;br /&gt;
// For Bettina Tizzy&lt;br /&gt;
//&lt;br /&gt;
// HOW?&lt;br /&gt;
// Make a prim to cover your entry parcel, so avatars arrive inside the prim.&lt;br /&gt;
//  A transparent prim is ideal. &lt;br /&gt;
//  DO NOT link it to anything...unless its to extend the range of this function or to fit a funky shaped entry area.&lt;br /&gt;
// Set the prims description field to the number of days old an avatar must be to enter your sim.&lt;br /&gt;
//  eg: 30&lt;br /&gt;
// Dump this script into the prim.&lt;br /&gt;
// If you are not the land owner you MUST deed the prim to the appropriate group.&lt;br /&gt;
// Get someone younger than the number of days you entered above to walk into the prim to test. &lt;br /&gt;
//     It will NOT eject the prims owner. But will output all the usual messages. &lt;br /&gt;
//&lt;br /&gt;
// WTF?&lt;br /&gt;
// Bettina Tizzy asked for this functionality in group chat.&lt;br /&gt;
// For some time I have wanted to write something to calculate age of avatars in days, so I googled, found some logic, and rewrote it in LSL.&lt;br /&gt;
//&lt;br /&gt;
// NOTE:&lt;br /&gt;
// Excluding people based entirely on their avatar account age is a bit of a bastard act.&lt;br /&gt;
// Therefore people will not like it when it happens to them. So expect this script to cause drama.&lt;br /&gt;
// But if you need a script like this, then you are probably accustomed to drama anyway.&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//       https://wiki.secondlife.com/wiki/Send_home_and_ban_avs_less_than_description_field_days_old&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
// AND:&lt;br /&gt;
//   Credit for original logic : Robert Baruch&lt;br /&gt;
//      http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
key         gDataId;&lt;br /&gt;
list        gAvList;&lt;br /&gt;
//string      gName               = &amp;quot;&amp;quot;;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
key         gOwner; //for when its deeded&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer f_daysSince(string input)&lt;br /&gt;
{   list l = llParseString2List(input, [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    integer Y = (integer)llList2String(l,0);&lt;br /&gt;
    integer M = (integer)llList2String(l,1);    &lt;br /&gt;
    integer D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    integer A = Y/100;&lt;br /&gt;
    integer B = A/4;&lt;br /&gt;
    integer C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    float E = 365.25*(Y+4716);&lt;br /&gt;
    float F = 30.6001*(M+1);&lt;br /&gt;
    integer age = C+D+(integer)E+(integer)F-1524;&lt;br /&gt;
//llOwnerSay(&amp;quot;Julian Day = &amp;quot;+(string)age );&lt;br /&gt;
&lt;br /&gt;
    l = llParseString2List(llGetDate(), [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    Y = (integer)llList2String(l,0);&lt;br /&gt;
    M = (integer)llList2String(l,1);    &lt;br /&gt;
    D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    A = Y/100;&lt;br /&gt;
    B = A/4;&lt;br /&gt;
    C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    E = 365.25*(Y+4716);&lt;br /&gt;
    F = 30.6001*(M+1);&lt;br /&gt;
    return C+D+(integer)E+(integer)F-1524-age; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==============================================================&lt;br /&gt;
default &lt;br /&gt;
{   state_entry() &lt;br /&gt;
    {   gOwner = llGetOwner();&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num)&lt;br /&gt;
    {   key av;&lt;br /&gt;
        do{ av = llDetectedKey(--num);&lt;br /&gt;
            if(-1==llListFindList(gAvList,[(string)av]))&lt;br /&gt;
                gAvList += [gDataId=llRequestAgentData(av, DATA_BORN), av, llDetectedName(num)];&lt;br /&gt;
        }while(num&amp;gt;0);&lt;br /&gt;
    }    &lt;br /&gt;
    changed(integer change) &lt;br /&gt;
    {   if(change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
        {   if(llGetOwner()!=NULL_KEY)&lt;br /&gt;
                gOwner = llGetOwner();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {   integer i = llListFindList(gAvList,[queryid]);&lt;br /&gt;
        if(-1&amp;lt;i)&lt;br /&gt;
        {   integer age = f_daysSince(data);//YYYY-MM-DD&lt;br /&gt;
            integer limit = (integer)llGetObjectDesc();&lt;br /&gt;
            if(limit&amp;gt;0 &amp;amp;&amp;amp; age&amp;lt;limit)&lt;br /&gt;
            {   key av = (key)llList2String(gAvList,i+1);&lt;br /&gt;
                if(av!=NULL_KEY)&lt;br /&gt;
                {   string name = llList2String(gAvList,i+2);&lt;br /&gt;
                    float duration = 24.0*(limit-age);&lt;br /&gt;
                    string oldName= llGetObjectName();&lt;br /&gt;
                    llSetObjectName(&amp;quot;&amp;quot;);&lt;br /&gt;
                    llWhisper(0,&amp;quot;/me ☠: Sorry &amp;quot;+name+&amp;quot; Your account is too new.&amp;quot;&lt;br /&gt;
                        +&amp;quot;\nPlease feel free to come back in &amp;quot;+(string)((integer)(duration/24))&lt;br /&gt;
                        +&amp;quot; days when you will be above our minimum required account age of &amp;quot;&lt;br /&gt;
                        +(string)((integer)limit)+&amp;quot; days.&amp;quot;);&lt;br /&gt;
                    list data = llGetObjectDetails(llGetKey(), ([OBJECT_OWNER, OBJECT_GROUP]));&lt;br /&gt;
                    key owner = llList2Key(data, 0);&lt;br /&gt;
                    if (owner!=NULL_KEY &lt;br /&gt;
                    || llList2Key(data,1)!=llList2Key(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_GROUP]),0))&lt;br /&gt;
                    {   //is NOT deeded or NOT set to correct parcel group&lt;br /&gt;
                    llOwnerSay(&amp;quot;/me &amp;quot;+llGetRegionName()+&amp;quot; ☠ Sent Home/Banned: \t&amp;quot;+name&lt;br /&gt;
                        +&amp;quot;\t [age: &amp;quot;+(string)age+&amp;quot;/&amp;quot;+(string)limit+&amp;quot;] for &amp;quot;&lt;br /&gt;
                        +(string)((integer)duration/24)+&amp;quot; days.&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if(av!=gOwner)//safer testing&lt;br /&gt;
                    {   //actually try to get the message to their history buffer&lt;br /&gt;
                        llSleep(1.0/(1.01-llGetRegionTimeDilation()));&lt;br /&gt;
                        if(llGetAgentSize(av)!=ZERO_VECTOR)//they may have already left&lt;br /&gt;
                        {   llTeleportAgentHome(av);&lt;br /&gt;
                            llAddToLandBanList(av, duration);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    llSetObjectName(oldName);&lt;br /&gt;
                    gAvList=llDeleteSubList(gAvList,i,i+2);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
DERIVED FROM:&lt;br /&gt;
http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
&lt;br /&gt;
 Question         How can I get the number of days that have elapsed between two Date objects?&lt;br /&gt;
Derived from     A question posed by J. Scott Stanlick&lt;br /&gt;
Topics     Java:Language, Java:API:Internationalization&lt;br /&gt;
Author     Robert Baruch&lt;br /&gt;
Created     Feb 14, 2000     Modified     May 29, 2000 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Answer&lt;br /&gt;
That depends on what you mean by &amp;quot;between&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to find out the number of 24-hour periods between two Date objects d1 and d2 (d2 &amp;gt; d1) then you would do this:&lt;br /&gt;
&lt;br /&gt;
double days = (d2.getTime()-d1.getTime())/1000/60/60/24;&lt;br /&gt;
&lt;br /&gt;
Since Date.getTime returns milliseconds, you divide by 1000 to get seconds, by 60 to get minutes, by 60 again to get hours, and by 24 to get days.&lt;br /&gt;
&lt;br /&gt;
Sometimes this can cause difficulties, especially in countries that have a form of daylight savings time. For example, in the U.S., there is one day in the Fall which has 25 hours, and one day in the Spring which has 23 hours. An elapsed-number-of-days calculation on Dates falling on one of these days may not give the answer you expect.&lt;br /&gt;
&lt;br /&gt;
Anyway, that&#039;s the easy way, and if you&#039;re satisfied with that, then read no further.&lt;br /&gt;
&lt;br /&gt;
If, on the other hand, you mean the number of midnight-crossings (so that the number of days elapsed between 11:00 PM and 1:00 AM the next day is 1) then you&#039;re better off using the Calendar class and computing the Julian Day.&lt;br /&gt;
&lt;br /&gt;
By the way, don&#039;t mistake the Julian Day for the Julian Calendar. The two are different and named after different &amp;quot;Julians&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The Julian Day is defined as the number of days elapsed since Nov 24, 4714 BC, 12:00 GMT Gregorian. The year was chosen as being sufficiently in the past so as not to have negative Julian Days, the date was chosen because of the (in that year) 37-day difference between the Julian and Gregorian calendars (Nov 24, 4714 BC Gregorian would be Jan 1, 4713 BC Julian), and the time was chosen because astronomers do their work at night, and it would be a little confusing (to them) to have the Julian Day change in the middle of their work. (I could be wrong)&lt;br /&gt;
&lt;br /&gt;
Anyway, the algorithm for computing the Julian Day from a Gregorian or Julian calendar date for years 400 AD and above is as follows:&lt;br /&gt;
&lt;br /&gt;
Let the date be Y, M, D, where Y is the AD year, M is the month (January=1, December=12), and D is the day (1-31).&lt;br /&gt;
&lt;br /&gt;
For the following calculations, use integer arithmetic (i.e. lop off the fractional part of any result).&lt;br /&gt;
&lt;br /&gt;
If M==1 or M==2 then Y--, M+=12.&lt;br /&gt;
Let A = Y/100&lt;br /&gt;
Let B = A/4&lt;br /&gt;
Let C = 2-A-B (or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
Let E = 365.25*(Y+4716)&lt;br /&gt;
Let F = 30.6001*(M+1)&lt;br /&gt;
&lt;br /&gt;
Julian Day = C+D+E+F-1524.5&lt;br /&gt;
&lt;br /&gt;
There would be a further adjustment for the time of day, but we&#039;re not looking at that. If you want your Julian Days to start at midnight, subtract 1524 rather than 1524.5.&lt;br /&gt;
&lt;br /&gt;
And so, your number-of-days-elapsed calculation would look like this:&lt;br /&gt;
&lt;br /&gt;
Calendar c1 = new GregorianCalendar();&lt;br /&gt;
Calendar c2 = new GregorianCalendar();&lt;br /&gt;
&lt;br /&gt;
c1.setTime(d1);&lt;br /&gt;
c2.setTime(d2);&lt;br /&gt;
&lt;br /&gt;
long j1 = julian_day(c1.get(YEAR),&lt;br /&gt;
  c1.get(MONTH)+1, c1.get(DAY));&lt;br /&gt;
long j2 = julian_day(c2.get(YEAR),&lt;br /&gt;
  c2.get(MONTH)+1, c2.get(DAY));&lt;br /&gt;
&lt;br /&gt;
long days_elapsed = j2-j1;&lt;br /&gt;
&lt;br /&gt;
And this would properly calculate the number of midnight-crossings between 11:00 PM on one day and 1:00 AM the next day. &lt;br /&gt;
/*&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Send_home_and_ban_avs_less_than_description_field_days_old&amp;diff=485532</id>
		<title>Send home and ban avs less than description field days old</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Send_home_and_ban_avs_less_than_description_field_days_old&amp;diff=485532"/>
		<updated>2009-09-10T01:33:24Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Send home and ban avs less than description field days old====&lt;br /&gt;
=====Modified from script: Days Since=====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090909 1421 [SLT: 20090908 2121]&lt;br /&gt;
&lt;br /&gt;
UTC+10: 20090910 1106 [SLT: 20090909 1806]&lt;br /&gt;
NOTE: I have not tested this at all. Yes really.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Superficially the &#039;kick their ass out&#039; logic seems to work... and I am likely to get distractred from this for some time, so am posting it here so it&#039;s intended purpose/person I wrote it for doesn&#039;t get completely forgotten (by me).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If an avatar that is younger than the number of days specified in the prims description field, collides with this prim, they will be sent home, and banned for the number of days it will take till they are old enough to come back.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
The script endeavours (by waiting a bit) to make sure that the message it whispers just prior to ejecting them will be present in their history buffer. So they should know what has happened. Banning them ensures that they dont keep tryng to return... which would cause the object to load up and spam anyone within 10m with their repeated ejection message.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20090909 2049 [SLT: 20090909 0349]&lt;br /&gt;
// For Bettina Tizzy&lt;br /&gt;
//&lt;br /&gt;
// HOW?&lt;br /&gt;
// Make a prim to cover your entry parcel, so avatars arrive inside the prim.&lt;br /&gt;
//  A transparent prim is ideal. &lt;br /&gt;
//  DO NOT link it to anything...unless its to extend the range of this function or to fit a funky shaped entry area.&lt;br /&gt;
// Set the prims description field to the number of days old an avatar must be to enter your sim.&lt;br /&gt;
//  eg: 30&lt;br /&gt;
// Dump this script into the prim.&lt;br /&gt;
// If you are not the land owner you MUST deed the prim to the appropriate group.&lt;br /&gt;
// Get someone younger than the number of days you entered above to walk into the prim to test. &lt;br /&gt;
//     It will NOT eject the prims owner. But will output all the usual messages. &lt;br /&gt;
//&lt;br /&gt;
// WTF?&lt;br /&gt;
// Bettina Tizzy asked for this functionality in group chat.&lt;br /&gt;
// For some time I have wanted to write something to calculate age of avatars in days, so I googled, found some logic, and rewrote it in LSL.&lt;br /&gt;
//&lt;br /&gt;
// NOTE:&lt;br /&gt;
// Excluding people based entirely on their avatar account age is a bit of a bastard act.&lt;br /&gt;
// Therefore people will not like it when it happens to them. So expect this script to cause drama.&lt;br /&gt;
// But if you need a script like this, then you are probably accustomed to drama anyway.&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//       https://wiki.secondlife.com/wiki/Send_home_and_ban_avs_less_than_description_field_days_old&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
// AND:&lt;br /&gt;
//   Credit for original logic : Robert Baruch&lt;br /&gt;
//      http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
key         gDataId;&lt;br /&gt;
list        gAvList;&lt;br /&gt;
//string      gName               = &amp;quot;&amp;quot;;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
key         gOwner; //for when its deeded&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer f_daysSince(string input)&lt;br /&gt;
{   list l = llParseString2List(input, [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    integer Y = (integer)llList2String(l,0);&lt;br /&gt;
    integer M = (integer)llList2String(l,1);    &lt;br /&gt;
    integer D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    integer A = Y/100;&lt;br /&gt;
    integer B = A/4;&lt;br /&gt;
    integer C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    float E = 365.25*(Y+4716);&lt;br /&gt;
    float F = 30.6001*(M+1);&lt;br /&gt;
    integer age = C+D+(integer)E+(integer)F-1524;&lt;br /&gt;
//llOwnerSay(&amp;quot;Julian Day = &amp;quot;+(string)age );&lt;br /&gt;
&lt;br /&gt;
    l = llParseString2List(llGetDate(), [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    Y = (integer)llList2String(l,0);&lt;br /&gt;
    M = (integer)llList2String(l,1);    &lt;br /&gt;
    D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    A = Y/100;&lt;br /&gt;
    B = A/4;&lt;br /&gt;
    C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    E = 365.25*(Y+4716);&lt;br /&gt;
    F = 30.6001*(M+1);&lt;br /&gt;
    return C+D+(integer)E+(integer)F-1524-age; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==============================================================&lt;br /&gt;
default &lt;br /&gt;
{   state_entry() &lt;br /&gt;
    {   gOwner = llGetOwner();&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num)&lt;br /&gt;
    {   key av;&lt;br /&gt;
        do{ av = llDetectedKey(--num);&lt;br /&gt;
            if(-1==llListFindList(gAvList,[(string)av]))&lt;br /&gt;
                gAvList += [gDataId=llRequestAgentData(av, DATA_BORN), av, llDetectedName(num)];&lt;br /&gt;
        }while(num&amp;gt;0);&lt;br /&gt;
    }    &lt;br /&gt;
    changed(integer change) &lt;br /&gt;
    {   if(change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
        {   if(llGetOwner()!=NULL_KEY)&lt;br /&gt;
                gOwner = llGetOwner();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {   integer i = llListFindList(gAvList,[queryid]);&lt;br /&gt;
        if(-1&amp;lt;i)&lt;br /&gt;
        {   integer age = f_daysSince(data);//YYYY-MM-DD&lt;br /&gt;
            integer limit = (integer)llGetObjectDesc();&lt;br /&gt;
            if(limit&amp;gt;0 &amp;amp;&amp;amp; age&amp;lt;limit)&lt;br /&gt;
            {   key av = (key)llList2String(gAvList,i+1);&lt;br /&gt;
                if(av!=NULL_KEY)&lt;br /&gt;
                {   string name = llList2String(gAvList,i+2);&lt;br /&gt;
                    float duration = 24.0*(limit-age);&lt;br /&gt;
                    string oldName= llGetObjectName();&lt;br /&gt;
                    llSetObjectName(&amp;quot;&amp;quot;);&lt;br /&gt;
                    llWhisper(0,&amp;quot;/me ☠: Sorry &amp;quot;+name+&amp;quot; Your account is too new.&amp;quot;&lt;br /&gt;
                        +&amp;quot;\nPlease feel free to come back in &amp;quot;+(string)((integer)(duration/24))&lt;br /&gt;
                        +&amp;quot; days when you will be above our minimum required account age of &amp;quot;&lt;br /&gt;
                        +(string)((integer)limit)+&amp;quot; days.&amp;quot;);&lt;br /&gt;
                    list data = llGetObjectDetails(llGetKey(), ([OBJECT_OWNER, OBJECT_GROUP]));&lt;br /&gt;
                    key owner = llList2Key(data, 0);&lt;br /&gt;
                    if (owner!=NULL_KEY &lt;br /&gt;
                    || llList2Key(data,1)!=llList2Key(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_GROUP]),0))&lt;br /&gt;
                    {   //is NOT deeded or NOT set to correct parcel group&lt;br /&gt;
                    llOwnerSay(&amp;quot;/me &amp;quot;+llGetRegionName()+&amp;quot; ☠ Sent Home/Banned: \t&amp;quot;+name&lt;br /&gt;
                        +&amp;quot;\t [age: &amp;quot;+(string)age+&amp;quot;/&amp;quot;+(string)limit+&amp;quot;] for &amp;quot;&lt;br /&gt;
                        +(string)((integer)duration/24)+&amp;quot; days.&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if(av!=gOwner)//safer testing&lt;br /&gt;
                    {   //actually try to get the message to their history buffer&lt;br /&gt;
                        llSleep(1.0/(1.01-llGetRegionTimeDilation()));&lt;br /&gt;
                        if(llGetAgentSize(av)!=ZERO_VECTOR)//they may have already left&lt;br /&gt;
                        {   llTeleportAgentHome(av);&lt;br /&gt;
                            llAddToLandBanList(av, duration);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    llSetObjectName(oldName);&lt;br /&gt;
                    gAvList=llDeleteSubList(gAvList,i,i+2);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
DERIVED FROM:&lt;br /&gt;
http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
&lt;br /&gt;
 Question         How can I get the number of days that have elapsed between two Date objects?&lt;br /&gt;
Derived from     A question posed by J. Scott Stanlick&lt;br /&gt;
Topics     Java:Language, Java:API:Internationalization&lt;br /&gt;
Author     Robert Baruch&lt;br /&gt;
Created     Feb 14, 2000     Modified     May 29, 2000 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Answer&lt;br /&gt;
That depends on what you mean by &amp;quot;between&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to find out the number of 24-hour periods between two Date objects d1 and d2 (d2 &amp;gt; d1) then you would do this:&lt;br /&gt;
&lt;br /&gt;
double days = (d2.getTime()-d1.getTime())/1000/60/60/24;&lt;br /&gt;
&lt;br /&gt;
Since Date.getTime returns milliseconds, you divide by 1000 to get seconds, by 60 to get minutes, by 60 again to get hours, and by 24 to get days.&lt;br /&gt;
&lt;br /&gt;
Sometimes this can cause difficulties, especially in countries that have a form of daylight savings time. For example, in the U.S., there is one day in the Fall which has 25 hours, and one day in the Spring which has 23 hours. An elapsed-number-of-days calculation on Dates falling on one of these days may not give the answer you expect.&lt;br /&gt;
&lt;br /&gt;
Anyway, that&#039;s the easy way, and if you&#039;re satisfied with that, then read no further.&lt;br /&gt;
&lt;br /&gt;
If, on the other hand, you mean the number of midnight-crossings (so that the number of days elapsed between 11:00 PM and 1:00 AM the next day is 1) then you&#039;re better off using the Calendar class and computing the Julian Day.&lt;br /&gt;
&lt;br /&gt;
By the way, don&#039;t mistake the Julian Day for the Julian Calendar. The two are different and named after different &amp;quot;Julians&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The Julian Day is defined as the number of days elapsed since Nov 24, 4714 BC, 12:00 GMT Gregorian. The year was chosen as being sufficiently in the past so as not to have negative Julian Days, the date was chosen because of the (in that year) 37-day difference between the Julian and Gregorian calendars (Nov 24, 4714 BC Gregorian would be Jan 1, 4713 BC Julian), and the time was chosen because astronomers do their work at night, and it would be a little confusing (to them) to have the Julian Day change in the middle of their work. (I could be wrong)&lt;br /&gt;
&lt;br /&gt;
Anyway, the algorithm for computing the Julian Day from a Gregorian or Julian calendar date for years 400 AD and above is as follows:&lt;br /&gt;
&lt;br /&gt;
Let the date be Y, M, D, where Y is the AD year, M is the month (January=1, December=12), and D is the day (1-31).&lt;br /&gt;
&lt;br /&gt;
For the following calculations, use integer arithmetic (i.e. lop off the fractional part of any result).&lt;br /&gt;
&lt;br /&gt;
If M==1 or M==2 then Y--, M+=12.&lt;br /&gt;
Let A = Y/100&lt;br /&gt;
Let B = A/4&lt;br /&gt;
Let C = 2-A-B (or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
Let E = 365.25*(Y+4716)&lt;br /&gt;
Let F = 30.6001*(M+1)&lt;br /&gt;
&lt;br /&gt;
Julian Day = C+D+E+F-1524.5&lt;br /&gt;
&lt;br /&gt;
There would be a further adjustment for the time of day, but we&#039;re not looking at that. If you want your Julian Days to start at midnight, subtract 1524 rather than 1524.5.&lt;br /&gt;
&lt;br /&gt;
And so, your number-of-days-elapsed calculation would look like this:&lt;br /&gt;
&lt;br /&gt;
Calendar c1 = new GregorianCalendar();&lt;br /&gt;
Calendar c2 = new GregorianCalendar();&lt;br /&gt;
&lt;br /&gt;
c1.setTime(d1);&lt;br /&gt;
c2.setTime(d2);&lt;br /&gt;
&lt;br /&gt;
long j1 = julian_day(c1.get(YEAR),&lt;br /&gt;
  c1.get(MONTH)+1, c1.get(DAY));&lt;br /&gt;
long j2 = julian_day(c2.get(YEAR),&lt;br /&gt;
  c2.get(MONTH)+1, c2.get(DAY));&lt;br /&gt;
&lt;br /&gt;
long days_elapsed = j2-j1;&lt;br /&gt;
&lt;br /&gt;
And this would properly calculate the number of midnight-crossings between 11:00 PM on one day and 1:00 AM the next day. &lt;br /&gt;
/*&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=485522</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=485522"/>
		<updated>2009-09-10T01:12:51Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A lot of this is basically just rubbish. But it is a useful reference for various things, possibly not specifically the thing the script addresses, but often just secondary stuff.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generally I put things here to refer people to when they ask (again).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although a lot of it is here simply to reinforce in peoples minds that when I write something for them, and add an attribution license, that I expect them to comply with it, and that by making it public here it means that not only can others benefit, but that others know who actually wrote it, and often for whom, and why.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes its just here because i&#039;ve seen something else inworld that was so bad i felt i needed to contribute something less insane.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
But like almost everything i write; when i re-read it months later theres almost always some glaring oversight, or completely trash/facepalm/&#039;ZOMG WTF was i thinking?&#039; elements in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Days_Since&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Send_home_and_ban_avs_less_than_description_field_days_old&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Send_home_and_ban_avs_less_than_description_field_days_old&amp;diff=485512</id>
		<title>Send home and ban avs less than description field days old</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Send_home_and_ban_avs_less_than_description_field_days_old&amp;diff=485512"/>
		<updated>2009-09-10T01:11:42Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Send home and ban avs less than description field days old====&lt;br /&gt;
=====Modified from script: Days Since=====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090909 1421 [SLT: 20090908 2121]&lt;br /&gt;
&lt;br /&gt;
UTC+10: 20090910 1106 [SLT: 20090909 1806]&lt;br /&gt;
NOTE: I have not tested this at all. Yes really.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Superficially the &#039;kick their ass out&#039; logic seems to work... and I am likely to get distractred from this for some time, so am posting it here so it&#039;s intended purpose/person I wrote it for doesn&#039;t get completely forgotten (by me).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20090909 2049 [SLT: 20090909 0349]&lt;br /&gt;
// For Bettina Tizzy&lt;br /&gt;
//&lt;br /&gt;
// HOW?&lt;br /&gt;
// Make a prim to cover your entry parcel, so avatars arrive inside the prim.&lt;br /&gt;
//  A transparent prim is ideal. &lt;br /&gt;
//  DO NOT link it to anything...unless its to extend the range of this function or to fit a funky shaped entry area.&lt;br /&gt;
// Set the prims description field to the number of days old an avatar must be to enter your sim.&lt;br /&gt;
//  eg: 30&lt;br /&gt;
// Dump this script into the prim.&lt;br /&gt;
// If you are not the land owner you MUST deed the prim to the appropriate group.&lt;br /&gt;
// Get someone younger than the number of days you entered above to walk into the prim to test. &lt;br /&gt;
//     It will NOT eject the prims owner. But will output all the usual messages. &lt;br /&gt;
//&lt;br /&gt;
// WTF?&lt;br /&gt;
// Bettina Tizzy asked for this functionality in group chat.&lt;br /&gt;
// For some time I have wanted to write something to calculate age of avatars in days, so I googled, found some logic, and rewrote it in LSL.&lt;br /&gt;
//&lt;br /&gt;
// NOTE:&lt;br /&gt;
// Excluding people based entirely on their avatar account age is a bit of a bastard act.&lt;br /&gt;
// Therefore people will not like it when it happens to them. So expect this script to cause drama.&lt;br /&gt;
// But if you need a script like this, then you are probably accustomed to drama anyway.&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//       https://wiki.secondlife.com/wiki/Send_home_and_ban_avs_less_than_description_field_days_old&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
// AND:&lt;br /&gt;
//   Credit for original logic : Robert Baruch&lt;br /&gt;
//      http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
key         gDataId;&lt;br /&gt;
list        gAvList;&lt;br /&gt;
//string      gName               = &amp;quot;&amp;quot;;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
key         gOwner; //for when its deeded&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer f_daysSince(string input)&lt;br /&gt;
{   list l = llParseString2List(input, [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    integer Y = (integer)llList2String(l,0);&lt;br /&gt;
    integer M = (integer)llList2String(l,1);    &lt;br /&gt;
    integer D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    integer A = Y/100;&lt;br /&gt;
    integer B = A/4;&lt;br /&gt;
    integer C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    float E = 365.25*(Y+4716);&lt;br /&gt;
    float F = 30.6001*(M+1);&lt;br /&gt;
    integer age = C+D+(integer)E+(integer)F-1524;&lt;br /&gt;
//llOwnerSay(&amp;quot;Julian Day = &amp;quot;+(string)age );&lt;br /&gt;
&lt;br /&gt;
    l = llParseString2List(llGetDate(), [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    Y = (integer)llList2String(l,0);&lt;br /&gt;
    M = (integer)llList2String(l,1);    &lt;br /&gt;
    D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    A = Y/100;&lt;br /&gt;
    B = A/4;&lt;br /&gt;
    C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    E = 365.25*(Y+4716);&lt;br /&gt;
    F = 30.6001*(M+1);&lt;br /&gt;
    return C+D+(integer)E+(integer)F-1524-age; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==============================================================&lt;br /&gt;
default &lt;br /&gt;
{   state_entry() &lt;br /&gt;
    {   gOwner = llGetOwner();&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num)&lt;br /&gt;
    {   key av;&lt;br /&gt;
        do{ av = llDetectedKey(--num);&lt;br /&gt;
            if(-1==llListFindList(gAvList,[(string)av]))&lt;br /&gt;
                gAvList += [gDataId=llRequestAgentData(av, DATA_BORN), av, llDetectedName(num)];&lt;br /&gt;
        }while(num&amp;gt;0);&lt;br /&gt;
    }    &lt;br /&gt;
    changed(integer change) &lt;br /&gt;
    {   if(change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
        {   if(llGetOwner()!=NULL_KEY)&lt;br /&gt;
                gOwner = llGetOwner();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {   integer i = llListFindList(gAvList,[queryid]);&lt;br /&gt;
        if(-1&amp;lt;i)&lt;br /&gt;
        {   integer age = f_daysSince(data);//YYYY-MM-DD&lt;br /&gt;
            integer limit = (integer)llGetObjectDesc();&lt;br /&gt;
            if(limit&amp;gt;0 &amp;amp;&amp;amp; age&amp;lt;limit)&lt;br /&gt;
            {   key av = (key)llList2String(gAvList,i+1);&lt;br /&gt;
                if(av!=NULL_KEY)&lt;br /&gt;
                {   string name = llList2String(gAvList,i+2);&lt;br /&gt;
                    float duration = 24.0*(limit-age);&lt;br /&gt;
                    string oldName= llGetObjectName();&lt;br /&gt;
                    llSetObjectName(&amp;quot;&amp;quot;);&lt;br /&gt;
                    llWhisper(0,&amp;quot;/me ☠: Sorry &amp;quot;+name+&amp;quot; Your account is too new.&amp;quot;&lt;br /&gt;
                        +&amp;quot;\nPlease feel free to come back in &amp;quot;+(string)((integer)(duration/24))&lt;br /&gt;
                        +&amp;quot; days when you will be above our minimum required account age of &amp;quot;&lt;br /&gt;
                        +(string)((integer)limit)+&amp;quot; days.&amp;quot;);&lt;br /&gt;
                    list data = llGetObjectDetails(llGetKey(), ([OBJECT_OWNER, OBJECT_GROUP]));&lt;br /&gt;
                    key owner = llList2Key(data, 0);&lt;br /&gt;
                    if (owner!=NULL_KEY &lt;br /&gt;
                    || llList2Key(data,1)!=llList2Key(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_GROUP]),0))&lt;br /&gt;
                    {   //is NOT deeded or NOT set to correct parcel group&lt;br /&gt;
                    llOwnerSay(&amp;quot;/me &amp;quot;+llGetRegionName()+&amp;quot; ☠ Sent Home/Banned: \t&amp;quot;+name&lt;br /&gt;
                        +&amp;quot;\t [age: &amp;quot;+(string)age+&amp;quot;/&amp;quot;+(string)limit+&amp;quot;] for &amp;quot;&lt;br /&gt;
                        +(string)((integer)duration/24)+&amp;quot; days.&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if(av!=gOwner)//safer testing&lt;br /&gt;
                    {   //actually try to get the message to their history buffer&lt;br /&gt;
                        llSleep(1.0/(1.01-llGetRegionTimeDilation()));&lt;br /&gt;
                        if(llGetAgentSize(av)!=ZERO_VECTOR)//they may have already left&lt;br /&gt;
                        {   llTeleportAgentHome(av);&lt;br /&gt;
                            llAddToLandBanList(av, duration);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    llSetObjectName(oldName);&lt;br /&gt;
                    gAvList=llDeleteSubList(gAvList,i,i+2);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
DERIVED FROM:&lt;br /&gt;
http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
&lt;br /&gt;
 Question         How can I get the number of days that have elapsed between two Date objects?&lt;br /&gt;
Derived from     A question posed by J. Scott Stanlick&lt;br /&gt;
Topics     Java:Language, Java:API:Internationalization&lt;br /&gt;
Author     Robert Baruch&lt;br /&gt;
Created     Feb 14, 2000     Modified     May 29, 2000 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Answer&lt;br /&gt;
That depends on what you mean by &amp;quot;between&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to find out the number of 24-hour periods between two Date objects d1 and d2 (d2 &amp;gt; d1) then you would do this:&lt;br /&gt;
&lt;br /&gt;
double days = (d2.getTime()-d1.getTime())/1000/60/60/24;&lt;br /&gt;
&lt;br /&gt;
Since Date.getTime returns milliseconds, you divide by 1000 to get seconds, by 60 to get minutes, by 60 again to get hours, and by 24 to get days.&lt;br /&gt;
&lt;br /&gt;
Sometimes this can cause difficulties, especially in countries that have a form of daylight savings time. For example, in the U.S., there is one day in the Fall which has 25 hours, and one day in the Spring which has 23 hours. An elapsed-number-of-days calculation on Dates falling on one of these days may not give the answer you expect.&lt;br /&gt;
&lt;br /&gt;
Anyway, that&#039;s the easy way, and if you&#039;re satisfied with that, then read no further.&lt;br /&gt;
&lt;br /&gt;
If, on the other hand, you mean the number of midnight-crossings (so that the number of days elapsed between 11:00 PM and 1:00 AM the next day is 1) then you&#039;re better off using the Calendar class and computing the Julian Day.&lt;br /&gt;
&lt;br /&gt;
By the way, don&#039;t mistake the Julian Day for the Julian Calendar. The two are different and named after different &amp;quot;Julians&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The Julian Day is defined as the number of days elapsed since Nov 24, 4714 BC, 12:00 GMT Gregorian. The year was chosen as being sufficiently in the past so as not to have negative Julian Days, the date was chosen because of the (in that year) 37-day difference between the Julian and Gregorian calendars (Nov 24, 4714 BC Gregorian would be Jan 1, 4713 BC Julian), and the time was chosen because astronomers do their work at night, and it would be a little confusing (to them) to have the Julian Day change in the middle of their work. (I could be wrong)&lt;br /&gt;
&lt;br /&gt;
Anyway, the algorithm for computing the Julian Day from a Gregorian or Julian calendar date for years 400 AD and above is as follows:&lt;br /&gt;
&lt;br /&gt;
Let the date be Y, M, D, where Y is the AD year, M is the month (January=1, December=12), and D is the day (1-31).&lt;br /&gt;
&lt;br /&gt;
For the following calculations, use integer arithmetic (i.e. lop off the fractional part of any result).&lt;br /&gt;
&lt;br /&gt;
If M==1 or M==2 then Y--, M+=12.&lt;br /&gt;
Let A = Y/100&lt;br /&gt;
Let B = A/4&lt;br /&gt;
Let C = 2-A-B (or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
Let E = 365.25*(Y+4716)&lt;br /&gt;
Let F = 30.6001*(M+1)&lt;br /&gt;
&lt;br /&gt;
Julian Day = C+D+E+F-1524.5&lt;br /&gt;
&lt;br /&gt;
There would be a further adjustment for the time of day, but we&#039;re not looking at that. If you want your Julian Days to start at midnight, subtract 1524 rather than 1524.5.&lt;br /&gt;
&lt;br /&gt;
And so, your number-of-days-elapsed calculation would look like this:&lt;br /&gt;
&lt;br /&gt;
Calendar c1 = new GregorianCalendar();&lt;br /&gt;
Calendar c2 = new GregorianCalendar();&lt;br /&gt;
&lt;br /&gt;
c1.setTime(d1);&lt;br /&gt;
c2.setTime(d2);&lt;br /&gt;
&lt;br /&gt;
long j1 = julian_day(c1.get(YEAR),&lt;br /&gt;
  c1.get(MONTH)+1, c1.get(DAY));&lt;br /&gt;
long j2 = julian_day(c2.get(YEAR),&lt;br /&gt;
  c2.get(MONTH)+1, c2.get(DAY));&lt;br /&gt;
&lt;br /&gt;
long days_elapsed = j2-j1;&lt;br /&gt;
&lt;br /&gt;
And this would properly calculate the number of midnight-crossings between 11:00 PM on one day and 1:00 AM the next day. &lt;br /&gt;
/*&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Send_home_and_ban_avs_less_than_description_field_days_old&amp;diff=485502</id>
		<title>Send home and ban avs less than description field days old</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Send_home_and_ban_avs_less_than_description_field_days_old&amp;diff=485502"/>
		<updated>2009-09-10T01:10:55Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====Send home and ban avs less than description field days old==== =====Modified from script: Days Since===== --BETLOG Hax UTC+10: 20090909 142...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Send home and ban avs less than description field days old====&lt;br /&gt;
=====Modified from script: Days Since=====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090909 1421 [SLT: 20090908 2121]&lt;br /&gt;
&lt;br /&gt;
UTC+10: 20090910 1106 [SLT: 20090909 1806]&lt;br /&gt;
NOTE: I have not tested this at all. Yes really.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Superficially the &#039;kick their ass out&#039; logic seems to work... and I am likely to get distractred from this for some time, so am posting it here so it&#039;s intended purpose/person I wrote it for doesn&#039;t get completely forgotten (by me).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20090909 2049 [SLT: 20090909 0349]&lt;br /&gt;
// For Bettina Tizzy&lt;br /&gt;
//&lt;br /&gt;
// HOW?&lt;br /&gt;
// Make a prim to cover your entry parcel, so avatars arrive inside the prim.&lt;br /&gt;
//  A transparent prim is ideal. &lt;br /&gt;
//  DO NOT link it to anything...unless its to extend the range of this function or to fit a funky shaped entry area.&lt;br /&gt;
// Set the prims description field to the number of days old an avatar must be to enter your sim.&lt;br /&gt;
//  eg: 30&lt;br /&gt;
// Dump this script into the prim.&lt;br /&gt;
// If you are not the land owner you MUST deed the prim to the appropriate group.&lt;br /&gt;
// Get someone younger than the number of days you entered above to walk into the prim to test. &lt;br /&gt;
//     It will NOT eject the prims owner. But will output all the usual messages. &lt;br /&gt;
//&lt;br /&gt;
// WTF?&lt;br /&gt;
// Bettina Tizzy asked for this functionality in group chat.&lt;br /&gt;
// For some time I have wanted to write something to calculate age of avatars in days, so I googled, found some logic, and rewrote it in LSL.&lt;br /&gt;
//&lt;br /&gt;
// NOTE:&lt;br /&gt;
// Excluding people based entirely on their avatar account age is a bit of a bastard act.&lt;br /&gt;
// Therefore people will not like it when it happens to them. So expect this script to cause drama.&lt;br /&gt;
// But if you need a script like this, then you are probably accustomed to drama anyway.&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//            &lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
// AND:&lt;br /&gt;
//   Credit for original logic : Robert Baruch&lt;br /&gt;
//      http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
key         gDataId;&lt;br /&gt;
list        gAvList;&lt;br /&gt;
//string      gName               = &amp;quot;&amp;quot;;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
key         gOwner; //for when its deeded&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer f_daysSince(string input)&lt;br /&gt;
{   list l = llParseString2List(input, [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    integer Y = (integer)llList2String(l,0);&lt;br /&gt;
    integer M = (integer)llList2String(l,1);    &lt;br /&gt;
    integer D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    integer A = Y/100;&lt;br /&gt;
    integer B = A/4;&lt;br /&gt;
    integer C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    float E = 365.25*(Y+4716);&lt;br /&gt;
    float F = 30.6001*(M+1);&lt;br /&gt;
    integer age = C+D+(integer)E+(integer)F-1524;&lt;br /&gt;
//llOwnerSay(&amp;quot;Julian Day = &amp;quot;+(string)age );&lt;br /&gt;
&lt;br /&gt;
    l = llParseString2List(llGetDate(), [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    Y = (integer)llList2String(l,0);&lt;br /&gt;
    M = (integer)llList2String(l,1);    &lt;br /&gt;
    D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    A = Y/100;&lt;br /&gt;
    B = A/4;&lt;br /&gt;
    C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    E = 365.25*(Y+4716);&lt;br /&gt;
    F = 30.6001*(M+1);&lt;br /&gt;
    return C+D+(integer)E+(integer)F-1524-age; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==============================================================&lt;br /&gt;
default &lt;br /&gt;
{   state_entry() &lt;br /&gt;
    {   gOwner = llGetOwner();&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num)&lt;br /&gt;
    {   key av;&lt;br /&gt;
        do{ av = llDetectedKey(--num);&lt;br /&gt;
            if(-1==llListFindList(gAvList,[(string)av]))&lt;br /&gt;
                gAvList += [gDataId=llRequestAgentData(av, DATA_BORN), av, llDetectedName(num)];&lt;br /&gt;
        }while(num&amp;gt;0);&lt;br /&gt;
    }    &lt;br /&gt;
    changed(integer change) &lt;br /&gt;
    {   if(change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
        {   if(llGetOwner()!=NULL_KEY)&lt;br /&gt;
                gOwner = llGetOwner();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {   integer i = llListFindList(gAvList,[queryid]);&lt;br /&gt;
        if(-1&amp;lt;i)&lt;br /&gt;
        {   integer age = f_daysSince(data);//YYYY-MM-DD&lt;br /&gt;
            integer limit = (integer)llGetObjectDesc();&lt;br /&gt;
            if(limit&amp;gt;0 &amp;amp;&amp;amp; age&amp;lt;limit)&lt;br /&gt;
            {   key av = (key)llList2String(gAvList,i+1);&lt;br /&gt;
                if(av!=NULL_KEY)&lt;br /&gt;
                {   string name = llList2String(gAvList,i+2);&lt;br /&gt;
                    float duration = 24.0*(limit-age);&lt;br /&gt;
                    string oldName= llGetObjectName();&lt;br /&gt;
                    llSetObjectName(&amp;quot;&amp;quot;);&lt;br /&gt;
                    llWhisper(0,&amp;quot;/me ☠: Sorry &amp;quot;+name+&amp;quot; Your account is too new.&amp;quot;&lt;br /&gt;
                        +&amp;quot;\nPlease feel free to come back in &amp;quot;+(string)((integer)(duration/24))&lt;br /&gt;
                        +&amp;quot; days when you will be above our minimum required account age of &amp;quot;&lt;br /&gt;
                        +(string)((integer)limit)+&amp;quot; days.&amp;quot;);&lt;br /&gt;
                    list data = llGetObjectDetails(llGetKey(), ([OBJECT_OWNER, OBJECT_GROUP]));&lt;br /&gt;
                    key owner = llList2Key(data, 0);&lt;br /&gt;
                    if (owner!=NULL_KEY &lt;br /&gt;
                    || llList2Key(data,1)!=llList2Key(llGetParcelDetails(llGetPos(), [PARCEL_DETAILS_GROUP]),0))&lt;br /&gt;
                    {   //is NOT deeded or NOT set to correct parcel group&lt;br /&gt;
                    llOwnerSay(&amp;quot;/me &amp;quot;+llGetRegionName()+&amp;quot; ☠ Sent Home/Banned: \t&amp;quot;+name&lt;br /&gt;
                        +&amp;quot;\t [age: &amp;quot;+(string)age+&amp;quot;/&amp;quot;+(string)limit+&amp;quot;] for &amp;quot;&lt;br /&gt;
                        +(string)((integer)duration/24)+&amp;quot; days.&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else if(av!=gOwner)//safer testing&lt;br /&gt;
                    {   //actually try to get the message to their history buffer&lt;br /&gt;
                        llSleep(1.0/(1.01-llGetRegionTimeDilation()));&lt;br /&gt;
                        if(llGetAgentSize(av)!=ZERO_VECTOR)//they may have already left&lt;br /&gt;
                        {   llTeleportAgentHome(av);&lt;br /&gt;
                            llAddToLandBanList(av, duration);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    llSetObjectName(oldName);&lt;br /&gt;
                    gAvList=llDeleteSubList(gAvList,i,i+2);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
DERIVED FROM:&lt;br /&gt;
http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
&lt;br /&gt;
 Question         How can I get the number of days that have elapsed between two Date objects?&lt;br /&gt;
Derived from     A question posed by J. Scott Stanlick&lt;br /&gt;
Topics     Java:Language, Java:API:Internationalization&lt;br /&gt;
Author     Robert Baruch&lt;br /&gt;
Created     Feb 14, 2000     Modified     May 29, 2000 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Answer&lt;br /&gt;
That depends on what you mean by &amp;quot;between&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to find out the number of 24-hour periods between two Date objects d1 and d2 (d2 &amp;gt; d1) then you would do this:&lt;br /&gt;
&lt;br /&gt;
double days = (d2.getTime()-d1.getTime())/1000/60/60/24;&lt;br /&gt;
&lt;br /&gt;
Since Date.getTime returns milliseconds, you divide by 1000 to get seconds, by 60 to get minutes, by 60 again to get hours, and by 24 to get days.&lt;br /&gt;
&lt;br /&gt;
Sometimes this can cause difficulties, especially in countries that have a form of daylight savings time. For example, in the U.S., there is one day in the Fall which has 25 hours, and one day in the Spring which has 23 hours. An elapsed-number-of-days calculation on Dates falling on one of these days may not give the answer you expect.&lt;br /&gt;
&lt;br /&gt;
Anyway, that&#039;s the easy way, and if you&#039;re satisfied with that, then read no further.&lt;br /&gt;
&lt;br /&gt;
If, on the other hand, you mean the number of midnight-crossings (so that the number of days elapsed between 11:00 PM and 1:00 AM the next day is 1) then you&#039;re better off using the Calendar class and computing the Julian Day.&lt;br /&gt;
&lt;br /&gt;
By the way, don&#039;t mistake the Julian Day for the Julian Calendar. The two are different and named after different &amp;quot;Julians&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The Julian Day is defined as the number of days elapsed since Nov 24, 4714 BC, 12:00 GMT Gregorian. The year was chosen as being sufficiently in the past so as not to have negative Julian Days, the date was chosen because of the (in that year) 37-day difference between the Julian and Gregorian calendars (Nov 24, 4714 BC Gregorian would be Jan 1, 4713 BC Julian), and the time was chosen because astronomers do their work at night, and it would be a little confusing (to them) to have the Julian Day change in the middle of their work. (I could be wrong)&lt;br /&gt;
&lt;br /&gt;
Anyway, the algorithm for computing the Julian Day from a Gregorian or Julian calendar date for years 400 AD and above is as follows:&lt;br /&gt;
&lt;br /&gt;
Let the date be Y, M, D, where Y is the AD year, M is the month (January=1, December=12), and D is the day (1-31).&lt;br /&gt;
&lt;br /&gt;
For the following calculations, use integer arithmetic (i.e. lop off the fractional part of any result).&lt;br /&gt;
&lt;br /&gt;
If M==1 or M==2 then Y--, M+=12.&lt;br /&gt;
Let A = Y/100&lt;br /&gt;
Let B = A/4&lt;br /&gt;
Let C = 2-A-B (or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
Let E = 365.25*(Y+4716)&lt;br /&gt;
Let F = 30.6001*(M+1)&lt;br /&gt;
&lt;br /&gt;
Julian Day = C+D+E+F-1524.5&lt;br /&gt;
&lt;br /&gt;
There would be a further adjustment for the time of day, but we&#039;re not looking at that. If you want your Julian Days to start at midnight, subtract 1524 rather than 1524.5.&lt;br /&gt;
&lt;br /&gt;
And so, your number-of-days-elapsed calculation would look like this:&lt;br /&gt;
&lt;br /&gt;
Calendar c1 = new GregorianCalendar();&lt;br /&gt;
Calendar c2 = new GregorianCalendar();&lt;br /&gt;
&lt;br /&gt;
c1.setTime(d1);&lt;br /&gt;
c2.setTime(d2);&lt;br /&gt;
&lt;br /&gt;
long j1 = julian_day(c1.get(YEAR),&lt;br /&gt;
  c1.get(MONTH)+1, c1.get(DAY));&lt;br /&gt;
long j2 = julian_day(c2.get(YEAR),&lt;br /&gt;
  c2.get(MONTH)+1, c2.get(DAY));&lt;br /&gt;
&lt;br /&gt;
long days_elapsed = j2-j1;&lt;br /&gt;
&lt;br /&gt;
And this would properly calculate the number of midnight-crossings between 11:00 PM on one day and 1:00 AM the next day. &lt;br /&gt;
/*&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Days_Since&amp;diff=484593</id>
		<title>Days Since</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Days_Since&amp;diff=484593"/>
		<updated>2009-09-09T07:01:52Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Days Since====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090909 1421 [SLT: 20090908 2121]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
// AND:&lt;br /&gt;
//   Credit for original logic : Robert Baruch&lt;br /&gt;
//      http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
key         gDataId;&lt;br /&gt;
//string      gName               = &amp;quot;&amp;quot;;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer f_daysSince(string input)&lt;br /&gt;
{   list l = llParseString2List(input, [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    integer Y = (integer)llList2String(l,0);&lt;br /&gt;
    integer M = (integer)llList2String(l,1);    &lt;br /&gt;
    integer D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    integer A = Y/100;&lt;br /&gt;
    integer B = A/4;&lt;br /&gt;
    integer C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    float E = 365.25*(Y+4716);&lt;br /&gt;
    float F = 30.6001*(M+1);&lt;br /&gt;
    integer age = C+D+(integer)E+(integer)F-1524;&lt;br /&gt;
//llOwnerSay(&amp;quot;Julian Day = &amp;quot;+(string)age );&lt;br /&gt;
&lt;br /&gt;
    l = llParseString2List(llGetDate(), [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    Y = (integer)llList2String(l,0);&lt;br /&gt;
    M = (integer)llList2String(l,1);    &lt;br /&gt;
    D = (integer)llList2String(l,2);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    A = Y/100;&lt;br /&gt;
    B = A/4;&lt;br /&gt;
    C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    E = 365.25*(Y+4716);&lt;br /&gt;
    F = 30.6001*(M+1);&lt;br /&gt;
    return C+D+(integer)E+(integer)F-1524-age; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==============================================================&lt;br /&gt;
default &lt;br /&gt;
{   state_entry() &lt;br /&gt;
    {   llListen(33, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {   //gName = llDetectedName(0);&lt;br /&gt;
        gDataId = llRequestAgentData(llDetectedKey(0), DATA_BORN);&lt;br /&gt;
    }    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {   if((key)message)&lt;br /&gt;
            gDataId = llRequestAgentData((key)message, DATA_BORN);&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryid, string data) &lt;br /&gt;
    {   if(gDataId==queryid)&lt;br /&gt;
        {   llOwnerSay(&amp;quot;Age: &amp;quot;+(string)&lt;br /&gt;
                f_daysSince(data)//YYYY-MM-DD&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
DERIVED FROM:&lt;br /&gt;
http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
&lt;br /&gt;
 Question         How can I get the number of days that have elapsed between two Date objects?&lt;br /&gt;
Derived from     A question posed by J. Scott Stanlick&lt;br /&gt;
Topics     Java:Language, Java:API:Internationalization&lt;br /&gt;
Author     Robert Baruch&lt;br /&gt;
Created     Feb 14, 2000     Modified     May 29, 2000 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Answer&lt;br /&gt;
That depends on what you mean by &amp;quot;between&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to find out the number of 24-hour periods between two Date objects d1 and d2 (d2 &amp;gt; d1) then you would do this:&lt;br /&gt;
&lt;br /&gt;
double days = (d2.getTime()-d1.getTime())/1000/60/60/24;&lt;br /&gt;
&lt;br /&gt;
Since Date.getTime returns milliseconds, you divide by 1000 to get seconds, by 60 to get minutes, by 60 again to get hours, and by 24 to get days.&lt;br /&gt;
&lt;br /&gt;
Sometimes this can cause difficulties, especially in countries that have a form of daylight savings time. For example, in the U.S., there is one day in the Fall which has 25 hours, and one day in the Spring which has 23 hours. An elapsed-number-of-days calculation on Dates falling on one of these days may not give the answer you expect.&lt;br /&gt;
&lt;br /&gt;
Anyway, that&#039;s the easy way, and if you&#039;re satisfied with that, then read no further.&lt;br /&gt;
&lt;br /&gt;
If, on the other hand, you mean the number of midnight-crossings (so that the number of days elapsed between 11:00 PM and 1:00 AM the next day is 1) then you&#039;re better off using the Calendar class and computing the Julian Day.&lt;br /&gt;
&lt;br /&gt;
By the way, don&#039;t mistake the Julian Day for the Julian Calendar. The two are different and named after different &amp;quot;Julians&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The Julian Day is defined as the number of days elapsed since Nov 24, 4714 BC, 12:00 GMT Gregorian. The year was chosen as being sufficiently in the past so as not to have negative Julian Days, the date was chosen because of the (in that year) 37-day difference between the Julian and Gregorian calendars (Nov 24, 4714 BC Gregorian would be Jan 1, 4713 BC Julian), and the time was chosen because astronomers do their work at night, and it would be a little confusing (to them) to have the Julian Day change in the middle of their work. (I could be wrong)&lt;br /&gt;
&lt;br /&gt;
Anyway, the algorithm for computing the Julian Day from a Gregorian or Julian calendar date for years 400 AD and above is as follows:&lt;br /&gt;
&lt;br /&gt;
Let the date be Y, M, D, where Y is the AD year, M is the month (January=1, December=12), and D is the day (1-31).&lt;br /&gt;
&lt;br /&gt;
For the following calculations, use integer arithmetic (i.e. lop off the fractional part of any result).&lt;br /&gt;
&lt;br /&gt;
If M==1 or M==2 then Y--, M+=12.&lt;br /&gt;
Let A = Y/100&lt;br /&gt;
Let B = A/4&lt;br /&gt;
Let C = 2-A-B (or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
Let E = 365.25*(Y+4716)&lt;br /&gt;
Let F = 30.6001*(M+1)&lt;br /&gt;
&lt;br /&gt;
Julian Day = C+D+E+F-1524.5&lt;br /&gt;
&lt;br /&gt;
There would be a further adjustment for the time of day, but we&#039;re not looking at that. If you want your Julian Days to start at midnight, subtract 1524 rather than 1524.5.&lt;br /&gt;
&lt;br /&gt;
And so, your number-of-days-elapsed calculation would look like this:&lt;br /&gt;
&lt;br /&gt;
Calendar c1 = new GregorianCalendar();&lt;br /&gt;
Calendar c2 = new GregorianCalendar();&lt;br /&gt;
&lt;br /&gt;
c1.setTime(d1);&lt;br /&gt;
c2.setTime(d2);&lt;br /&gt;
&lt;br /&gt;
long j1 = julian_day(c1.get(YEAR),&lt;br /&gt;
  c1.get(MONTH)+1, c1.get(DAY));&lt;br /&gt;
long j2 = julian_day(c2.get(YEAR),&lt;br /&gt;
  c2.get(MONTH)+1, c2.get(DAY));&lt;br /&gt;
&lt;br /&gt;
long days_elapsed = j2-j1;&lt;br /&gt;
&lt;br /&gt;
And this would properly calculate the number of midnight-crossings between 11:00 PM on one day and 1:00 AM the next day. &lt;br /&gt;
/*&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=484552</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=484552"/>
		<updated>2009-09-09T04:28:34Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A lot of this is basically just rubbish. But it is a useful reference for various things, possibly not specifically the thing the script addresses, but often just secondary stuff.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generally I put things here to refer people to when they ask (again).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although a lot of it is here simply to reinforce in peoples minds that when I write something for them, and add an attribution license, that I expect them to comply with it, and that by making it public here it means that not only can others benefit, but that others know who actually wrote it, and often for whom, and why.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes its just here because i&#039;ve seen something else inworld that was so bad i felt i needed to contribute something less insane.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
But like almost everything i write; when i re-read it months later theres almost always some glaring oversight, or completely trash/facepalm/&#039;ZOMG WTF was i thinking?&#039; elements in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Days_Since&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Days_Since&amp;diff=484542</id>
		<title>Days Since</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Days_Since&amp;diff=484542"/>
		<updated>2009-09-09T04:27:49Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====Days Since==== --BETLOG Hax UTC+10: 20090909 1421 [SLT: 20090908 2121]  &amp;lt;lsl&amp;gt; //===========================================================...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Days Since====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090909 1421 [SLT: 20090908 2121]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
// AND:&lt;br /&gt;
//   Credit for original logic : Robert Baruch&lt;br /&gt;
//      http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// SHARED CONFIGURATION&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
key         gDataId;&lt;br /&gt;
//string      gName               = &amp;quot;&amp;quot;;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer f_daysSince(string input)&lt;br /&gt;
{   list l = llParseString2List(input, [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    integer Y = (integer)llStringTrim(llList2String(l,0),STRING_TRIM);&lt;br /&gt;
    integer M = (integer)llStringTrim(llList2String(l,1),STRING_TRIM);    &lt;br /&gt;
    integer D = (integer)llStringTrim(llList2String(l,2),STRING_TRIM);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    integer A = Y/100;&lt;br /&gt;
    integer B = A/4;&lt;br /&gt;
    integer C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    float E = 365.25*(Y+4716);&lt;br /&gt;
    float F = 30.6001*(M+1);&lt;br /&gt;
    integer age = C+D+(integer)E+(integer)F-1524;&lt;br /&gt;
//llOwnerSay(&amp;quot;Julian Day = &amp;quot;+(string)age );&lt;br /&gt;
&lt;br /&gt;
    l = llParseString2List(llGetDate(), [&amp;quot;-&amp;quot;],[]);&lt;br /&gt;
    Y = (integer)llStringTrim(llList2String(l,0),STRING_TRIM);&lt;br /&gt;
    M = (integer)llStringTrim(llList2String(l,1),STRING_TRIM);    &lt;br /&gt;
    D = (integer)llStringTrim(llList2String(l,2),STRING_TRIM);&lt;br /&gt;
    if(M==1 || M==2)&lt;br /&gt;
    {   --Y;&lt;br /&gt;
        M+=12;&lt;br /&gt;
    }&lt;br /&gt;
    A = Y/100;&lt;br /&gt;
    B = A/4;&lt;br /&gt;
    C = 2-A-B; //(or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
    E = 365.25*(Y+4716);&lt;br /&gt;
    F = 30.6001*(M+1);&lt;br /&gt;
    return C+D+(integer)E+(integer)F-1524-age; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//==============================================================&lt;br /&gt;
default &lt;br /&gt;
{   state_entry() &lt;br /&gt;
    {   llListen(33, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {   //gName = llDetectedName(0);&lt;br /&gt;
        gDataId = llRequestAgentData(llDetectedKey(0), DATA_BORN);&lt;br /&gt;
    }    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {   if((key)message)&lt;br /&gt;
            gDataId = llRequestAgentData((key)message, DATA_BORN);&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryid, string data) &lt;br /&gt;
    {   if(gDataId==queryid)&lt;br /&gt;
        {   llOwnerSay(&amp;quot;Age: &amp;quot;+(string)&lt;br /&gt;
                f_daysSince(data)//YYYY-MM-DD&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
DERIVED FROM:&lt;br /&gt;
http://www.jguru.com/faq/view.jsp?EID=14092&lt;br /&gt;
&lt;br /&gt;
 Question         How can I get the number of days that have elapsed between two Date objects?&lt;br /&gt;
Derived from     A question posed by J. Scott Stanlick&lt;br /&gt;
Topics     Java:Language, Java:API:Internationalization&lt;br /&gt;
Author     Robert Baruch&lt;br /&gt;
Created     Feb 14, 2000     Modified     May 29, 2000 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Answer&lt;br /&gt;
That depends on what you mean by &amp;quot;between&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you want to find out the number of 24-hour periods between two Date objects d1 and d2 (d2 &amp;gt; d1) then you would do this:&lt;br /&gt;
&lt;br /&gt;
double days = (d2.getTime()-d1.getTime())/1000/60/60/24;&lt;br /&gt;
&lt;br /&gt;
Since Date.getTime returns milliseconds, you divide by 1000 to get seconds, by 60 to get minutes, by 60 again to get hours, and by 24 to get days.&lt;br /&gt;
&lt;br /&gt;
Sometimes this can cause difficulties, especially in countries that have a form of daylight savings time. For example, in the U.S., there is one day in the Fall which has 25 hours, and one day in the Spring which has 23 hours. An elapsed-number-of-days calculation on Dates falling on one of these days may not give the answer you expect.&lt;br /&gt;
&lt;br /&gt;
Anyway, that&#039;s the easy way, and if you&#039;re satisfied with that, then read no further.&lt;br /&gt;
&lt;br /&gt;
If, on the other hand, you mean the number of midnight-crossings (so that the number of days elapsed between 11:00 PM and 1:00 AM the next day is 1) then you&#039;re better off using the Calendar class and computing the Julian Day.&lt;br /&gt;
&lt;br /&gt;
By the way, don&#039;t mistake the Julian Day for the Julian Calendar. The two are different and named after different &amp;quot;Julians&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The Julian Day is defined as the number of days elapsed since Nov 24, 4714 BC, 12:00 GMT Gregorian. The year was chosen as being sufficiently in the past so as not to have negative Julian Days, the date was chosen because of the (in that year) 37-day difference between the Julian and Gregorian calendars (Nov 24, 4714 BC Gregorian would be Jan 1, 4713 BC Julian), and the time was chosen because astronomers do their work at night, and it would be a little confusing (to them) to have the Julian Day change in the middle of their work. (I could be wrong)&lt;br /&gt;
&lt;br /&gt;
Anyway, the algorithm for computing the Julian Day from a Gregorian or Julian calendar date for years 400 AD and above is as follows:&lt;br /&gt;
&lt;br /&gt;
Let the date be Y, M, D, where Y is the AD year, M is the month (January=1, December=12), and D is the day (1-31).&lt;br /&gt;
&lt;br /&gt;
For the following calculations, use integer arithmetic (i.e. lop off the fractional part of any result).&lt;br /&gt;
&lt;br /&gt;
If M==1 or M==2 then Y--, M+=12.&lt;br /&gt;
Let A = Y/100&lt;br /&gt;
Let B = A/4&lt;br /&gt;
Let C = 2-A-B (or C=0 if you&#039;re using the Julian calendar)&lt;br /&gt;
Let E = 365.25*(Y+4716)&lt;br /&gt;
Let F = 30.6001*(M+1)&lt;br /&gt;
&lt;br /&gt;
Julian Day = C+D+E+F-1524.5&lt;br /&gt;
&lt;br /&gt;
There would be a further adjustment for the time of day, but we&#039;re not looking at that. If you want your Julian Days to start at midnight, subtract 1524 rather than 1524.5.&lt;br /&gt;
&lt;br /&gt;
And so, your number-of-days-elapsed calculation would look like this:&lt;br /&gt;
&lt;br /&gt;
Calendar c1 = new GregorianCalendar();&lt;br /&gt;
Calendar c2 = new GregorianCalendar();&lt;br /&gt;
&lt;br /&gt;
c1.setTime(d1);&lt;br /&gt;
c2.setTime(d2);&lt;br /&gt;
&lt;br /&gt;
long j1 = julian_day(c1.get(YEAR),&lt;br /&gt;
  c1.get(MONTH)+1, c1.get(DAY));&lt;br /&gt;
long j2 = julian_day(c2.get(YEAR),&lt;br /&gt;
  c2.get(MONTH)+1, c2.get(DAY));&lt;br /&gt;
&lt;br /&gt;
long days_elapsed = j2-j1;&lt;br /&gt;
&lt;br /&gt;
And this would properly calculate the number of midnight-crossings between 11:00 PM on one day and 1:00 AM the next day. &lt;br /&gt;
/*&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=463183</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=463183"/>
		<updated>2009-08-17T20:52:54Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A lot of this is basically just rubbish. But it is a useful reference for various things, possibly not specifically the thing the script addresses, but often just secondary stuff.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generally I put things here to refer people to when they ask (again).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Although a lot of it is here simply to reinforce in peoples minds that when I write something for them, and add an attribution license, that I expect them to comply with it, and that by making it public here it means that not only can others benefit, but that others know who actually wrote it, and often for whom, and why.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sometimes its just here because i&#039;ve seen something else inworld that was so bad i felt i needed to contribute something less insane.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
But like almost everything i write; when i re-read it months later theres almost always some glaring oversight, or completely trash/facepalm/&#039;ZOMG WTF was i thinking?&#039; elements in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=463123</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=463123"/>
		<updated>2009-08-17T20:35:10Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Send_vector_as_on_rez_param&amp;diff=463113</id>
		<title>Send vector as on rez param</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Send_vector_as_on_rez_param&amp;diff=463113"/>
		<updated>2009-08-17T20:34:38Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Sneakin&amp;diff=453812</id>
		<title>Sneakin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Sneakin&amp;diff=453812"/>
		<updated>2009-08-09T18:07:19Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====Theme music when you  walk/run/crouchwalk====  --BETLOG Hax UTC+10: 20090810 0403 [SLT: 20090809 1103]  &amp;lt;lsl&amp;gt; // BETLOG Hax // UTC+10: 2009...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Theme music when you  walk/run/crouchwalk====&lt;br /&gt;
&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090810 0403 [SLT: 20090809 1103]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// UTC+10: 20090728 0733 [SLT: 20090727 1433]&lt;br /&gt;
// Was Messamo House&#039;s script, which he may have copy pasted from Hen Streeter or vice versa, but i *totally* rewrote it.. TOTALLY&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
key     gMode            = NULL_KEY;&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   llStopSound();&lt;br /&gt;
        llSetTimerEvent(0.333333);&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   integer i = llGetAgentInfo(llGetOwner());&lt;br /&gt;
        key mode=NULL_KEY;&lt;br /&gt;
        if(i &amp;amp; AGENT_WALKING)&lt;br /&gt;
        {   if(llVecMag(llList2Vector(llGetObjectDetails(llGetOwner(), ([OBJECT_VELOCITY])),0))&amp;gt;4.0)&lt;br /&gt;
                mode=&amp;quot;770cf677-5fda-56fe-85dd-ee1f07c63005&amp;quot;;//run&lt;br /&gt;
            else if(i &amp;amp; AGENT_CROUCHING)&lt;br /&gt;
                mode=&amp;quot;f7db8364-4369-712f-f034-92799ee26193&amp;quot;;//crouch&lt;br /&gt;
            else&lt;br /&gt;
                mode=&amp;quot;cc493463-b22d-cf0f-49ef-285e641a87f4&amp;quot;;//walk&lt;br /&gt;
        }&lt;br /&gt;
        if(gMode!=mode)&lt;br /&gt;
        {   gMode=mode;&lt;br /&gt;
            llStopSound();        &lt;br /&gt;
            if(mode!=NULL_KEY)&lt;br /&gt;
                llLoopSound(mode, 1.0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432373</id>
		<title>Visit Monitor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432373"/>
		<updated>2009-07-15T03:17:50Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Visit Monitor====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090715 1159 [SLT: 20090714 1859]&lt;br /&gt;
&lt;br /&gt;
Volumedetect (collision based) prim that records avatars names, number of visits, and time (in UTC)&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
Written in response to Firery Broome&#039;s request to &amp;quot;just add a few simple things&amp;quot; ...Resulting, as usual :)  in an almost total rewrite, and functional differences to the original.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Re-posting here as S.A.3.0 licence to re-assert its original public status and that of my rewrite.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Not comprehensively tested, so may have some stupid in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TO USE:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ADD YOUR EMAIL ADDRESS TO THE GLOBAL VARIABLES&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Put script in a prim, it&#039;ll be phantom from then on so don&#039;t link it to anything thats not going to be part of the collision sensing prim(s)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Any avatars colliding with this prim will have their name added to the visitor list.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Best placement is in avatar arrival areas, like forced TP parcels, preferably where avs will not be constantly colliding with the prim, but rather only collide once when they arrive in your sim/parcel.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If the script&#039;s memory becomes too full due to list size it will attempt to dump list to email and reset... but I havent&#039;t tested if 512bytes is even enough to do this successfully... so value may need adjustment.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
//&lt;br /&gt;
// Almost totally rewritten by BETLOG Hax&lt;br /&gt;
//  UTC+10: 20090713 2306 [SLT: 20090713 0606]&lt;br /&gt;
//  To remove silly guff and reformat (sheesh WHITESPACE people!), added some more useful stuff.&lt;br /&gt;
//  For Firery Broome&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// ------ CONFIGURATION ------&lt;br /&gt;
string      gEmail              = &amp;quot;&amp;quot;;//************** ADD YOUR EMAIL ADDRESS HERE ****************&lt;br /&gt;
float       gFreq               = 604800.0;//60*60*24*7=604800 - 1 WEEK&lt;br /&gt;
&lt;br /&gt;
// ------ CORE CODE ------&lt;br /&gt;
list        gList               = [];&lt;br /&gt;
&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sayHelp()&lt;br /&gt;
{   llOwnerSay( &amp;quot;This object records the names of everyone who collides with it.&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;reset list&#039; OR &#039;email list&#039; - Emails the names on the list and resets.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_output(integer mail)&lt;br /&gt;
{   string text;&lt;br /&gt;
    integer length;&lt;br /&gt;
    integer i = (gList!=[])-1;&lt;br /&gt;
    if(i&amp;lt;2)&lt;br /&gt;
        llOwnerSay(&amp;quot;No data&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
    {   string s = llGetObjectName();&lt;br /&gt;
        llSetObjectName(&amp;quot; &amp;quot;);&lt;br /&gt;
        while(i&amp;gt;-1)&lt;br /&gt;
        {   text += &amp;quot;Name: &amp;quot;+llList2String(gList, i-2)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
                &amp;quot; Visit: &amp;quot;+(string)llList2Integer(gList, i-1)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
                &amp;quot; Last :&amp;quot;+llList2String(gList, i)+&amp;quot;[UTC]\n&amp;quot;;&lt;br /&gt;
            length = llStringLength(text);&lt;br /&gt;
            if(mail &amp;amp;&amp;amp; length&amp;gt;=3500)//partial send to avoid email overflow&lt;br /&gt;
            {   if(0&amp;lt;llSubStringIndex(gEmail,&amp;quot;@&amp;quot;))&lt;br /&gt;
                {   llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List &amp;quot;+(string)llGetTimestamp(), text);&lt;br /&gt;
                    text=&amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else if (!mail &amp;amp;&amp;amp; length&amp;gt;=240)//partial send to avoid text chat overflow&lt;br /&gt;
            {   llOwnerSay(text);&lt;br /&gt;
                text=&amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            i-=3;&lt;br /&gt;
        }&lt;br /&gt;
        if(mail)//normal output&lt;br /&gt;
        {   if(0&amp;lt;llSubStringIndex(gEmail,&amp;quot;@&amp;quot;))&lt;br /&gt;
                llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List 1/1 &amp;quot;+(string)llGetTimestamp(), text);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(text);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
        f_sayHelp();&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()    &lt;br /&gt;
    {   if(llGetFreeMemory()&amp;lt;17000)&lt;br /&gt;
            llOwnerSay(&amp;quot;RECOMPILE THIS IN MONO. (it&#039;ll still work otherwise, just not as well.)&amp;quot;);&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;OK Running.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gFreq); &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   llSetTimerEvent(0.0);&lt;br /&gt;
        f_output(1);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    } &lt;br /&gt;
    touch_start( integer num)&lt;br /&gt;
    {   if (llDetectedKey(num)==llGetOwner())&lt;br /&gt;
            f_sayHelp();&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num) &lt;br /&gt;
    {   string detected_name;&lt;br /&gt;
        integer index;&lt;br /&gt;
        string segment;&lt;br /&gt;
        integer start;&lt;br /&gt;
        integer visits;        &lt;br /&gt;
        do&lt;br /&gt;
        {   --num;&lt;br /&gt;
            if(llDetectedType(num)&amp;amp;AGENT&lt;br /&gt;
             &amp;amp;&amp;amp; llDetectedKey(num)!=llGetOwner()//rem out to test on yourself&lt;br /&gt;
             )&lt;br /&gt;
            {   detected_name = llDetectedName(num);&lt;br /&gt;
                if(llGetFreeMemory()&amp;lt;512)&lt;br /&gt;
                    llSetTimerEvent(0.1);&lt;br /&gt;
                else&lt;br /&gt;
                {   index = llListFindList(gList, [detected_name]);&lt;br /&gt;
                    if(-1==index)&lt;br /&gt;
                    {    gList += [detected_name]+[1]+[llGetTimestamp()];&lt;br /&gt;
//llOwnerSay(&amp;quot;Adding new visitor: \n&amp;quot;+llList2CSV(gList));&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {   gList = llListReplaceList(gList, [detected_name]+[llList2Integer(gList, index+1)+1]+[llGetTimestamp()], index, index+2);&lt;br /&gt;
//llOwnerSay(&amp;quot;Updating visits: \n&amp;quot;+llList2CSV(gList));                        &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        } while(num&amp;gt;-1);&lt;br /&gt;
    }&lt;br /&gt;
    listen( integer channel, string name, key id, string message )&lt;br /&gt;
    {   if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
        {   f_sayHelp();&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;say list&amp;quot; || message == &amp;quot;output list&amp;quot; )&lt;br /&gt;
        {   f_output(0);&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;email list&amp;quot; || message == &amp;quot;reset list&amp;quot; || message == &amp;quot;send email&amp;quot; )&lt;br /&gt;
        {   llOwnerSay( &amp;quot;Sending email (incurs a 20 second delay) and resetting...&amp;quot;);&lt;br /&gt;
            f_output(1);&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The original script.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Global variables change these to match your specifics&lt;br /&gt;
&lt;br /&gt;
float range = 10.0; // search radius, in meters&lt;br /&gt;
float rate = 1.0; // time between searches, in seconds&lt;br /&gt;
&lt;br /&gt;
// add your email adress inside the quotes&lt;br /&gt;
string email_address = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//add the name of the location if you want (the email will have the sim name and cordinates of &lt;br /&gt;
// the counter already in it) &lt;br /&gt;
string location_name = &amp;quot;Your Location&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//dont change these &lt;br /&gt;
&lt;br /&gt;
list single_name_list;&lt;br /&gt;
list visitor_list;&lt;br /&gt;
//end no change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Returns true if &amp;quot;name&amp;quot; is already on the visitor_list and doesnt add it the list again &lt;br /&gt;
integer isNameOnList( string name )&lt;br /&gt;
{&lt;br /&gt;
list single_name_list;&lt;br /&gt;
single_name_list += name;&lt;br /&gt;
&lt;br /&gt;
return (-1 != llListFindList( visitor_list, single_name_list ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// sends email to the address above ,if added &lt;br /&gt;
&lt;br /&gt;
sendEmail()&lt;br /&gt;
{&lt;br /&gt;
string csv = llList2CSV( visitor_list );&lt;br /&gt;
llEmail( email_address, &amp;quot;Visitor List: &amp;quot; + location_name, csv );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//self explanatory &lt;br /&gt;
&lt;br /&gt;
resetList()&lt;br /&gt;
{&lt;br /&gt;
single_name_list = llDeleteSubList(single_name_list, 0, llGetListLength(single_name_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Help commands&lt;br /&gt;
sayHelp( integer is_owner )&lt;br /&gt;
{&lt;br /&gt;
if( is_owner )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;This object records the names of everyone who&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;comes within &amp;quot;+ (string)((integer)range) + &amp;quot; meters.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
llSay( 0, &amp;quot;&#039;reset list&#039; - Removes all the names from the list.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039; email list&#039; - Emails the names on the list.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Sorry, only the owner can use this object.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// state the script starts in &lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
llSay(0, &amp;quot;The owner can say &#039;help&#039; for instructions.&amp;quot;);&lt;br /&gt;
llSensorRepeat( &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, range, TWO_PI, rate );&lt;br /&gt;
llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//change this to how often you want the script to email the visitor list to you (or comment it out if you dont want the email .... by default its set to email you every hr then reset itself&lt;br /&gt;
llSetTimerEvent( 60 * 60 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Sends email and resets list as set in the settimerevent above&lt;br /&gt;
timer()&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
resetList();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//says help if owner clicks on it &lt;br /&gt;
&lt;br /&gt;
touch_start( integer num_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; num_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( llDetectedKey(i) == llGetOwner() );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//detects avatars and keeps time &lt;br /&gt;
&lt;br /&gt;
sensor( integer number_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; number_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
// Don&#039;t ever add the owner to the list.&lt;br /&gt;
&lt;br /&gt;
if( llDetectedKey( i ) != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
string detected_name = llDetectedName( i );&lt;br /&gt;
if( isNameOnList( detected_name ) == FALSE )&lt;br /&gt;
{&lt;br /&gt;
float seconds = llGetWallclock();&lt;br /&gt;
float minutes = seconds / 60.0;&lt;br /&gt;
float hours = minutes / 60.0;&lt;br /&gt;
integer hours_int = (integer) hours;&lt;br /&gt;
integer minutes_int = ((integer)minutes) % 60;&lt;br /&gt;
if( minutes_int &amp;lt; 10 )&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:0&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
visitor_list += detected_name;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Listens for commands from the Owner&lt;br /&gt;
&lt;br /&gt;
listen( integer channel, string name, key id, string message )&lt;br /&gt;
{&lt;br /&gt;
if( id != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( TRUE );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;say list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Visitor List:&amp;quot; );&lt;br /&gt;
integer len = llGetListLength( visitor_list );&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; len; i++ )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, llList2String(visitor_list, i) );&lt;br /&gt;
}&lt;br /&gt;
llSay( 0, &amp;quot;Total = &amp;quot; + (string)len ); &lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;email list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
llSay(0, &amp;quot;Emailing list&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;reset list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=432333</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=432333"/>
		<updated>2009-07-15T02:29:49Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Send_vector_as_on_rez_param&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Visit_Monitor&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Visitor_Monitor&amp;diff=432313</id>
		<title>Visitor Monitor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Visitor_Monitor&amp;diff=432313"/>
		<updated>2009-07-15T02:27:46Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: moved Visitor Monitor to Visit Monitor:&amp;amp;#32;oops, used superseded script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Visit Monitor]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432303</id>
		<title>Visit Monitor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432303"/>
		<updated>2009-07-15T02:27:46Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: moved Visitor Monitor to Visit Monitor:&amp;amp;#32;oops, used superseded script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Visit Monitor====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090715 1159 [SLT: 20090714 1859]&lt;br /&gt;
&lt;br /&gt;
Volumedetect (collision based) prim that records avatars names, number of visits, and time (in UTC)&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
Written in response to Firery Broome&#039;s request to &amp;quot;just add a few simple things&amp;quot; ...Resulting, as usual :)  in an almost total rewrite, and functional differences to the original.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Re-posting here as S.A.3.0 licence to re-assert its original public status and that of my rewrite.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Not comprehensively tested, so may have some stupid in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TO USE:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ADD YOUR EMAIL ADDRESS TO THE GLOBAL VARIABLES&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Put script in a prim, it&#039;ll be phantom from then on so don&#039;t link it to anything thats not going to be part of the collision sensing prim(s)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Any avatars colliding with this prim will have their name added to the visitor list.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Best placement is in avatar arrival areas, like forced TP parcels, preferably where avs will not be constantly colliding with the prim, but rather only collide once when they arrive in your sim/parcel.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If the script&#039;s memory becomes too full due to list size it will attempt to dump list to email and reset... but I havent&#039;t tested if 512bytes is even enough to do this successfully... so value may need adjustment.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
//&lt;br /&gt;
// Almost totally rewritten by BETLOG Hax&lt;br /&gt;
//  UTC+10: 20090713 2306 [SLT: 20090713 0606]&lt;br /&gt;
//  To remove silly guff and reformat (sheesh WHITESPACE people!), added some more useful stuff.&lt;br /&gt;
//  For Firery Broome&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// ------ CONFIGURATION ------&lt;br /&gt;
string      gEmail              = &amp;quot;&amp;quot;;//************** ADD YOUR EMAIL ADDRESS HERE ****************&lt;br /&gt;
float       gFreq               = 604800.0;//60*60*24*7=604800 - 1 WEEK&lt;br /&gt;
&lt;br /&gt;
// ------ CORE CODE ------&lt;br /&gt;
list        gList               = [];&lt;br /&gt;
&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sayHelp()&lt;br /&gt;
{   llOwnerSay( &amp;quot;This object records the names of everyone who collides with it.&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;reset list&#039; OR &#039;email list&#039; - Emails the names on the list and resets.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_output(integer mail)&lt;br /&gt;
{   string text;&lt;br /&gt;
    integer length;&lt;br /&gt;
    integer i = (gList!=[])-1;&lt;br /&gt;
    if(i&amp;lt;2)&lt;br /&gt;
        llOwnerSay(&amp;quot;No data&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
    {   string s = llGetObjectName();&lt;br /&gt;
        llSetObjectName(&amp;quot; &amp;quot;);&lt;br /&gt;
        while(i&amp;gt;-1)&lt;br /&gt;
        {   text += &amp;quot;Name: &amp;quot;+llList2String(gList, i-2)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
                &amp;quot; Visit: &amp;quot;+(string)llList2Integer(gList, i-1)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
                &amp;quot; Last :&amp;quot;+llList2String(gList, i)+&amp;quot;[UTC]\n&amp;quot;;&lt;br /&gt;
            length = llStringLength(text);&lt;br /&gt;
            if(mail &amp;amp;&amp;amp; length&amp;gt;=3500)//partial send to avoid email overflow&lt;br /&gt;
            {   if(0&amp;lt;llSubStringIndex(gEmail,&amp;quot;@&amp;quot;))&lt;br /&gt;
                {   llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List &amp;quot;+(string)llGetTimestamp(), text);&lt;br /&gt;
                    text=&amp;quot;&amp;quot;;//if you havent entered an email address this will simply NOT SEND THE WHOLE LIST&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else if (!mail &amp;amp;&amp;amp; length&amp;gt;=240)//partial send to avoid text chat overflow&lt;br /&gt;
            {   llOwnerSay(text);&lt;br /&gt;
                text=&amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            i-=3;&lt;br /&gt;
        }&lt;br /&gt;
        if(mail)//normal output&lt;br /&gt;
        {   if(0&amp;lt;llSubStringIndex(gEmail,&amp;quot;@&amp;quot;))&lt;br /&gt;
                llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List 1/1 &amp;quot;+(string)llGetTimestamp(), text);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(text);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
        f_sayHelp();&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()    &lt;br /&gt;
    {   if(llGetFreeMemory()&amp;lt;17000)&lt;br /&gt;
            llOwnerSay(&amp;quot;RECOMPILE THIS IN MONO. (it&#039;ll still work otherwise, just not as well.)&amp;quot;);&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;OK Running.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gFreq); &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   llSetTimerEvent(0.0);&lt;br /&gt;
        f_output(1);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    } &lt;br /&gt;
    touch_start( integer num)&lt;br /&gt;
    {   if (llDetectedKey(num)==llGetOwner())&lt;br /&gt;
            f_sayHelp();&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num) &lt;br /&gt;
    {   string detected_name;&lt;br /&gt;
        integer index;&lt;br /&gt;
        string segment;&lt;br /&gt;
        integer start;&lt;br /&gt;
        integer visits;        &lt;br /&gt;
        do&lt;br /&gt;
        {   --num;&lt;br /&gt;
            if(llDetectedType(num)&amp;amp;AGENT&lt;br /&gt;
//             &amp;amp;&amp;amp; llDetectedKey(num)!=llGetOwner()//rem out to test on yourself&lt;br /&gt;
             )&lt;br /&gt;
            {   detected_name = llDetectedName(num);&lt;br /&gt;
                if(llGetFreeMemory()&amp;lt;512)&lt;br /&gt;
                    llSetTimerEvent(0.1);&lt;br /&gt;
                else&lt;br /&gt;
                {   index = llListFindList(gList, [detected_name]);&lt;br /&gt;
                    if(-1==index)&lt;br /&gt;
                    {    gList += [detected_name]+[1]+[llGetTimestamp()];&lt;br /&gt;
//llOwnerSay(&amp;quot;Adding new visitor: \n&amp;quot;+llList2CSV(gList));&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {   gList = llListReplaceList(gList, [detected_name]+[llList2Integer(gList, index+1)+1]+[llGetTimestamp()], index, index+2);&lt;br /&gt;
//llOwnerSay(&amp;quot;Updating visits: \n&amp;quot;+llList2CSV(gList));                        &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        } while(num&amp;gt;-1);&lt;br /&gt;
    }&lt;br /&gt;
    listen( integer channel, string name, key id, string message )&lt;br /&gt;
    {   if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
        {   f_sayHelp();&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;say list&amp;quot; || message == &amp;quot;output list&amp;quot; )&lt;br /&gt;
        {   f_output(0);&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;email list&amp;quot; || message == &amp;quot;reset list&amp;quot; || message == &amp;quot;send email&amp;quot; )&lt;br /&gt;
        {   llOwnerSay( &amp;quot;Sending email (incurs a 20 second delay) and resetting...&amp;quot;);&lt;br /&gt;
            f_output(1);&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The original script.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Global variables change these to match your specifics&lt;br /&gt;
&lt;br /&gt;
float range = 10.0; // search radius, in meters&lt;br /&gt;
float rate = 1.0; // time between searches, in seconds&lt;br /&gt;
&lt;br /&gt;
// add your email adress inside the quotes&lt;br /&gt;
string email_address = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//add the name of the location if you want (the email will have the sim name and cordinates of &lt;br /&gt;
// the counter already in it) &lt;br /&gt;
string location_name = &amp;quot;Your Location&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//dont change these &lt;br /&gt;
&lt;br /&gt;
list single_name_list;&lt;br /&gt;
list visitor_list;&lt;br /&gt;
//end no change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Returns true if &amp;quot;name&amp;quot; is already on the visitor_list and doesnt add it the list again &lt;br /&gt;
integer isNameOnList( string name )&lt;br /&gt;
{&lt;br /&gt;
list single_name_list;&lt;br /&gt;
single_name_list += name;&lt;br /&gt;
&lt;br /&gt;
return (-1 != llListFindList( visitor_list, single_name_list ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// sends email to the address above ,if added &lt;br /&gt;
&lt;br /&gt;
sendEmail()&lt;br /&gt;
{&lt;br /&gt;
string csv = llList2CSV( visitor_list );&lt;br /&gt;
llEmail( email_address, &amp;quot;Visitor List: &amp;quot; + location_name, csv );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//self explanatory &lt;br /&gt;
&lt;br /&gt;
resetList()&lt;br /&gt;
{&lt;br /&gt;
single_name_list = llDeleteSubList(single_name_list, 0, llGetListLength(single_name_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Help commands&lt;br /&gt;
sayHelp( integer is_owner )&lt;br /&gt;
{&lt;br /&gt;
if( is_owner )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;This object records the names of everyone who&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;comes within &amp;quot;+ (string)((integer)range) + &amp;quot; meters.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
llSay( 0, &amp;quot;&#039;reset list&#039; - Removes all the names from the list.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039; email list&#039; - Emails the names on the list.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Sorry, only the owner can use this object.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// state the script starts in &lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
llSay(0, &amp;quot;The owner can say &#039;help&#039; for instructions.&amp;quot;);&lt;br /&gt;
llSensorRepeat( &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, range, TWO_PI, rate );&lt;br /&gt;
llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//change this to how often you want the script to email the visitor list to you (or comment it out if you dont want the email .... by default its set to email you every hr then reset itself&lt;br /&gt;
llSetTimerEvent( 60 * 60 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Sends email and resets list as set in the settimerevent above&lt;br /&gt;
timer()&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
resetList();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//says help if owner clicks on it &lt;br /&gt;
&lt;br /&gt;
touch_start( integer num_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; num_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( llDetectedKey(i) == llGetOwner() );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//detects avatars and keeps time &lt;br /&gt;
&lt;br /&gt;
sensor( integer number_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; number_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
// Don&#039;t ever add the owner to the list.&lt;br /&gt;
&lt;br /&gt;
if( llDetectedKey( i ) != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
string detected_name = llDetectedName( i );&lt;br /&gt;
if( isNameOnList( detected_name ) == FALSE )&lt;br /&gt;
{&lt;br /&gt;
float seconds = llGetWallclock();&lt;br /&gt;
float minutes = seconds / 60.0;&lt;br /&gt;
float hours = minutes / 60.0;&lt;br /&gt;
integer hours_int = (integer) hours;&lt;br /&gt;
integer minutes_int = ((integer)minutes) % 60;&lt;br /&gt;
if( minutes_int &amp;lt; 10 )&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:0&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
visitor_list += detected_name;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Listens for commands from the Owner&lt;br /&gt;
&lt;br /&gt;
listen( integer channel, string name, key id, string message )&lt;br /&gt;
{&lt;br /&gt;
if( id != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( TRUE );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;say list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Visitor List:&amp;quot; );&lt;br /&gt;
integer len = llGetListLength( visitor_list );&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; len; i++ )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, llList2String(visitor_list, i) );&lt;br /&gt;
}&lt;br /&gt;
llSay( 0, &amp;quot;Total = &amp;quot; + (string)len ); &lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;email list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
llSay(0, &amp;quot;Emailing list&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;reset list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432293</id>
		<title>Visit Monitor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432293"/>
		<updated>2009-07-15T02:26:46Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Visit Monitor====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090715 1159 [SLT: 20090714 1859]&lt;br /&gt;
&lt;br /&gt;
Volumedetect (collision based) prim that records avatars names, number of visits, and time (in UTC)&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
Written in response to Firery Broome&#039;s request to &amp;quot;just add a few simple things&amp;quot; ...Resulting, as usual :)  in an almost total rewrite, and functional differences to the original.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Re-posting here as S.A.3.0 licence to re-assert its original public status and that of my rewrite.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Not comprehensively tested, so may have some stupid in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TO USE:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ADD YOUR EMAIL ADDRESS TO THE GLOBAL VARIABLES&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Put script in a prim, it&#039;ll be phantom from then on so don&#039;t link it to anything thats not going to be part of the collision sensing prim(s)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Any avatars colliding with this prim will have their name added to the visitor list.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Best placement is in avatar arrival areas, like forced TP parcels, preferably where avs will not be constantly colliding with the prim, but rather only collide once when they arrive in your sim/parcel.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If the script&#039;s memory becomes too full due to list size it will attempt to dump list to email and reset... but I havent&#039;t tested if 512bytes is even enough to do this successfully... so value may need adjustment.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
//&lt;br /&gt;
// Almost totally rewritten by BETLOG Hax&lt;br /&gt;
//  UTC+10: 20090713 2306 [SLT: 20090713 0606]&lt;br /&gt;
//  To remove silly guff and reformat (sheesh WHITESPACE people!), added some more useful stuff.&lt;br /&gt;
//  For Firery Broome&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// ------ CONFIGURATION ------&lt;br /&gt;
string      gEmail              = &amp;quot;&amp;quot;;//************** ADD YOUR EMAIL ADDRESS HERE ****************&lt;br /&gt;
float       gFreq               = 604800.0;//60*60*24*7=604800 - 1 WEEK&lt;br /&gt;
&lt;br /&gt;
// ------ CORE CODE ------&lt;br /&gt;
list        gList               = [];&lt;br /&gt;
&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sayHelp()&lt;br /&gt;
{   llOwnerSay( &amp;quot;This object records the names of everyone who collides with it.&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
    llOwnerSay( &amp;quot;&#039;reset list&#039; OR &#039;email list&#039; - Emails the names on the list and resets.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_output(integer mail)&lt;br /&gt;
{   string text;&lt;br /&gt;
    integer length;&lt;br /&gt;
    integer i = (gList!=[])-1;&lt;br /&gt;
    if(i&amp;lt;2)&lt;br /&gt;
        llOwnerSay(&amp;quot;No data&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
    {   string s = llGetObjectName();&lt;br /&gt;
        llSetObjectName(&amp;quot; &amp;quot;);&lt;br /&gt;
        while(i&amp;gt;-1)&lt;br /&gt;
        {   text += &amp;quot;Name: &amp;quot;+llList2String(gList, i-2)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
                &amp;quot; Visit: &amp;quot;+(string)llList2Integer(gList, i-1)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
                &amp;quot; Last :&amp;quot;+llList2String(gList, i)+&amp;quot;[UTC]\n&amp;quot;;&lt;br /&gt;
            length = llStringLength(text);&lt;br /&gt;
            if(mail &amp;amp;&amp;amp; length&amp;gt;=3500)//partial send to avoid email overflow&lt;br /&gt;
            {   if(0&amp;lt;llSubStringIndex(gEmail,&amp;quot;@&amp;quot;))&lt;br /&gt;
                {   llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List &amp;quot;+(string)llGetTimestamp(), text);&lt;br /&gt;
                    text=&amp;quot;&amp;quot;;//if you havent entered an email address this will simply NOT SEND THE WHOLE LIST&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else if (!mail &amp;amp;&amp;amp; length&amp;gt;=240)//partial send to avoid text chat overflow&lt;br /&gt;
            {   llOwnerSay(text);&lt;br /&gt;
                text=&amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            i-=3;&lt;br /&gt;
        }&lt;br /&gt;
        if(mail)//normal output&lt;br /&gt;
        {   if(0&amp;lt;llSubStringIndex(gEmail,&amp;quot;@&amp;quot;))&lt;br /&gt;
                llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List 1/1 &amp;quot;+(string)llGetTimestamp(), text);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            llOwnerSay(text);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
        f_sayHelp();&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()    &lt;br /&gt;
    {   if(llGetFreeMemory()&amp;lt;17000)&lt;br /&gt;
            llOwnerSay(&amp;quot;RECOMPILE THIS IN MONO. (it&#039;ll still work otherwise, just not as well.)&amp;quot;);&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;OK Running.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gFreq); &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   llSetTimerEvent(0.0);&lt;br /&gt;
        f_output(1);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    } &lt;br /&gt;
    touch_start( integer num)&lt;br /&gt;
    {   if (llDetectedKey(num)==llGetOwner())&lt;br /&gt;
            f_sayHelp();&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num) &lt;br /&gt;
    {   string detected_name;&lt;br /&gt;
        integer index;&lt;br /&gt;
        string segment;&lt;br /&gt;
        integer start;&lt;br /&gt;
        integer visits;        &lt;br /&gt;
        do&lt;br /&gt;
        {   --num;&lt;br /&gt;
            if(llDetectedType(num)&amp;amp;AGENT&lt;br /&gt;
//             &amp;amp;&amp;amp; llDetectedKey(num)!=llGetOwner()//rem out to test on yourself&lt;br /&gt;
             )&lt;br /&gt;
            {   detected_name = llDetectedName(num);&lt;br /&gt;
                if(llGetFreeMemory()&amp;lt;512)&lt;br /&gt;
                    llSetTimerEvent(0.1);&lt;br /&gt;
                else&lt;br /&gt;
                {   index = llListFindList(gList, [detected_name]);&lt;br /&gt;
                    if(-1==index)&lt;br /&gt;
                    {    gList += [detected_name]+[1]+[llGetTimestamp()];&lt;br /&gt;
//llOwnerSay(&amp;quot;Adding new visitor: \n&amp;quot;+llList2CSV(gList));&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {   gList = llListReplaceList(gList, [detected_name]+[llList2Integer(gList, index+1)+1]+[llGetTimestamp()], index, index+2);&lt;br /&gt;
//llOwnerSay(&amp;quot;Updating visits: \n&amp;quot;+llList2CSV(gList));                        &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        } while(num&amp;gt;-1);&lt;br /&gt;
    }&lt;br /&gt;
    listen( integer channel, string name, key id, string message )&lt;br /&gt;
    {   if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
        {   f_sayHelp();&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;say list&amp;quot; || message == &amp;quot;output list&amp;quot; )&lt;br /&gt;
        {   f_output(0);&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;email list&amp;quot; || message == &amp;quot;reset list&amp;quot; || message == &amp;quot;send email&amp;quot; )&lt;br /&gt;
        {   llOwnerSay( &amp;quot;Sending email (incurs a 20 second delay) and resetting...&amp;quot;);&lt;br /&gt;
            f_output(1);&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The original script.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Global variables change these to match your specifics&lt;br /&gt;
&lt;br /&gt;
float range = 10.0; // search radius, in meters&lt;br /&gt;
float rate = 1.0; // time between searches, in seconds&lt;br /&gt;
&lt;br /&gt;
// add your email adress inside the quotes&lt;br /&gt;
string email_address = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//add the name of the location if you want (the email will have the sim name and cordinates of &lt;br /&gt;
// the counter already in it) &lt;br /&gt;
string location_name = &amp;quot;Your Location&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//dont change these &lt;br /&gt;
&lt;br /&gt;
list single_name_list;&lt;br /&gt;
list visitor_list;&lt;br /&gt;
//end no change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Returns true if &amp;quot;name&amp;quot; is already on the visitor_list and doesnt add it the list again &lt;br /&gt;
integer isNameOnList( string name )&lt;br /&gt;
{&lt;br /&gt;
list single_name_list;&lt;br /&gt;
single_name_list += name;&lt;br /&gt;
&lt;br /&gt;
return (-1 != llListFindList( visitor_list, single_name_list ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// sends email to the address above ,if added &lt;br /&gt;
&lt;br /&gt;
sendEmail()&lt;br /&gt;
{&lt;br /&gt;
string csv = llList2CSV( visitor_list );&lt;br /&gt;
llEmail( email_address, &amp;quot;Visitor List: &amp;quot; + location_name, csv );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//self explanatory &lt;br /&gt;
&lt;br /&gt;
resetList()&lt;br /&gt;
{&lt;br /&gt;
single_name_list = llDeleteSubList(single_name_list, 0, llGetListLength(single_name_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Help commands&lt;br /&gt;
sayHelp( integer is_owner )&lt;br /&gt;
{&lt;br /&gt;
if( is_owner )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;This object records the names of everyone who&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;comes within &amp;quot;+ (string)((integer)range) + &amp;quot; meters.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
llSay( 0, &amp;quot;&#039;reset list&#039; - Removes all the names from the list.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039; email list&#039; - Emails the names on the list.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Sorry, only the owner can use this object.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// state the script starts in &lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
llSay(0, &amp;quot;The owner can say &#039;help&#039; for instructions.&amp;quot;);&lt;br /&gt;
llSensorRepeat( &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, range, TWO_PI, rate );&lt;br /&gt;
llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//change this to how often you want the script to email the visitor list to you (or comment it out if you dont want the email .... by default its set to email you every hr then reset itself&lt;br /&gt;
llSetTimerEvent( 60 * 60 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Sends email and resets list as set in the settimerevent above&lt;br /&gt;
timer()&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
resetList();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//says help if owner clicks on it &lt;br /&gt;
&lt;br /&gt;
touch_start( integer num_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; num_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( llDetectedKey(i) == llGetOwner() );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//detects avatars and keeps time &lt;br /&gt;
&lt;br /&gt;
sensor( integer number_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; number_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
// Don&#039;t ever add the owner to the list.&lt;br /&gt;
&lt;br /&gt;
if( llDetectedKey( i ) != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
string detected_name = llDetectedName( i );&lt;br /&gt;
if( isNameOnList( detected_name ) == FALSE )&lt;br /&gt;
{&lt;br /&gt;
float seconds = llGetWallclock();&lt;br /&gt;
float minutes = seconds / 60.0;&lt;br /&gt;
float hours = minutes / 60.0;&lt;br /&gt;
integer hours_int = (integer) hours;&lt;br /&gt;
integer minutes_int = ((integer)minutes) % 60;&lt;br /&gt;
if( minutes_int &amp;lt; 10 )&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:0&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
visitor_list += detected_name;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Listens for commands from the Owner&lt;br /&gt;
&lt;br /&gt;
listen( integer channel, string name, key id, string message )&lt;br /&gt;
{&lt;br /&gt;
if( id != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( TRUE );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;say list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Visitor List:&amp;quot; );&lt;br /&gt;
integer len = llGetListLength( visitor_list );&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; len; i++ )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, llList2String(visitor_list, i) );&lt;br /&gt;
}&lt;br /&gt;
llSay( 0, &amp;quot;Total = &amp;quot; + (string)len ); &lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;email list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
llSay(0, &amp;quot;Emailing list&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;reset list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432283</id>
		<title>Visit Monitor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432283"/>
		<updated>2009-07-15T02:23:58Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Visitor Monitor====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090715 1159 [SLT: 20090714 1859]&lt;br /&gt;
&lt;br /&gt;
Volumedetect (collision based) prim that records avatars names, number of visits, and time (in UTC)&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
Written in response to Firery Broome&#039;s request to &amp;quot;just add a few simple things&amp;quot; ...Resulting, as usual :)  in an almost total rewrite, and functional differences to the original.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Re-posting here as S.A.3.0 licence to re-assert its original public status and that of my rewrite.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Not comprehensively tested, so may have some stupid in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TO USE:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ADD YOUR EMAIL ADDRESS TO THE GLOBAL VARIABLES&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Put script in a prim, it&#039;ll be phantom from then on so don&#039;t link it to anything thats not going to be part of the collision sensing prim(s)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Any avatars colliding with this prim will have their name added to the visitor list.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Best placement is in avatar arrival areas, like forced TP parcels, preferably where avs will not be constantly colliding with the prim, but rather only collide once when they arrive in your sim/parcel.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If the script&#039;s memory becomes too full due to list size it will attempt to dump list to email and reset... but I havent&#039;t tested if 512bytes is even enough to do this successfully... so value may need adjustment.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
//&lt;br /&gt;
// Almost totally rewritten by BETLOG Hax&lt;br /&gt;
//  UTC+10: 20090713 2306 [SLT: 20090713 0606]&lt;br /&gt;
//  To remove silly guff and reformat (sheesh WHITESPACE people!), added some more useful stuff.&lt;br /&gt;
//  For Firery Broome&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// ------ CONFIGURATION ------&lt;br /&gt;
string      gEmail              = &amp;quot;&amp;quot;;//ADD YOUR EMAIL ADDRESS HERE ****************************************&lt;br /&gt;
float       gFreq               = 604800.0;//60*60*24*7=604800 - 1 WEEK&lt;br /&gt;
&lt;br /&gt;
// ------ CORE CODE ------&lt;br /&gt;
list        gList               = [];&lt;br /&gt;
&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sendEmail()&lt;br /&gt;
{   if(gEmail!=&amp;quot;&amp;quot;)&lt;br /&gt;
    {   llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List &amp;quot;+(string)llGetTimestamp(), f_output((gList!=[])));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sayHelp( integer is_owner )&lt;br /&gt;
{   if( is_owner )&lt;br /&gt;
    {   llOwnerSay( &amp;quot;This object records the names of everyone who collides with it.&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;reset list&#039; OR &#039;email list&#039; - Emails the names on the list and resets.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {   llSay( 0, &amp;quot;Sorry, only the owner can use this object.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
string f_output(integer i)&lt;br /&gt;
{   string text;//this could easily get far too large to send/load into memory&lt;br /&gt;
    while(i&amp;gt;-1)&lt;br /&gt;
    {   text += &amp;quot;Name: &amp;quot;+llList2String(gList, i-2)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
            &amp;quot; Visit: &amp;quot;+(string)llList2Integer(gList, i-1)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
            &amp;quot; Last :&amp;quot;+llList2String(gList, i)+&amp;quot;[UTC]\n&amp;quot;;&lt;br /&gt;
        i-=3;&lt;br /&gt;
    }&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
        f_sayHelp(TRUE);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()    &lt;br /&gt;
    {   if(llGetFreeMemory()&amp;lt;17000)&lt;br /&gt;
            llOwnerSay(&amp;quot;RECOMPILE THIS IN MONO. (it&#039;ll still work otherwise, just not as well.)&amp;quot;);&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;OK Running.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gFreq); &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   llSetTimerEvent(0.0);&lt;br /&gt;
        f_sendEmail();&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    } &lt;br /&gt;
    touch_start( integer num)&lt;br /&gt;
    {   while(--num&amp;gt;-1)&lt;br /&gt;
            f_sayHelp( llDetectedKey(num) == llGetOwner() );&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num) &lt;br /&gt;
    {   string detected_name;&lt;br /&gt;
        integer index;&lt;br /&gt;
        string segment;&lt;br /&gt;
        integer start;&lt;br /&gt;
        integer visits;        &lt;br /&gt;
        do&lt;br /&gt;
        {   --num;&lt;br /&gt;
            if(llDetectedType(num)&amp;amp;AGENT&lt;br /&gt;
//             &amp;amp;&amp;amp; llDetectedKey(num)!=llGetOwner()//rem out to test on yourself&lt;br /&gt;
             )&lt;br /&gt;
            {   detected_name = llDetectedName(num);&lt;br /&gt;
                if(llGetFreeMemory()&amp;lt;512)&lt;br /&gt;
                    llSetTimerEvent(0.1);&lt;br /&gt;
                else&lt;br /&gt;
                {   index = llListFindList(gList, [detected_name]);&lt;br /&gt;
                    if(-1==index)&lt;br /&gt;
                    {    gList += [detected_name]+[1]+[llGetTimestamp()];&lt;br /&gt;
//llOwnerSay(&amp;quot;Adding new visitor: \n&amp;quot;+llList2CSV(gList));&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {   gList = llListReplaceList(gList, [detected_name]+[llList2Integer(gList, index+1)+1]+[llGetTimestamp()], index, index+2);&lt;br /&gt;
//llOwnerSay(&amp;quot;Updating visits: \n&amp;quot;+llList2CSV(gList));                        &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        } while(num&amp;gt;-1);&lt;br /&gt;
    }&lt;br /&gt;
    listen( integer channel, string name, key id, string message )&lt;br /&gt;
    {   if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
        {   f_sayHelp( TRUE );&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;say list&amp;quot; )&lt;br /&gt;
        {   integer i = (gList!=[])-1;&lt;br /&gt;
            string s = llGetObjectName();&lt;br /&gt;
            llSetObjectName(&amp;quot; &amp;quot;);&lt;br /&gt;
            llOwnerSay(f_output(i));&lt;br /&gt;
            llSetObjectName(s);                &lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;email list&amp;quot; || message == &amp;quot;reset list&amp;quot; || message == &amp;quot;send email&amp;quot; )&lt;br /&gt;
        {   llOwnerSay( &amp;quot;Sending email (incurs a 20 second delay) and resetting...&amp;quot;);&lt;br /&gt;
            f_sendEmail();&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The original script.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Global variables change these to match your specifics&lt;br /&gt;
&lt;br /&gt;
float range = 10.0; // search radius, in meters&lt;br /&gt;
float rate = 1.0; // time between searches, in seconds&lt;br /&gt;
&lt;br /&gt;
// add your email adress inside the quotes&lt;br /&gt;
string email_address = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//add the name of the location if you want (the email will have the sim name and cordinates of &lt;br /&gt;
// the counter already in it) &lt;br /&gt;
string location_name = &amp;quot;Your Location&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//dont change these &lt;br /&gt;
&lt;br /&gt;
list single_name_list;&lt;br /&gt;
list visitor_list;&lt;br /&gt;
//end no change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Returns true if &amp;quot;name&amp;quot; is already on the visitor_list and doesnt add it the list again &lt;br /&gt;
integer isNameOnList( string name )&lt;br /&gt;
{&lt;br /&gt;
list single_name_list;&lt;br /&gt;
single_name_list += name;&lt;br /&gt;
&lt;br /&gt;
return (-1 != llListFindList( visitor_list, single_name_list ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// sends email to the address above ,if added &lt;br /&gt;
&lt;br /&gt;
sendEmail()&lt;br /&gt;
{&lt;br /&gt;
string csv = llList2CSV( visitor_list );&lt;br /&gt;
llEmail( email_address, &amp;quot;Visitor List: &amp;quot; + location_name, csv );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//self explanatory &lt;br /&gt;
&lt;br /&gt;
resetList()&lt;br /&gt;
{&lt;br /&gt;
single_name_list = llDeleteSubList(single_name_list, 0, llGetListLength(single_name_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Help commands&lt;br /&gt;
sayHelp( integer is_owner )&lt;br /&gt;
{&lt;br /&gt;
if( is_owner )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;This object records the names of everyone who&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;comes within &amp;quot;+ (string)((integer)range) + &amp;quot; meters.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
llSay( 0, &amp;quot;&#039;reset list&#039; - Removes all the names from the list.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039; email list&#039; - Emails the names on the list.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Sorry, only the owner can use this object.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// state the script starts in &lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
llSay(0, &amp;quot;The owner can say &#039;help&#039; for instructions.&amp;quot;);&lt;br /&gt;
llSensorRepeat( &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, range, TWO_PI, rate );&lt;br /&gt;
llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//change this to how often you want the script to email the visitor list to you (or comment it out if you dont want the email .... by default its set to email you every hr then reset itself&lt;br /&gt;
llSetTimerEvent( 60 * 60 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Sends email and resets list as set in the settimerevent above&lt;br /&gt;
timer()&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
resetList();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//says help if owner clicks on it &lt;br /&gt;
&lt;br /&gt;
touch_start( integer num_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; num_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( llDetectedKey(i) == llGetOwner() );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//detects avatars and keeps time &lt;br /&gt;
&lt;br /&gt;
sensor( integer number_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; number_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
// Don&#039;t ever add the owner to the list.&lt;br /&gt;
&lt;br /&gt;
if( llDetectedKey( i ) != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
string detected_name = llDetectedName( i );&lt;br /&gt;
if( isNameOnList( detected_name ) == FALSE )&lt;br /&gt;
{&lt;br /&gt;
float seconds = llGetWallclock();&lt;br /&gt;
float minutes = seconds / 60.0;&lt;br /&gt;
float hours = minutes / 60.0;&lt;br /&gt;
integer hours_int = (integer) hours;&lt;br /&gt;
integer minutes_int = ((integer)minutes) % 60;&lt;br /&gt;
if( minutes_int &amp;lt; 10 )&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:0&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
visitor_list += detected_name;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Listens for commands from the Owner&lt;br /&gt;
&lt;br /&gt;
listen( integer channel, string name, key id, string message )&lt;br /&gt;
{&lt;br /&gt;
if( id != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( TRUE );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;say list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Visitor List:&amp;quot; );&lt;br /&gt;
integer len = llGetListLength( visitor_list );&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; len; i++ )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, llList2String(visitor_list, i) );&lt;br /&gt;
}&lt;br /&gt;
llSay( 0, &amp;quot;Total = &amp;quot; + (string)len ); &lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;email list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
llSay(0, &amp;quot;Emailing list&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;reset list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432273</id>
		<title>Visit Monitor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432273"/>
		<updated>2009-07-15T02:19:29Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Visitor Monitor====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090715 1159 [SLT: 20090714 1859]&lt;br /&gt;
&lt;br /&gt;
Volumedetect (collision based) prim that records avatars names, number of visits, and time (in UTC)&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
Written in response to Firery Broome&#039;s request to &amp;quot;just add a few simple things&amp;quot; ...Resulting, as usual :)  in an almost total rewrite, and functional differences to the original.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Re-posting here as S.A.3.0 licence to re-assert its original public status and that of my rewrite.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Not comprehensively tested, so may have some stupid in it.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
TO USE:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Put script in a prim, it&#039;ll be phantom from then on so don&#039;t link it to anything thats not going to be part of the collision sensing prim(s)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Any avatars colliding with this prim will have their name added to the visitor list.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Best placement is in avatar arrival areas, like forced TP parcels, preferably where avs will not be constantly colliding with the prim, but rather only collide once when they arrive in your sim/parcel.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
If the script&#039;s memory becomes too full due to list size it will attempt to dump list to email and reset... but I havent&#039;t tested if 512bytes is even enough to do this successfully... so value may need adjustment.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
//&lt;br /&gt;
// Almost totally rewritten by BETLOG Hax&lt;br /&gt;
//  UTC+10: 20090713 2306 [SLT: 20090713 0606]&lt;br /&gt;
//  To remove silly guff and reformat (sheesh WHITESPACE people!), added some more useful stuff.&lt;br /&gt;
//  For Firery Broome&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// ------ CONFIGURATION ------&lt;br /&gt;
string      gEmail              = &amp;quot;BETLOG.Hax@gmail.com&amp;quot;;&lt;br /&gt;
float       gFreq               = 604800.0;//60*60*24*7=604800 - 1 WEEK&lt;br /&gt;
&lt;br /&gt;
// ------ CORE CODE ------&lt;br /&gt;
list        gList               = [];&lt;br /&gt;
&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sendEmail()&lt;br /&gt;
{   if(gEmail!=&amp;quot;&amp;quot;)&lt;br /&gt;
    {   llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List &amp;quot;+(string)llGetTimestamp(), f_output((gList!=[])));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sayHelp( integer is_owner )&lt;br /&gt;
{   if( is_owner )&lt;br /&gt;
    {   llOwnerSay( &amp;quot;This object records the names of everyone who collides with it.&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;reset list&#039; OR &#039;email list&#039; - Emails the names on the list and resets.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {   llSay( 0, &amp;quot;Sorry, only the owner can use this object.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
string f_output(integer i)&lt;br /&gt;
{   string text;//this could easily get far too large to send/load into memory&lt;br /&gt;
    while(i&amp;gt;-1)&lt;br /&gt;
    {   text += &amp;quot;Name: &amp;quot;+llList2String(gList, i-2)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
            &amp;quot; Visit: &amp;quot;+(string)llList2Integer(gList, i-1)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
            &amp;quot; Last :&amp;quot;+llList2String(gList, i)+&amp;quot;[UTC]\n&amp;quot;;&lt;br /&gt;
        i-=3;&lt;br /&gt;
    }&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
        f_sayHelp(TRUE);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()    &lt;br /&gt;
    {   if(llGetFreeMemory()&amp;lt;17000)&lt;br /&gt;
            llOwnerSay(&amp;quot;RECOMPILE THIS IN MONO. (it&#039;ll still work otherwise, just not as well.)&amp;quot;);&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;OK Running.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gFreq); &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   llSetTimerEvent(0.0);&lt;br /&gt;
        f_sendEmail();&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    } &lt;br /&gt;
    touch_start( integer num)&lt;br /&gt;
    {   while(--num&amp;gt;-1)&lt;br /&gt;
            f_sayHelp( llDetectedKey(num) == llGetOwner() );&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num) &lt;br /&gt;
    {   string detected_name;&lt;br /&gt;
        integer index;&lt;br /&gt;
        string segment;&lt;br /&gt;
        integer start;&lt;br /&gt;
        integer visits;        &lt;br /&gt;
        do&lt;br /&gt;
        {   --num;&lt;br /&gt;
            if(llDetectedType(num)&amp;amp;AGENT&lt;br /&gt;
//             &amp;amp;&amp;amp; llDetectedKey(num)!=llGetOwner()//rem out to test on yourself&lt;br /&gt;
             )&lt;br /&gt;
            {   detected_name = llDetectedName(num);&lt;br /&gt;
                if(llGetFreeMemory()&amp;lt;512)&lt;br /&gt;
                    llSetTimerEvent(0.1);&lt;br /&gt;
                else&lt;br /&gt;
                {   index = llListFindList(gList, [detected_name]);&lt;br /&gt;
                    if(-1==index)&lt;br /&gt;
                    {    gList += [detected_name]+[1]+[llGetTimestamp()];&lt;br /&gt;
//llOwnerSay(&amp;quot;Adding new visitor: \n&amp;quot;+llList2CSV(gList));&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {   gList = llListReplaceList(gList, [detected_name]+[llList2Integer(gList, index+1)+1]+[llGetTimestamp()], index, index+2);&lt;br /&gt;
//llOwnerSay(&amp;quot;Updating visits: \n&amp;quot;+llList2CSV(gList));                        &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        } while(num&amp;gt;-1);&lt;br /&gt;
    }&lt;br /&gt;
    listen( integer channel, string name, key id, string message )&lt;br /&gt;
    {   if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
        {   f_sayHelp( TRUE );&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;say list&amp;quot; )&lt;br /&gt;
        {   integer i = (gList!=[])-1;&lt;br /&gt;
            string s = llGetObjectName();&lt;br /&gt;
            llSetObjectName(&amp;quot; &amp;quot;);&lt;br /&gt;
            llOwnerSay(f_output(i));&lt;br /&gt;
            llSetObjectName(s);                &lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;email list&amp;quot; || message == &amp;quot;reset list&amp;quot; || message == &amp;quot;send email&amp;quot; )&lt;br /&gt;
        {   llOwnerSay( &amp;quot;Sending email (incurs a 20 second delay) and resetting...&amp;quot;);&lt;br /&gt;
            f_sendEmail();&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The original script.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Global variables change these to match your specifics&lt;br /&gt;
&lt;br /&gt;
float range = 10.0; // search radius, in meters&lt;br /&gt;
float rate = 1.0; // time between searches, in seconds&lt;br /&gt;
&lt;br /&gt;
// add your email adress inside the quotes&lt;br /&gt;
string email_address = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//add the name of the location if you want (the email will have the sim name and cordinates of &lt;br /&gt;
// the counter already in it) &lt;br /&gt;
string location_name = &amp;quot;Your Location&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//dont change these &lt;br /&gt;
&lt;br /&gt;
list single_name_list;&lt;br /&gt;
list visitor_list;&lt;br /&gt;
//end no change&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Returns true if &amp;quot;name&amp;quot; is already on the visitor_list and doesnt add it the list again &lt;br /&gt;
integer isNameOnList( string name )&lt;br /&gt;
{&lt;br /&gt;
list single_name_list;&lt;br /&gt;
single_name_list += name;&lt;br /&gt;
&lt;br /&gt;
return (-1 != llListFindList( visitor_list, single_name_list ) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// sends email to the address above ,if added &lt;br /&gt;
&lt;br /&gt;
sendEmail()&lt;br /&gt;
{&lt;br /&gt;
string csv = llList2CSV( visitor_list );&lt;br /&gt;
llEmail( email_address, &amp;quot;Visitor List: &amp;quot; + location_name, csv );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//self explanatory &lt;br /&gt;
&lt;br /&gt;
resetList()&lt;br /&gt;
{&lt;br /&gt;
single_name_list = llDeleteSubList(single_name_list, 0, llGetListLength(single_name_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Help commands&lt;br /&gt;
sayHelp( integer is_owner )&lt;br /&gt;
{&lt;br /&gt;
if( is_owner )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;This object records the names of everyone who&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;comes within &amp;quot;+ (string)((integer)range) + &amp;quot; meters.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
llSay( 0, &amp;quot;&#039;reset list&#039; - Removes all the names from the list.&amp;quot; );&lt;br /&gt;
llSay( 0, &amp;quot;&#039; email list&#039; - Emails the names on the list.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Sorry, only the owner can use this object.&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// state the script starts in &lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
llSay(0, &amp;quot;The owner can say &#039;help&#039; for instructions.&amp;quot;);&lt;br /&gt;
llSensorRepeat( &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, range, TWO_PI, rate );&lt;br /&gt;
llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//change this to how often you want the script to email the visitor list to you (or comment it out if you dont want the email .... by default its set to email you every hr then reset itself&lt;br /&gt;
llSetTimerEvent( 60 * 60 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Sends email and resets list as set in the settimerevent above&lt;br /&gt;
timer()&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
resetList();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//says help if owner clicks on it &lt;br /&gt;
&lt;br /&gt;
touch_start( integer num_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; num_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( llDetectedKey(i) == llGetOwner() );&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//detects avatars and keeps time &lt;br /&gt;
&lt;br /&gt;
sensor( integer number_detected )&lt;br /&gt;
{&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; number_detected; i++ )&lt;br /&gt;
{&lt;br /&gt;
// Don&#039;t ever add the owner to the list.&lt;br /&gt;
&lt;br /&gt;
if( llDetectedKey( i ) != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
string detected_name = llDetectedName( i );&lt;br /&gt;
if( isNameOnList( detected_name ) == FALSE )&lt;br /&gt;
{&lt;br /&gt;
float seconds = llGetWallclock();&lt;br /&gt;
float minutes = seconds / 60.0;&lt;br /&gt;
float hours = minutes / 60.0;&lt;br /&gt;
integer hours_int = (integer) hours;&lt;br /&gt;
integer minutes_int = ((integer)minutes) % 60;&lt;br /&gt;
if( minutes_int &amp;lt; 10 )&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:0&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
visitor_list += (string) hours_int + &amp;quot;:&amp;quot; + (string) minutes_int;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
visitor_list += detected_name;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Listens for commands from the Owner&lt;br /&gt;
&lt;br /&gt;
listen( integer channel, string name, key id, string message )&lt;br /&gt;
{&lt;br /&gt;
if( id != llGetOwner() )&lt;br /&gt;
{&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sayHelp( TRUE );&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;say list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, &amp;quot;Visitor List:&amp;quot; );&lt;br /&gt;
integer len = llGetListLength( visitor_list );&lt;br /&gt;
integer i;&lt;br /&gt;
for( i = 0; i &amp;lt; len; i++ )&lt;br /&gt;
{&lt;br /&gt;
llSay( 0, llList2String(visitor_list, i) );&lt;br /&gt;
}&lt;br /&gt;
llSay( 0, &amp;quot;Total = &amp;quot; + (string)len ); &lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;email list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
sendEmail();&lt;br /&gt;
llSay(0, &amp;quot;Emailing list&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
if( message == &amp;quot;reset list&amp;quot; )&lt;br /&gt;
{&lt;br /&gt;
visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list));&lt;br /&gt;
llSay( 0, &amp;quot;Done resetting.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432263</id>
		<title>Visit Monitor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Visit_Monitor&amp;diff=432263"/>
		<updated>2009-07-15T02:10:19Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====Visitor Monitor==== --BETLOG Hax UTC+10: 20090715 1159 [SLT: 20090714 1859]  Volumedetect (collision based) prim that records avatars names...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Visitor Monitor====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090715 1159 [SLT: 20090714 1859]&lt;br /&gt;
&lt;br /&gt;
Volumedetect (collision based) prim that records avatars names, number of visits, and time (in UTC)&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
Written in response to Firery Broome&#039;s request to &amp;quot;just add a few simple things&amp;quot; ...Resulting, as usual :)  in an almost total rewrite, and functional differences to the original.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Re-posting here as S.A.3.0 licence to re-assert its original public status and that of my rewrite.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Not comprehensively tested, so may have some stupid in it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
//Original script by Aaron Linden&lt;br /&gt;
//&lt;br /&gt;
//modified and commented by Ramon Kothari &lt;br /&gt;
//&lt;br /&gt;
// Almost totally rewritten by BETLOG Hax&lt;br /&gt;
//  UTC+10: 20090713 2306 [SLT: 20090713 0606]&lt;br /&gt;
//  To remove silly guff and reformat (sheesh WHITESPACE people!), added some more useful stuff.&lt;br /&gt;
//  For Firery Broome&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// ------ CONFIGURATION ------&lt;br /&gt;
string      gEmail              = &amp;quot;BETLOG.Hax@gmail.com&amp;quot;;&lt;br /&gt;
float       gFreq               = 604800.0;//60*60*24*7=604800 - 1 WEEK&lt;br /&gt;
&lt;br /&gt;
// ------ CORE CODE ------&lt;br /&gt;
list        gList               = [];&lt;br /&gt;
&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sendEmail()&lt;br /&gt;
{   if(gEmail!=&amp;quot;&amp;quot;)&lt;br /&gt;
    {   llEmail(gEmail, llGetRegionName()+&amp;quot; Visitor List &amp;quot;+(string)llGetTimestamp(), f_output((gList!=[])));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
f_sayHelp( integer is_owner )&lt;br /&gt;
{   if( is_owner )&lt;br /&gt;
    {   llOwnerSay( &amp;quot;This object records the names of everyone who collides with it.&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;Commands the owner can say:&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;help&#039; - Shows these instructions.&amp;quot; );&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;say list&#039; - Says the names of all visitors on the list.&amp;quot;);&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;reset list&#039; OR &#039;email list&#039; - Emails the names on the list and resets.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {   llSay( 0, &amp;quot;Sorry, only the owner can use this object.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
string f_output(integer i)&lt;br /&gt;
{   string text;//this could easily get far too large to send/load into memory&lt;br /&gt;
    while(i&amp;gt;-1)&lt;br /&gt;
    {   text += &amp;quot;Name: &amp;quot;+llList2String(gList, i-2)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
            &amp;quot; Visit: &amp;quot;+(string)llList2Integer(gList, i-1)+&amp;quot;\t&amp;quot;+&lt;br /&gt;
            &amp;quot; Last :&amp;quot;+llList2String(gList, i)+&amp;quot;[UTC]\n&amp;quot;;&lt;br /&gt;
        i-=3;&lt;br /&gt;
    }&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param) &lt;br /&gt;
    {   llSay(0, &amp;quot;Visitor List Maker started...&amp;quot;);&lt;br /&gt;
        f_sayHelp(TRUE);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()    &lt;br /&gt;
    {   if(llGetFreeMemory()&amp;lt;17000)&lt;br /&gt;
            llOwnerSay(&amp;quot;RECOMPILE THIS IN MONO. (it&#039;ll still work otherwise, just not as well.)&amp;quot;);&lt;br /&gt;
        llVolumeDetect(TRUE);&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;OK Running.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gFreq); &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   llSetTimerEvent(0.0);&lt;br /&gt;
        f_sendEmail();&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    } &lt;br /&gt;
    touch_start( integer num)&lt;br /&gt;
    {   while(--num&amp;gt;-1)&lt;br /&gt;
            f_sayHelp( llDetectedKey(num) == llGetOwner() );&lt;br /&gt;
    }&lt;br /&gt;
    collision_start(integer num) &lt;br /&gt;
    {   string detected_name;&lt;br /&gt;
        integer index;&lt;br /&gt;
        string segment;&lt;br /&gt;
        integer start;&lt;br /&gt;
        integer visits;        &lt;br /&gt;
        do&lt;br /&gt;
        {   --num;&lt;br /&gt;
            if(llDetectedType(num)&amp;amp;AGENT&lt;br /&gt;
//             &amp;amp;&amp;amp; llDetectedKey(num)!=llGetOwner()//rem out to test on yourself&lt;br /&gt;
             )&lt;br /&gt;
            {   detected_name = llDetectedName(num);&lt;br /&gt;
                if(llGetFreeMemory()&amp;lt;512)&lt;br /&gt;
                    llSetTimerEvent(0.1);&lt;br /&gt;
                else&lt;br /&gt;
                {   index = llListFindList(gList, [detected_name]);&lt;br /&gt;
                    if(-1==index)&lt;br /&gt;
                    {    gList += [detected_name]+[1]+[llGetTimestamp()];&lt;br /&gt;
//llOwnerSay(&amp;quot;Adding new visitor: \n&amp;quot;+llList2CSV(gList));&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {   gList = llListReplaceList(gList, [detected_name]+[llList2Integer(gList, index+1)+1]+[llGetTimestamp()], index, index+2);&lt;br /&gt;
//llOwnerSay(&amp;quot;Updating visits: \n&amp;quot;+llList2CSV(gList));                        &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        } while(num&amp;gt;-1);&lt;br /&gt;
    }&lt;br /&gt;
    listen( integer channel, string name, key id, string message )&lt;br /&gt;
    {   if( message == &amp;quot;help&amp;quot; )&lt;br /&gt;
        {   f_sayHelp( TRUE );&lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;say list&amp;quot; )&lt;br /&gt;
        {   integer i = (gList!=[])-1;&lt;br /&gt;
            string s = llGetObjectName();&lt;br /&gt;
            llSetObjectName(&amp;quot; &amp;quot;);&lt;br /&gt;
            llOwnerSay(f_output(i));&lt;br /&gt;
            llSetObjectName(s);                &lt;br /&gt;
        }&lt;br /&gt;
        else if( message == &amp;quot;email list&amp;quot; || message == &amp;quot;reset list&amp;quot; || message == &amp;quot;send email&amp;quot; )&lt;br /&gt;
        {   llOwnerSay( &amp;quot;Sending email (incurs a 20 second delay) and resetting...&amp;quot;);&lt;br /&gt;
            f_sendEmail();&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PSYS_Template&amp;diff=427502</id>
		<title>PSYS Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PSYS_Template&amp;diff=427502"/>
		<updated>2009-07-09T12:25:37Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====PSYS Template====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090709 2208 [SLT: 20090709 0508]&lt;br /&gt;
&lt;br /&gt;
All of the flags for making particles in a script with important inter-relationship comments only.&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
(declaring a bunch of variables instead of just learning to read the actual flag names is stupid)&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer     gOn         = TRUE;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {   gOn = !gOn;   &lt;br /&gt;
        state cycle;&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   if(gOn)&lt;br /&gt;
        {   llParticleSystem( [&lt;br /&gt;
                PSYS_PART_FLAGS, ( 0&lt;br /&gt;
                    | PSYS_PART_INTERP_COLOR_MASK&lt;br /&gt;
                    | PSYS_PART_INTERP_SCALE_MASK&lt;br /&gt;
                    | PSYS_PART_EMISSIVE_MASK&lt;br /&gt;
    //                | PSYS_PART_WIND_MASK&lt;br /&gt;
    //                | PSYS_PART_BOUNCE_MASK&lt;br /&gt;
    //                | PSYS_PART_FOLLOW_SRC_MASK   //disables BURST_RADIUS  &lt;br /&gt;
    //                | PSYS_PART_FOLLOW_VELOCITY_MASK&lt;br /&gt;
    //                | PSYS_PART_TARGET_POS_MASK   //target TARGET_KEY    &lt;br /&gt;
    //                | PSYS_PART_TARGET_LINEAR_MASK    //requires TARGET_KEY disables ACCEL, BURST_RADIUS&lt;br /&gt;
                )&lt;br /&gt;
                ,PSYS_PART_START_COLOR,     &amp;lt;1.0, 0.5, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_START_ALPHA,     1.0&lt;br /&gt;
                ,PSYS_PART_END_COLOR,       &amp;lt;0.3, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_END_ALPHA,       0.0&lt;br /&gt;
                ,PSYS_PART_START_SCALE,     &amp;lt;0.5, 0.5, 0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_END_SCALE,       &amp;lt;0.5, 0.5, 0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_MAX_AGE,         1.0    //particle age&lt;br /&gt;
                ,PSYS_SRC_ACCEL,            &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_SRC_PATTERN,          8&lt;br /&gt;
    //1=DROP,2=EXPLODE,4=ANGLE,8=ANGLE_CONE,10=ANGLE_CONE_EMPTY&lt;br /&gt;
    //1 - disables BURST_RADIUS, BURST_SPEED_MIN, BURST_SPEED_MAX&lt;br /&gt;
    //4/8/10 - requires ANGLE_BEGIN, ANGLE_END&lt;br /&gt;
    //                ,PSYS_SRC_INNERANGLE,       DEPRECIATED&lt;br /&gt;
    //                ,PSYS_SRC_OUTERANGLE,       DEPRECIATED    &lt;br /&gt;
                ,PSYS_SRC_TEXTURE,          &amp;quot;&amp;quot;&lt;br /&gt;
    //                llGetInventoryName(INVENTORY_TEXTURE, 0) //the first tex in inv&lt;br /&gt;
                ,PSYS_SRC_BURST_RATE,       0.05&lt;br /&gt;
    //                ,14,                        UNDOCUMENTED                &lt;br /&gt;
                ,PSYS_SRC_BURST_PART_COUNT, 4&lt;br /&gt;
                ,PSYS_SRC_BURST_RADIUS,     1.0&lt;br /&gt;
                ,PSYS_SRC_BURST_SPEED_MIN,  0.0&lt;br /&gt;
                ,PSYS_SRC_BURST_SPEED_MAX,  0.1&lt;br /&gt;
                ,PSYS_SRC_MAX_AGE,          0.0 //emission duration&lt;br /&gt;
                ,PSYS_SRC_TARGET_KEY,&lt;br /&gt;
                        (key)&amp;quot;&amp;quot;&lt;br /&gt;
    //                    llGetLinkKey(llGetLinkNum() + 1)&lt;br /&gt;
    //                    llGetKey()&lt;br /&gt;
                ,PSYS_SRC_OMEGA,            &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_SRC_ANGLE_BEGIN,      0.5&lt;br /&gt;
                ,PSYS_SRC_ANGLE_END,        0.5&lt;br /&gt;
            ]);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {   llParticleSystem([]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//======================================================================================&lt;br /&gt;
state cycle&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//======================================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PSYS_Template&amp;diff=427492</id>
		<title>PSYS Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PSYS_Template&amp;diff=427492"/>
		<updated>2009-07-09T12:23:46Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====PSYS Template====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090709 2208 [SLT: 20090709 0508]&lt;br /&gt;
&lt;br /&gt;
All of the flags for making particles in a script with important inter-relationship comments only.&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
(declaring a bunch of variables instead of just learning to read the actual flag names is stupid)&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {   gOn = !gOn;   &lt;br /&gt;
        state cycle;&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   if(gOn)&lt;br /&gt;
        {   llParticleSystem( [&lt;br /&gt;
                PSYS_PART_FLAGS, ( 0&lt;br /&gt;
                    | PSYS_PART_INTERP_COLOR_MASK&lt;br /&gt;
                    | PSYS_PART_INTERP_SCALE_MASK&lt;br /&gt;
                    | PSYS_PART_EMISSIVE_MASK&lt;br /&gt;
    //                | PSYS_PART_WIND_MASK&lt;br /&gt;
    //                | PSYS_PART_BOUNCE_MASK&lt;br /&gt;
    //                | PSYS_PART_FOLLOW_SRC_MASK   //disables BURST_RADIUS  &lt;br /&gt;
    //                | PSYS_PART_FOLLOW_VELOCITY_MASK&lt;br /&gt;
    //                | PSYS_PART_TARGET_POS_MASK   //target TARGET_KEY    &lt;br /&gt;
    //                | PSYS_PART_TARGET_LINEAR_MASK    //requires TARGET_KEY disables ACCEL, BURST_RADIUS&lt;br /&gt;
                )&lt;br /&gt;
                ,PSYS_PART_START_COLOR,     &amp;lt;1.0, 0.5, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_START_ALPHA,     1.0&lt;br /&gt;
                ,PSYS_PART_END_COLOR,       &amp;lt;0.3, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_END_ALPHA,       0.0&lt;br /&gt;
                ,PSYS_PART_START_SCALE,     &amp;lt;0.5, 0.5, 0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_END_SCALE,       &amp;lt;0.5, 0.5, 0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_MAX_AGE,         1.0    //particle age&lt;br /&gt;
                ,PSYS_SRC_ACCEL,            &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_SRC_PATTERN,          8&lt;br /&gt;
    //1=DROP,2=EXPLODE,4=ANGLE,8=ANGLE_CONE,10=ANGLE_CONE_EMPTY&lt;br /&gt;
    //1 - disables BURST_RADIUS, BURST_SPEED_MIN, BURST_SPEED_MAX&lt;br /&gt;
    //4/8/10 - requires ANGLE_BEGIN, ANGLE_END&lt;br /&gt;
    //                ,PSYS_SRC_INNERANGLE,       DEPRECIATED&lt;br /&gt;
    //                ,PSYS_SRC_OUTERANGLE,       DEPRECIATED    &lt;br /&gt;
                ,PSYS_SRC_TEXTURE,          &amp;quot;&amp;quot;&lt;br /&gt;
    //                llGetInventoryName(INVENTORY_TEXTURE, 0) //the first tex in inv&lt;br /&gt;
                ,PSYS_SRC_BURST_RATE,       0.05&lt;br /&gt;
    //                ,14,                        UNDOCUMENTED                &lt;br /&gt;
                ,PSYS_SRC_BURST_PART_COUNT, 4&lt;br /&gt;
                ,PSYS_SRC_BURST_RADIUS,     1.0&lt;br /&gt;
                ,PSYS_SRC_BURST_SPEED_MIN,  0.0&lt;br /&gt;
                ,PSYS_SRC_BURST_SPEED_MAX,  0.1&lt;br /&gt;
                ,PSYS_SRC_MAX_AGE,          0.0 //emission duration&lt;br /&gt;
                ,PSYS_SRC_TARGET_KEY,&lt;br /&gt;
                        (key)&amp;quot;&amp;quot;&lt;br /&gt;
    //                    llGetLinkKey(llGetLinkNum() + 1)&lt;br /&gt;
    //                    llGetKey()&lt;br /&gt;
                ,PSYS_SRC_OMEGA,            &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_SRC_ANGLE_BEGIN,      0.5&lt;br /&gt;
                ,PSYS_SRC_ANGLE_END,        0.5&lt;br /&gt;
            ]);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {   llParticleSystem([]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//======================================================================================&lt;br /&gt;
state cycle&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//======================================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=427482</id>
		<title>User:BETLOG Hax</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:BETLOG_Hax&amp;diff=427482"/>
		<updated>2009-07-09T12:20:16Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Wiki contribution index:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Double_Tap_Detection &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/AutoHUD_constructor &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/CameraSynch2 &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Lot_Reservation &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Bartender&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Group_invitation&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Send_vector_as_on_rez_param&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/List2ListLoop&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Panel_chat_bar.xml-20090623a&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Dataserver_corrected_sensor_display&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Jump_Limiter&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/PSYS_Template&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PSYS_Template&amp;diff=427472</id>
		<title>PSYS Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PSYS_Template&amp;diff=427472"/>
		<updated>2009-07-09T12:18:20Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====PSYS Template====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090709 2208 [SLT: 20090709 0508]&lt;br /&gt;
&lt;br /&gt;
All of the flags for making particles in a script with important inter-relationship comments only.&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
(declaring a bunch of variables instead of just learning to read the actual flag names is stupid)&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer     gOn         = TRUE;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param)&lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {   gOn = !gOn;   &lt;br /&gt;
        state cycle;&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   if(gOn)&lt;br /&gt;
        {   llParticleSystem( [&lt;br /&gt;
                PSYS_PART_FLAGS, ( 0&lt;br /&gt;
                    | PSYS_PART_INTERP_COLOR_MASK&lt;br /&gt;
                    | PSYS_PART_INTERP_SCALE_MASK&lt;br /&gt;
                    | PSYS_PART_EMISSIVE_MASK&lt;br /&gt;
    //                | PSYS_PART_WIND_MASK&lt;br /&gt;
    //                | PSYS_PART_BOUNCE_MASK&lt;br /&gt;
    //                | PSYS_PART_FOLLOW_SRC_MASK   //disables BURST_RADIUS  &lt;br /&gt;
    //                | PSYS_PART_FOLLOW_VELOCITY_MASK&lt;br /&gt;
    //                | PSYS_PART_TARGET_POS_MASK   //target TARGET_KEY    &lt;br /&gt;
    //                | PSYS_PART_TARGET_LINEAR_MASK    //requires TARGET_KEY disables ACCEL, BURST_RADIUS&lt;br /&gt;
                )&lt;br /&gt;
                ,PSYS_PART_START_COLOR,     &amp;lt;1.0, 0.5, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_START_ALPHA,     1.0&lt;br /&gt;
                ,PSYS_PART_END_COLOR,       &amp;lt;0.3, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_END_ALPHA,       0.0&lt;br /&gt;
                ,PSYS_PART_START_SCALE,     &amp;lt;0.5, 0.5, 0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_END_SCALE,       &amp;lt;0.5, 0.5, 0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_MAX_AGE,         1.0    //particle age&lt;br /&gt;
                ,PSYS_SRC_ACCEL,            &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_SRC_PATTERN,          8&lt;br /&gt;
    //1=DROP,2=EXPLODE,4=ANGLE,8=ANGLE_CONE,10=ANGLE_CONE_EMPTY&lt;br /&gt;
    //1 - disables BURST_RADIUS, BURST_SPEED_MIN, BURST_SPEED_MAX&lt;br /&gt;
    //4/8/10 - requires ANGLE_BEGIN, ANGLE_END&lt;br /&gt;
    //                ,PSYS_SRC_INNERANGLE,       DEPRECIATED&lt;br /&gt;
    //                ,PSYS_SRC_OUTERANGLE,       DEPRECIATED    &lt;br /&gt;
                ,PSYS_SRC_TEXTURE,          &lt;br /&gt;
                      &amp;quot;&amp;quot;&lt;br /&gt;
    //                  llGetInventoryName(INVENTORY_TEXTURE, 0)&lt;br /&gt;
                ,PSYS_SRC_BURST_RATE,       0.05&lt;br /&gt;
    //                ,14,                        UNDOCUMENTED                &lt;br /&gt;
                ,PSYS_SRC_BURST_PART_COUNT, 4&lt;br /&gt;
                ,PSYS_SRC_BURST_RADIUS,     1.0&lt;br /&gt;
                ,PSYS_SRC_BURST_SPEED_MIN,  0.0&lt;br /&gt;
                ,PSYS_SRC_BURST_SPEED_MAX,  0.1&lt;br /&gt;
                ,PSYS_SRC_MAX_AGE,          0.0 //emission duration&lt;br /&gt;
                ,PSYS_SRC_TARGET_KEY,&lt;br /&gt;
                        (key)&amp;quot;&amp;quot;&lt;br /&gt;
    //                    llGetLinkKey(llGetLinkNum() + 1)&lt;br /&gt;
    //                    llGetKey()&lt;br /&gt;
                ,PSYS_SRC_OMEGA,            &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_SRC_ANGLE_BEGIN,      0.5&lt;br /&gt;
                ,PSYS_SRC_ANGLE_END,        0.5&lt;br /&gt;
            ]);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {   llParticleSystem([]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
state cycle&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PSYS_Template&amp;diff=427452</id>
		<title>PSYS Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PSYS_Template&amp;diff=427452"/>
		<updated>2009-07-09T12:15:04Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: Created page with &amp;#039;{{LSL Header}} ====PSYS Template==== --BETLOG Hax UTC+10: 20090709 2208 [SLT: 20090709 0508]  All of the flags for making particles in a script with important...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====PSYS Template====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090709 2208 [SLT: 20090709 0508]&lt;br /&gt;
&lt;br /&gt;
All of the flags for making particles in a script with important inter-relationship comments only.&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
integer     gOn         = TRUE;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param)&lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {   gOn = !gOn;   &lt;br /&gt;
        state cycle;&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   if(gOn)&lt;br /&gt;
        {   llParticleSystem( [&lt;br /&gt;
                PSYS_PART_FLAGS, ( 0&lt;br /&gt;
                    | PSYS_PART_INTERP_COLOR_MASK&lt;br /&gt;
                    | PSYS_PART_INTERP_SCALE_MASK&lt;br /&gt;
                    | PSYS_PART_EMISSIVE_MASK&lt;br /&gt;
    //                | PSYS_PART_WIND_MASK&lt;br /&gt;
    //                | PSYS_PART_BOUNCE_MASK&lt;br /&gt;
    //                | PSYS_PART_FOLLOW_SRC_MASK   //disables BURST_RADIUS  &lt;br /&gt;
    //                | PSYS_PART_FOLLOW_VELOCITY_MASK&lt;br /&gt;
    //                | PSYS_PART_TARGET_POS_MASK   //target TARGET_KEY    &lt;br /&gt;
    //                | PSYS_PART_TARGET_LINEAR_MASK    //requires TARGET_KEY disables ACCEL, BURST_RADIUS&lt;br /&gt;
                )&lt;br /&gt;
                ,PSYS_PART_START_COLOR,     &amp;lt;1.0, 0.5, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_START_ALPHA,     1.0&lt;br /&gt;
                ,PSYS_PART_END_COLOR,       &amp;lt;0.3, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_END_ALPHA,       0.0&lt;br /&gt;
                ,PSYS_PART_START_SCALE,     &amp;lt;0.5, 0.5, 0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_END_SCALE,       &amp;lt;0.5, 0.5, 0&amp;gt;&lt;br /&gt;
                ,PSYS_PART_MAX_AGE,         1.0    //particle age&lt;br /&gt;
                ,PSYS_SRC_ACCEL,            &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_SRC_PATTERN,          8&lt;br /&gt;
    //1=DROP,2=EXPLODE,4=ANGLE,8=ANGLE_CONE,10=ANGLE_CONE_EMPTY&lt;br /&gt;
    //1 - disables BURST_RADIUS, BURST_SPEED_MIN, BURST_SPEED_MAX&lt;br /&gt;
    //4/8/10 - requires ANGLE_BEGIN, ANGLE_END&lt;br /&gt;
    //                ,PSYS_SRC_INNERANGLE,       DEPRECIATED&lt;br /&gt;
    //                ,PSYS_SRC_OUTERANGLE,       DEPRECIATED    &lt;br /&gt;
                ,PSYS_SRC_TEXTURE,&lt;br /&gt;
                    llGetInventoryName(INVENTORY_TEXTURE, 0) //the first tex in inv&lt;br /&gt;
                ,PSYS_SRC_BURST_RATE,       0.05&lt;br /&gt;
    //                ,14,                        UNDOCUMENTED                &lt;br /&gt;
                ,PSYS_SRC_BURST_PART_COUNT, 4&lt;br /&gt;
                ,PSYS_SRC_BURST_RADIUS,     1.0&lt;br /&gt;
                ,PSYS_SRC_BURST_SPEED_MIN,  0.0&lt;br /&gt;
                ,PSYS_SRC_BURST_SPEED_MAX,  0.1&lt;br /&gt;
                ,PSYS_SRC_MAX_AGE,          0.0 //emission duration&lt;br /&gt;
                ,PSYS_SRC_TARGET_KEY,&lt;br /&gt;
                        (key)&amp;quot;&amp;quot;&lt;br /&gt;
    //                    llGetLinkKey(llGetLinkNum() + 1)&lt;br /&gt;
    //                    llGetKey()&lt;br /&gt;
                ,PSYS_SRC_OMEGA,            &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
                ,PSYS_SRC_ANGLE_BEGIN,      0.5&lt;br /&gt;
                ,PSYS_SRC_ANGLE_END,        0.5&lt;br /&gt;
            ]);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {   llParticleSystem([]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
state cycle&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//----------------------------------&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Jump_Limiter&amp;diff=424903</id>
		<title>Jump Limiter</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Jump_Limiter&amp;diff=424903"/>
		<updated>2009-07-07T04:15:19Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Jump Limiter====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090707 1407 [SLT: 20090706 2107]&lt;br /&gt;
&lt;br /&gt;
My 200-300 ping makes the standard SL jump height kind of annoying.&lt;br /&gt;
&amp;lt;br&amp;gt; So this attachment limits that a little.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//==============================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
//&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//        **** LICENCE START ****&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//             Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
//        **** LICENCE END ****&lt;br /&gt;
//----------------------------------&lt;br /&gt;
//=========================================================================&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer param)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {   if (llGetAttached())&lt;br /&gt;
            llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {   if(perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
            llTakeControls(0| CONTROL_UP,TRUE, TRUE);&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change)&lt;br /&gt;
    {   if (pressed &amp;amp; change &amp;amp; CONTROL_UP)&lt;br /&gt;
        {   if (~llGetAgentInfo(llGetOwner()) &amp;amp; AGENT_FLYING)&lt;br /&gt;
            {   llSetBuoyancy(-2.0);    &lt;br /&gt;
                llSleep(1.0);&lt;br /&gt;
                llSetBuoyancy(0.0);    &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dataserver_corrected_sensor_display&amp;diff=424893</id>
		<title>Dataserver corrected sensor display</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dataserver_corrected_sensor_display&amp;diff=424893"/>
		<updated>2009-07-07T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;BETLOG Hax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
====Dataserver corrected sensor display====&lt;br /&gt;
--[[User:BETLOG Hax|BETLOG Hax]] UTC+10: 20090703 1045 [SLT: 20090702 1745]&lt;br /&gt;
&lt;br /&gt;
Getting data via sensor often required some other lookup.&lt;br /&gt;
&amp;lt;br&amp;gt;This example converts an object&#039;s owner key to a name via a dataserver call, and collates it into a list for llSetText display.&lt;br /&gt;
&amp;lt;br&amp;gt;IIRC this was for finding someone elses junk on Bio&#039;s land.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The core scanner bit.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// BETLOG Hax&lt;br /&gt;
// For Bio Flow - complete rewrite based on his script :&#039;take 2.4 moved to dataserver&#039;&lt;br /&gt;
// UTC10: 20090412 1737 [SLT:  20090412 0037]&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// ---LICENCE START---&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/3.0/&lt;br /&gt;
//     Attribution licence:&lt;br /&gt;
// You must:&lt;br /&gt;
//    -Include this unaltered licence information.&lt;br /&gt;
//    -Supply my original script with your modified version.&lt;br /&gt;
//    -Retain the original scripts&#039; SL permissions. [+c/+m/+t]&lt;br /&gt;
// Or:&lt;br /&gt;
//    -Link to the wiki URL from which you copied this script.&lt;br /&gt;
//    -Document: &amp;quot;Uses parts of &amp;lt;scriptname&amp;gt; by BETLOG Hax&amp;quot;&lt;br /&gt;
// ---LICENCE END---&lt;br /&gt;
//=========================================================================&lt;br /&gt;
// CONFIGURATION&lt;br /&gt;
float       gDisplayFreq    = 5.0;&lt;br /&gt;
float       gScanFreq       = 1.0;&lt;br /&gt;
integer     gStride         = 3;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
// CORE CODE&lt;br /&gt;
key         gQueryId;&lt;br /&gt;
list        gDataList       = [];&lt;br /&gt;
list        gQueryList     = [];&lt;br /&gt;
integer     gPrims;&lt;br /&gt;
integer     gLink;&lt;br /&gt;
//----------------------------------&lt;br /&gt;
default&lt;br /&gt;
{   on_rez(integer start)&lt;br /&gt;
    {   llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {   if (change &amp;amp; CHANGED_LINK)&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   llSetText(&amp;quot;&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
        gPrims = llGetNumberOfPrims();&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,PASSIVE|SCRIPTED, 20.0, PI, gScanFreq);&lt;br /&gt;
        llSetTimerEvent(gDisplayFreq);&lt;br /&gt;
        integer c = gPrims;&lt;br /&gt;
        while(c&amp;gt;1)&lt;br /&gt;
            llMessageLinked(c--,7 ,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;); //reset all the text&lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer num)&lt;br /&gt;
    {   key uuid;&lt;br /&gt;
        key owner;&lt;br /&gt;
        integer range;&lt;br /&gt;
        while(num&amp;gt;0)&lt;br /&gt;
        {   --num;&lt;br /&gt;
            uuid = llDetectedKey(num);&lt;br /&gt;
            owner = llDetectedOwner(num);&lt;br /&gt;
            if(uuid != (key)&amp;quot;&amp;quot; &lt;br /&gt;
                &amp;amp;&amp;amp; uuid != llGetOwner() &lt;br /&gt;
                &amp;amp;&amp;amp; owner != llGetOwner() &lt;br /&gt;
                &amp;amp;&amp;amp; ~llDetectedType(num) &amp;amp; AGENT &lt;br /&gt;
                &amp;amp;&amp;amp; !llSameGroup(uuid) &lt;br /&gt;
                &amp;amp;&amp;amp; -1==llListFindList(gDataList, [uuid]))&lt;br /&gt;
            {   if (llKey2Name(owner) == &amp;quot;&amp;quot;)&lt;br /&gt;
                {   gQueryId = llRequestAgentData(owner, DATA_NAME);&lt;br /&gt;
                    gDataList += [range, &amp;quot;UNKNOWN&amp;quot;, uuid];&lt;br /&gt;
                    gQueryList += [gQueryId, uuid];&lt;br /&gt;
//llOwnerSay(&amp;quot;UNRESOLVED name- querying dataserver&amp;quot;);                    &lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {   gDataList += [llRound(llVecDist(llGetPos(), llDetectedPos(num)))&lt;br /&gt;
                                    , llKey2Name(owner)&lt;br /&gt;
                                    , uuid];&lt;br /&gt;
//llOwnerSay(&amp;quot;RESOLVED name - adding data&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {   gDataList = llListSort(gDataList, gStride, TRUE);&lt;br /&gt;
        integer c = (gDataList != [])-1; //magic&lt;br /&gt;
        while(c&amp;gt;-1)&lt;br /&gt;
        {   gLink = (++gLink)%gPrims;&lt;br /&gt;
//llOwnerSay((string)(gLink+1));            &lt;br /&gt;
            list chunk = llList2List(gDataList, c-(gStride-1), c);&lt;br /&gt;
            llMessageLinked(gLink+1, 7&lt;br /&gt;
                ,(string)llList2Integer(chunk, 0)+&amp;quot;m]&amp;quot;&lt;br /&gt;
                    +&amp;quot;\t Owner:&amp;quot;+(string)llList2String(chunk, 1)&lt;br /&gt;
                    +&amp;quot;\t Object:&amp;quot;+(string)llKey2Name(llList2String(chunk, 2))                    &lt;br /&gt;
                , &amp;quot;&amp;quot;&lt;br /&gt;
            );&lt;br /&gt;
//llMessageLinked(LINK_SET,7,(string)num + &amp;quot;|&amp;quot; + text,&amp;quot;&amp;quot;);            &lt;br /&gt;
//llOwnerSay(llList2CSV(llList2List(gDataList, c-(gStride-1), c)));&lt;br /&gt;
            c-=gStride;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {   integer index = llListFindList(gQueryList, [queryid]);&lt;br /&gt;
        if (-1&amp;lt;index)&lt;br /&gt;
        {   key uuid = llList2Key(gQueryList, index+1);&lt;br /&gt;
            index = llListFindList(gDataList, [uuid]);&lt;br /&gt;
            if (-1&amp;lt;index)&lt;br /&gt;
            {   gDataList = llListReplaceList(gDataList, [&lt;br /&gt;
                    llRound(&lt;br /&gt;
                        llVecDist(llGetPos(),llList2Vector(llGetObjectDetails(uuid, ([OBJECT_POS])), 0))&lt;br /&gt;
                    )&lt;br /&gt;
                    , data, uuid], index-(gStride-1), index&lt;br /&gt;
                );&lt;br /&gt;
//llOwnerSay(&amp;quot;DATASERVER returned name - adding data&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The text receiver/display bit:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//=========================================================================&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {   if(sender_num != 1) return;&lt;br /&gt;
        if(num != 7) return;&lt;br /&gt;
        llSetText(str, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//=========================================================================&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>BETLOG Hax</name></author>
	</entry>
</feed>