<?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=Haravikk+Mistral</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=Haravikk+Mistral"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Haravikk_Mistral"/>
	<updated>2026-06-14T15:53:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlList2Json&amp;diff=1204851</id>
		<title>Talk:LlList2Json</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlList2Json&amp;diff=1204851"/>
		<updated>2016-11-13T10:50:46Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* String Handling Caveat */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Safe strings ==&lt;br /&gt;
&lt;br /&gt;
Passing strings verbatim to [[llJsonSetValue]] or [[llList2Json]] is not safe. One way to escape strings properly to make them safe for use with both is to use this function:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string String2Json(string s)&lt;br /&gt;
{&lt;br /&gt;
    return llGetSubString(llList2Json(JSON_OBJECT, [s,&amp;quot;&amp;quot;]), 1, -5);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
llOwnerSay(String2Json(llUnescapeURL(&amp;quot;%09&amp;quot;))); // outputs: Object: &amp;quot;\t&amp;quot;&lt;br /&gt;
llOwnerSay(String2Json(&amp;quot;\n&amp;quot;)); // outputs: Object: &amp;quot;\n&amp;quot;&lt;br /&gt;
llOwnerSay(String2Json(&amp;quot;this \&amp;quot;string\&amp;quot; is not safe&amp;quot;)); // outputs: Object: &amp;quot;this \&amp;quot;string\&amp;quot; is not safe&amp;quot;&lt;br /&gt;
llOwnerSay(String2Json(&amp;quot;\&amp;quot;ab\&amp;quot;&amp;quot;)); // outputs: Object: &amp;quot;\&amp;quot;ab\&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Examples of use with the corresponding functions:&lt;br /&gt;
llOwnerSay(llJsonSetValue(&amp;quot;[]&amp;quot;, [0], String2Json(&amp;quot;this \&amp;quot;string\&amp;quot; is not safe&amp;quot;)));&lt;br /&gt;
llOwnerSay(llList2Json(JSON_ARRAY, [String2Json(&amp;quot;this \&amp;quot;string\&amp;quot; is not safe&amp;quot;)]));&lt;br /&gt;
// both output: Object: [&amp;quot;this \&amp;quot;string\&amp;quot; is not safe&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Sei Lisa|Sei Lisa]] 17:22, 6 June 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Due to {{jira|BUG-6495}} this won&#039;t work. Nothing will. JSON is just broken.--[[User:Sei Lisa|Sei Lisa]] ([[User talk:Sei Lisa|talk]]) 07:27, 27 January 2015 (PST)&lt;br /&gt;
&lt;br /&gt;
== String Handling Caveat ==&lt;br /&gt;
&lt;br /&gt;
Currently the caveats section lists string handling as not enclosing strings automatically in inverted commas, however I just tried this myself and it does not appear to be true, as strings were enclosed as I would expect; was this historic behaviour during testing? Can the caveat be removed? -- --&#039;&#039;&#039;[[User:Haravikk_Mistral|Haravikk]]&#039;&#039;&#039; 02:50, 13 November 2016 (PST)&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Feature_Requests&amp;diff=1204808</id>
		<title>Feature Requests</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Feature_Requests&amp;diff=1204808"/>
		<updated>2016-10-30T14:25:11Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Why wasn&amp;#039;t my Feature Request Accepted? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Do you have suggestions for a new or enhanced feature?  We&#039;re always looking for new ideas. Please let us know what you would like to see done.&lt;br /&gt;
&lt;br /&gt;
The best place for your feature requests to get noticed is in [http://jira.secondlife.com JIRA Bug Tracker].&lt;br /&gt;
&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
== How to Write a great Feature Request ==&lt;br /&gt;
&lt;br /&gt;
* Tell us about the specific functionality you&#039;re hoping to see.  Describe both the current behavior and desired behavior in as much detail as possible.&lt;br /&gt;
&lt;br /&gt;
* Provide Supporting Materials.  This can be done with snapshots, videos, example code, etc.  Again, the more information you provide, the better!&lt;br /&gt;
&lt;br /&gt;
* What are the benefits of your Feature?&lt;br /&gt;
&lt;br /&gt;
== What Happens Next ==&lt;br /&gt;
&lt;br /&gt;
Once your Feature Request has been submitted, it will join the queue for a team of Lindens to review. Please be patient... Depending on the nature of your request, it may require members of multiple teams to review.&lt;br /&gt;
&lt;br /&gt;
== Why wasn&#039;t my Feature Request Accepted? ==&lt;br /&gt;
&lt;br /&gt;
Please be reassured this isn&#039;t personal! We understand, and appreciate, that you put a lot of thought into these proposals, and we consider them seriously. Some feature requests we simply cannot do.  Here are some of the reasons why:&lt;br /&gt;
&lt;br /&gt;
* Our internal architecture doesn&#039;t allow it.&lt;br /&gt;
* It will break existing content.&lt;br /&gt;
* It is not scalable.&lt;br /&gt;
* The request will introduce security issues.&lt;br /&gt;
* Scope of work is too great.&lt;br /&gt;
* A Linden didn&#039;t even read it, or couldn&#039;t be bothered talking to you about it.&lt;br /&gt;
[[Category:Bug Tracker]]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40739&amp;diff=1204762</id>
		<title>Template:Issues/BUG-40739</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40739&amp;diff=1204762"/>
		<updated>2016-10-22T10:51:42Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40739|Redesign [[llSitOnLink]]() to use the permissions system|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSitOnLink&amp;diff=1204761</id>
		<title>LlSitOnLink</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSitOnLink&amp;diff=1204761"/>
		<updated>2016-10-22T10:50:53Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llSitOnLink&lt;br /&gt;
|func_desc=The avatar specified by agent_id is forced to sit on the sit target of the prim indicated by the link parameter.  If the specified link is already occupied, the simulator searches down the chain of prims in the link set looking for an available sit target.  &lt;br /&gt;
&lt;br /&gt;
|func_footnote=If successful, this method returns 1.  &lt;br /&gt;
&lt;br /&gt;
If the function fails, it returns a negative number constant.&lt;br /&gt;
&lt;br /&gt;
Link constants that indicate a single prim may be used for the link parameter.  These are LINK_ROOT and LINK_THIS.  Other constants such as LINK_SET, LINK_CHILDREN, LINK_ALL_OTHERS will return an INVALID_LINK error.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;This method must be called from an experience enabled script running on land that has enabled the experience key.&#039;&#039;&#039;&#039;&#039;  If these conditions are not met this method returns a NOT_EXPERIENCE error.&lt;br /&gt;
&lt;br /&gt;
The targeted avatar must also have accepted the experience.  If the user is not participating in the experience this method returns NO_EXPERIENCE_PERMISSION. If the avatar id can not be found or is not over land that has enabled the experience this method returns INVALID_AGENT.&lt;br /&gt;
&lt;br /&gt;
If there are no valid sit targets remaining in the linkset this method returns NO_SIT_TARGET and no action is taken with the avatar.&lt;br /&gt;
&lt;br /&gt;
If the avatar does not have access to the parcel containing the prim running this script, this call fails.&lt;br /&gt;
|return_type=Integer&lt;br /&gt;
|p1_type=key|p1_name=agent_id|p1_desc=UUID of the avatar being forced to sit&lt;br /&gt;
|p2_type=integer|p2_name=link|p2_desc=Link number for the prim containing the desired sit target&lt;br /&gt;
|constants={{llSitOnLinkConstants}}&lt;br /&gt;
|notes=This function was introduced in conjunction with new [[llSetPrimitiveParams|primitive parameter]] constants: [[PRIM_ALLOW_UNSIT]], [[PRIM_SCRIPTED_SITS_ONLY]], and [[PRIM_SIT_TARGET]].&lt;br /&gt;
|also_functions=&lt;br /&gt;
* [[llLinkSitTarget]]&lt;br /&gt;
* [[llSitTarget]]&lt;br /&gt;
* [[llSetSitText]]&lt;br /&gt;
* [[llAvatarOnLinkSitTarget]]&lt;br /&gt;
* [[llAvatarOnSitTarget]]&lt;br /&gt;
* [[llUnSit]]&lt;br /&gt;
===Constants===&lt;br /&gt;
* [[PRIM_ALLOW_UNSIT]]&lt;br /&gt;
* [[PRIM_SCRIPTED_SIT_ONLY]]&lt;br /&gt;
* [[PRIM_SIT_TARGET]]&lt;br /&gt;
|inject-2={{Issues/BUG-40739}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40739&amp;diff=1204760</id>
		<title>Template:Issues/BUG-40739</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40739&amp;diff=1204760"/>
		<updated>2016-10-22T10:50:40Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-40739|Redesign llSitOnLink() to the permissions system|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40739|Redesign [[llSitOnLink]]() to the permissions system|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetAgentList&amp;diff=1204729</id>
		<title>LlGetAgentList</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetAgentList&amp;diff=1204729"/>
		<updated>2016-10-12T13:26:48Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SCR-311}}{{Issues/SVC-5488}}{{Issues/MISC-243}}{{Issues/BUG-40680}}{{Issues/BUG-40681}}&lt;br /&gt;
|func=llGetAgentList&lt;br /&gt;
|sort=GetAgentList&lt;br /&gt;
|func_id&lt;br /&gt;
|func_sleep=0&lt;br /&gt;
|func_energy=0&lt;br /&gt;
|func_desc=Requests a list of agents currently in the region, limited by the scope parameter.&lt;br /&gt;
|func_footnote=&lt;br /&gt;
|return_type=list&lt;br /&gt;
|return_text=&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[&amp;lt;/nowiki&amp;gt;[[key]]&amp;amp;nbsp;{{HoverText|id0|First agent key}}, [[key]]&amp;amp;nbsp;{{HoverText|id1|Second agent key}}, ..., [[key]]&amp;amp;nbsp;{{HoverText|idn|nᵗʰ agent key}}]&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[&amp;lt;/nowiki&amp;gt;[[string]]&amp;amp;nbsp;{{HoverText|error_msg|An error message}}]&amp;lt;/code&amp;gt; -  returns avatar keys for all agents in the region limited to the area(s) specified by scope&lt;br /&gt;
|spec=&lt;br /&gt;
|p1_type=integer|p1_name=scope|p1_hover=AGENT_LIST_* flag specifies the selection scope|p1_desc=&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
{{Collapsible_Table/Simple|title=AGENT_LIST_* flag specifies the selection scope&lt;br /&gt;
|content={{!}}&lt;br /&gt;
* [[AGENT_LIST_PARCEL]] - returns only agents on the same parcel where the script is running.&lt;br /&gt;
* [[AGENT_LIST_PARCEL_OWNER]] - returns only agents on any parcel in the region where the parcel owner is the same as the owner of the parcel under the scripted object.&lt;br /&gt;
* [[AGENT_LIST_REGION]] - returns any/all agents in the region.&lt;br /&gt;
}}&lt;br /&gt;
|p2_type=list|p2_subtype=instructions|p2_name=options|p2_desc=Unused.&lt;br /&gt;
|constants=&lt;br /&gt;
|caveats=&lt;br /&gt;
* There is no guaranteed understandable order or randomness to the list returned.&lt;br /&gt;
* Will only return up to 100 agents.&lt;br /&gt;
|examples=&lt;br /&gt;
{{LSL Tip|To check if an avatar is in the same sim, please check whether [[llGetAgentSize]] does NOT return [[ZERO_VECTOR]]. It&#039;s much faster and easier than calling [[llGetAgentList]] and running through the list to compare a given key with each list item.}}&lt;br /&gt;
{{LSL Tip|As of now, this function does not have a delimiter for its option list. This means, the function MIGHT return up to a hundred avatar keys. You&#039;ll need a lot of free memory to be able to store those keys, be warned of possible STACK_HEAP_COLLISION_ERRORs.}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//Displays up to 100 avatar key: name pairs detected in the entire region&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        list avatarsInRegion = llGetAgentList(AGENT_LIST_REGION, []);&lt;br /&gt;
        integer numOfAvatars = llGetListLength(avatarsInRegion);&lt;br /&gt;
&lt;br /&gt;
        // if no avatars, abort avatar listing process and give a short notice&lt;br /&gt;
        if (!numOfAvatars)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;No avatars found within the region!&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer index;&lt;br /&gt;
        while (index &amp;lt; numOfAvatars)&lt;br /&gt;
        {&lt;br /&gt;
            key id = llList2Key(avatarsInRegion, index);&lt;br /&gt;
            string name = llKey2Name(id);&lt;br /&gt;
&lt;br /&gt;
            llOwnerSay(name + &amp;quot; [ &amp;quot; + (string)id + &amp;quot; ]&amp;quot;);&lt;br /&gt;
            ++index;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//  Orders new list based on distance&lt;br /&gt;
//  and returns names and distances on touch&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        list keys = llGetAgentList(AGENT_LIST_REGION, []);&lt;br /&gt;
        integer numberOfKeys = llGetListLength(keys);&lt;br /&gt;
&lt;br /&gt;
        vector currentPos = llGetPos();&lt;br /&gt;
        list newkeys;&lt;br /&gt;
        key thisAvKey;&lt;br /&gt;
&lt;br /&gt;
        integer i;&lt;br /&gt;
        for (i = 0; i &amp;lt; numberOfKeys; ++i) {&lt;br /&gt;
            thisAvKey = llList2Key(keys,i);&lt;br /&gt;
            newkeys += [llRound(llVecDist(currentPos,&lt;br /&gt;
                            llList2Vector(llGetObjectDetails(thisAvKey, [OBJECT_POS]), 0))),&lt;br /&gt;
                        thisAvKey];&lt;br /&gt;
        }&lt;br /&gt;
  &lt;br /&gt;
        newkeys = llListSort(newkeys, 2, FALSE);     //  sort strided list by descending distance&lt;br /&gt;
&lt;br /&gt;
        for (i = 0; i &amp;lt; (numberOfKeys * 2); i += 2) {&lt;br /&gt;
            llOwnerSay(llGetDisplayName(llList2Key(newkeys, i+1))&lt;br /&gt;
                +&amp;quot; [&amp;quot;+ (string) llList2Integer(newkeys, i) + &amp;quot;m]&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_functions=*[[llGetRegionAgentCount]]&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes&lt;br /&gt;
|deprecated&lt;br /&gt;
|location&lt;br /&gt;
|history=&lt;br /&gt;
* New function proposed by LL, reconciling the feature suggestions {{Jira|SVC-805}}, {{Jira|SVC-6427}}, {{Jira|MISC-243}} and {{Jira|SVC-5488}}.&lt;br /&gt;
* Pre-Released [[Release_Notes/Second_Life_RC_Magnum/12]] - Original JIRA requested &amp;quot;llGetRegionAgents()&amp;quot;, the name changed since the released function does more.&lt;br /&gt;
* Date of Release  [[ Release_Notes/Second_Life_Server/12#12.04.30.255166 | 30/04/2012 ]]&lt;br /&gt;
|cat1=Functions&lt;br /&gt;
|cat2=Avatar&lt;br /&gt;
|cat3=Owner&lt;br /&gt;
|cat4=Parcel&lt;br /&gt;
|cat5=Region&lt;br /&gt;
|cat6&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40680&amp;diff=1204728</id>
		<title>Template:Issues/BUG-40680</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40680&amp;diff=1204728"/>
		<updated>2016-10-12T13:26:06Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-40680|&amp;#039;&amp;#039;&amp;#039;AGENT_LIST_LIMIT&amp;#039;&amp;#039;&amp;#039; option for llGetAgentList()|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40680|&#039;&#039;&#039;AGENT_LIST_LIMIT&#039;&#039;&#039; option for [[llGetAgentList]]()|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/SCR-311&amp;diff=1204727</id>
		<title>Template:Issues/SCR-311</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/SCR-311&amp;diff=1204727"/>
		<updated>2016-10-12T13:25:10Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Marking as fixed, even though the JIRA issue itself has been left as pending (function works properly in all simulator versions).&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|SCR-311|type=bug|status=fixp|[[llGetAgentList]]() with scope [[AGENT_LIST_PARCEL]] or [[AGENT_LIST_PARCEL_OWNER]] returns {{HoverText|empty list|[]}} when [[attach]]ed to avatar|status=vfix|resolution=fixed}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40681&amp;diff=1204726</id>
		<title>Template:Issues/BUG-40681</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40681&amp;diff=1204726"/>
		<updated>2016-10-12T13:21:50Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-40681|&amp;#039;&amp;#039;&amp;#039;llGetNumberOfAgents&amp;#039;&amp;#039;&amp;#039;() - companion to llGetAgentList() for retrieving count only.|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40681|&#039;&#039;&#039;llGetNumberOfAgents&#039;&#039;&#039;() - companion to [[llGetAgentList]]() for retrieving count only.|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSitOnLink&amp;diff=1204725</id>
		<title>LlSitOnLink</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSitOnLink&amp;diff=1204725"/>
		<updated>2016-10-12T10:15:40Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llSitOnLink&lt;br /&gt;
|func_desc=The avatar specified by agent_id is forced to sit on the sit target of the prim indicated by the link parameter.  If the specified link is already occupied, the simulator searches down the chain of prims in the link set looking for an available sit target.  &lt;br /&gt;
&lt;br /&gt;
|func_footnote=If successful, this method returns 1.  &lt;br /&gt;
&lt;br /&gt;
If the function fails, it returns a negative number constant.&lt;br /&gt;
&lt;br /&gt;
Link constants that indicate a single prim may be used for the link parameter.  These are LINK_ROOT and LINK_THIS.  Other constants such as LINK_SET, LINK_CHILDREN, LINK_ALL_OTHERS will return an INVALID_LINK error.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;This method must be called from an experience enabled script running on land that has enabled the experience key.&#039;&#039;&#039;&#039;&#039;  If these conditions are not met this method returns a NOT_EXPERIENCE error.&lt;br /&gt;
&lt;br /&gt;
The targeted avatar must also have accepted the experience.  If the user is not participating in the experience this method returns NO_EXPERIENCE_PERMISSION. If the avatar id can not be found or is not over land that has enabled the experience this method returns INVALID_AGENT.&lt;br /&gt;
&lt;br /&gt;
If there are no valid sit targets remaining in the linkset this method returns NO_SIT_TARGET and no action is taken with the avatar.&lt;br /&gt;
&lt;br /&gt;
If the avatar does not have access to the parcel containing the prim running this script, this call fails.&lt;br /&gt;
|return_type=Integer&lt;br /&gt;
|p1_type=key|p1_name=agent_id|p1_desc=UUID of the avatar being forced to sit&lt;br /&gt;
|p2_type=integer|p2_name=link|p2_desc=Link number for the prim containing the desired sit target&lt;br /&gt;
|constants={{llSitOnLinkConstants}}&lt;br /&gt;
|notes=This function was introduced in conjunction with new [[llSetPrimitiveParams|primitive parameter]] constants: [[PRIM_ALLOW_UNSIT]], [[PRIM_SCRIPTED_SITS_ONLY]], and [[PRIM_SIT_TARGET]].&lt;br /&gt;
|also_functions=&lt;br /&gt;
* [[llLinkSitTarget]]&lt;br /&gt;
* [[llSitTarget]]&lt;br /&gt;
* [[llSetSitText]]&lt;br /&gt;
* [[llAvatarOnLinkSitTarget]]&lt;br /&gt;
* [[llAvatarOnSitTarget]]&lt;br /&gt;
* [[llUnSit]]&lt;br /&gt;
===Constants===&lt;br /&gt;
* [[PRIM_ALLOW_UNSIT]]&lt;br /&gt;
* [[PRIM_SCRIPTED_SIT_ONLY]]&lt;br /&gt;
* [[PRIM_SIT_TARGET]]&lt;br /&gt;
|inject-2={{Issues/BUG-40679}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40679&amp;diff=1204724</id>
		<title>Template:Issues/BUG-40679</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40679&amp;diff=1204724"/>
		<updated>2016-10-12T10:15:17Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40679|Enable [[llSitOnLink]]() for non-experience use cases|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40679&amp;diff=1204723</id>
		<title>Template:Issues/BUG-40679</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40679&amp;diff=1204723"/>
		<updated>2016-10-12T10:14:45Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-40679|Enable &amp;#039;&amp;#039;&amp;#039;llSitOnLink&amp;#039;&amp;#039;&amp;#039;() for non-experience use cases|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40679|Enable &#039;&#039;&#039;llSitOnLink&#039;&#039;&#039;() for non-experience use cases|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral/JIRA/Issues/All&amp;diff=1204704</id>
		<title>User:Haravikk Mistral/JIRA/Issues/All</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral/JIRA/Issues/All&amp;diff=1204704"/>
		<updated>2016-10-07T10:47:14Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:issues|}}&lt;br /&gt;
&lt;br /&gt;
{{Issues/BUG-40656}}&lt;br /&gt;
{{Issues/BUG-40654}}&lt;br /&gt;
{{Issues/BUG-40653}}&lt;br /&gt;
{{Issues/BUG-40645}}&lt;br /&gt;
{{Issues/BUG-40588}}&lt;br /&gt;
{{Issues/BUG-10964}}&lt;br /&gt;
{{Issues/BUG-10965}}&lt;br /&gt;
{{Issues/BUG-7729}}&lt;br /&gt;
{{Issues/BUG-7853}}&lt;br /&gt;
{{Issues/BUG-7854}}&lt;br /&gt;
{{Issues/BUG-7743}}&lt;br /&gt;
{{Issues/BUG-7767}}&lt;br /&gt;
{{Issues/BUG-7882}}&lt;br /&gt;
&lt;br /&gt;
}}{{{!}}&lt;br /&gt;
{{#var:issues}}&lt;br /&gt;
{{!}}}{{#vardefine:issues|}}&lt;br /&gt;
[https://jira.secondlife.com/issues/?jql=reporter%20%3D&#039;Haravikk%20Mistral&#039;%20ORDER%20BY%20createdDate%20DESC More]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40656&amp;diff=1204703</id>
		<title>Template:Issues/BUG-40656</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40656&amp;diff=1204703"/>
		<updated>2016-10-07T10:41:56Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-40656|Cookie support for HTTP requests and responses|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40656|Cookie support for HTTP requests and responses|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40654&amp;diff=1204702</id>
		<title>Template:Issues/BUG-40654</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40654&amp;diff=1204702"/>
		<updated>2016-10-07T10:41:20Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-40654|&amp;#039;&amp;#039;&amp;#039;llSetHTTPHeader&amp;#039;&amp;#039;&amp;#039;() - Enable setting of headers in &amp;#039;&amp;#039;&amp;#039;http_response&amp;#039;&amp;#039;&amp;#039;()|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40654|&#039;&#039;&#039;llSetHTTPHeader&#039;&#039;&#039;() - Enable setting of headers in &#039;&#039;&#039;http_response&#039;&#039;&#039;()|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40653&amp;diff=1204701</id>
		<title>Template:Issues/BUG-40653</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40653&amp;diff=1204701"/>
		<updated>2016-10-07T10:40:15Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-40653|Allow &amp;#039;&amp;#039;&amp;#039;llGetHTTPHeader&amp;#039;&amp;#039;&amp;#039;() in the &amp;#039;&amp;#039;&amp;#039;http_response&amp;#039;&amp;#039;&amp;#039;() event|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40653|Allow &#039;&#039;&#039;llGetHTTPHeader&#039;&#039;&#039;() in the &#039;&#039;&#039;http_response&#039;&#039;&#039;() event|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1204700</id>
		<title>Simulator User Group</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1204700"/>
		<updated>2016-10-07T10:34:24Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User Group Page&lt;br /&gt;
|purpose=&lt;br /&gt;
The Server User Group exists to provide an opportunity for discussion about server technology, annoying bugs, and feature ideas.&lt;br /&gt;
|date-time= &lt;br /&gt;
* Tuesdays 12:00-13:00 (general) http://slurl.com/secondlife/Denby/220/41/33, &lt;br /&gt;
Meetings are&lt;br /&gt;
|location= &#039;&#039;&#039;Denby/225/25/25&#039;&#039;&#039;&lt;br /&gt;
|agenda=&lt;br /&gt;
* LL developer news&lt;br /&gt;
* Open discussion&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
|team= &lt;br /&gt;
* [[User:Andrew Linden|Andrew Linden]] (honorary member for all time)&lt;br /&gt;
* [[User:Simon Linden|Simon Linden]]&lt;br /&gt;
* [[User:Kelly Linden|Kelly Linden]]&lt;br /&gt;
* [[User:Baker Linden|Baker Linden]]&lt;br /&gt;
* [[User:Oz Linden|Oz Linden]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Meeting cancelled for August 12, 2014&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014.12  &#039;&#039;&#039;December&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.30|30]]&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.11  &#039;&#039;&#039;Nov&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&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;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;October&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.09  &#039;&#039;&#039;September&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.30|30]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.08  &#039;&#039;&#039;August&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
|-&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.05|05]]&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.12|12]]&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.19|19]]&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.26|26]]&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
| 31&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;
&lt;br /&gt;
2014.07  &#039;&#039;&#039;July&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.06  &#039;&#039;&#039;June&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.03|03]]&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
|-&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.10|10]]&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.17|17]]&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
|-&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.24|24]]&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
|-&lt;br /&gt;
| 29&lt;br /&gt;
| 30&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;
2014.05  &#039;&#039;&#039;May&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
|-&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.06|06]]&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.13|13]]&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.20|20]]&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.27|27]]&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.04  &#039;&#039;&#039;April&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.03  &#039;&#039;&#039;March&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| 31&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;
2014.02  &#039;&#039;&#039;February&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;January&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2012]]&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2011]]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral/JIRA/Issues/All&amp;diff=1204693</id>
		<title>User:Haravikk Mistral/JIRA/Issues/All</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral/JIRA/Issues/All&amp;diff=1204693"/>
		<updated>2016-10-06T14:18:02Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:issues|}}&lt;br /&gt;
&lt;br /&gt;
{{Issues/BUG-40645}}&lt;br /&gt;
{{Issues/BUG-40588}}&lt;br /&gt;
{{Issues/BUG-10964}}&lt;br /&gt;
{{Issues/BUG-10965}}&lt;br /&gt;
{{Issues/BUG-7729}}&lt;br /&gt;
{{Issues/BUG-10924}}&lt;br /&gt;
{{Issues/BUG-7853}}&lt;br /&gt;
{{Issues/BUG-7854}}&lt;br /&gt;
{{Issues/BUG-7743}}&lt;br /&gt;
{{Issues/BUG-7767}}&lt;br /&gt;
{{Issues/BUG-7882}}&lt;br /&gt;
{{Issues/BUG-10971}}&lt;br /&gt;
&lt;br /&gt;
}}{{{!}}&lt;br /&gt;
{{#var:issues}}&lt;br /&gt;
{{!}}}{{#vardefine:issues|}}&lt;br /&gt;
[https://jira.secondlife.com/issues/?jql=reporter%20%3D&#039;Haravikk%20Mistral&#039;%20ORDER%20BY%20createdDate%20DESC More]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40645&amp;diff=1204692</id>
		<title>Template:Issues/BUG-40645</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40645&amp;diff=1204692"/>
		<updated>2016-10-06T14:17:20Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-40645|&amp;#039;&amp;#039;&amp;#039;llCreateBakedTexture&amp;#039;&amp;#039;&amp;#039;() - Texture Baking for Scripted Objects|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-40645|&#039;&#039;&#039;llCreateBakedTexture&#039;&#039;&#039;() - Texture Baking for Scripted Objects|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral/JIRA/Issues/All&amp;diff=1204668</id>
		<title>User:Haravikk Mistral/JIRA/Issues/All</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral/JIRA/Issues/All&amp;diff=1204668"/>
		<updated>2016-09-28T10:03:43Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:issues|}}&lt;br /&gt;
&lt;br /&gt;
{{Issues/BUG-40588}}&lt;br /&gt;
{{Issues/BUG-10964}}&lt;br /&gt;
{{Issues/BUG-10965}}&lt;br /&gt;
{{Issues/BUG-7729}}&lt;br /&gt;
{{Issues/BUG-10924}}&lt;br /&gt;
{{Issues/BUG-7853}}&lt;br /&gt;
{{Issues/BUG-7854}}&lt;br /&gt;
{{Issues/BUG-7743}}&lt;br /&gt;
{{Issues/BUG-7767}}&lt;br /&gt;
{{Issues/BUG-7882}}&lt;br /&gt;
{{Issues/BUG-10971}}&lt;br /&gt;
&lt;br /&gt;
}}{{{!}}&lt;br /&gt;
{{#var:issues}}&lt;br /&gt;
{{!}}}{{#vardefine:issues|}}&lt;br /&gt;
[https://jira.secondlife.com/issues/?jql=reporter%20%3D&#039;Haravikk%20Mistral&#039;%20ORDER%20BY%20createdDate%20DESC More]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40588&amp;diff=1204667</id>
		<title>Template:Issues/BUG-40588</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-40588&amp;diff=1204667"/>
		<updated>2016-09-28T10:03:08Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{issues|BUG-40588|&amp;#039;&amp;#039;&amp;#039;llGetInventoryTime&amp;#039;&amp;#039;&amp;#039;() - Added/Modified Time for Inventory Assets|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{issues|BUG-40588|&#039;&#039;&#039;llGetInventoryTime&#039;&#039;&#039;() - Added/Modified Time for Inventory Assets|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:PRIM_POINT_LIGHT&amp;diff=1199102</id>
		<title>Talk:PRIM POINT LIGHT</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:PRIM_POINT_LIGHT&amp;diff=1199102"/>
		<updated>2016-02-17T11:10:19Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Multiplying Colour? */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multiplying Colour? ==&lt;br /&gt;
&lt;br /&gt;
In the compact version example is there a reason for multiplying the colour in this line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;PRIM_POINT_LIGHT, switch, &amp;lt;1, 0.5, 0.1&amp;gt; *  switch, 1, 10, 0.6 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the light is being switched off then the colour will be multiplied down to &amp;lt;0,0,0&amp;gt; (black), but it seems that this is set when a light is disabled anyway (if you turn a light off then back on via script, it will be coloured black, with 0 for all values). -- --&#039;&#039;&#039;[[User:Haravikk_Mistral|Haravikk]]&#039;&#039;&#039; 03:10, 17 February 2016 (PST)&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlSetText&amp;diff=1198834</id>
		<title>Talk:LlSetText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlSetText&amp;diff=1198834"/>
		<updated>2016-01-12T09:58:59Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* llSetText for storage */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JIRA New Feature llGetText ==&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a first draft. Good to go? Ready to add near http://jira.secondlife.com/secure/QuickSearch.jspa after logging in with the usual Second Life name &amp;amp; password? Yes/ no/ almost? -- [[User:Ppaatt Lynagh|Ppaatt Lynagh]] 20:55, 1 November 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
PROJECT = MISC (chosen from VWR SVX WEB MISC Eventlet Mulib CertifiedHTTP)&lt;br /&gt;
&lt;br /&gt;
ISSUE TYPE = New Feature (chosen from Bug, New Feature)&lt;br /&gt;
&lt;br /&gt;
SUMMARY = A function named llGetText should exist to tell the script calling llSetText if the script is or is not changing the floating text of the prim.&lt;br /&gt;
&lt;br /&gt;
PRIORITY = Normal (chosen from Showstopper, Critical, Major, Normal, Small)&lt;br /&gt;
&lt;br /&gt;
COMPONENT/S = Unknown (chosen from Unknown, Miscellaneous)&lt;br /&gt;
&lt;br /&gt;
AFFECTS VERSION/S = Unknown (not editable)&lt;br /&gt;
&lt;br /&gt;
LINDEN LAB ISSUE ID = (intentionally left blank)&lt;br /&gt;
&lt;br /&gt;
ENVIRONMENT = N/A&lt;br /&gt;
&lt;br /&gt;
DESCRIPTION =&lt;br /&gt;
&lt;br /&gt;
A function named llGetText should exist to tell the script calling llSetText if the script is or is not changing the floating text of the prim. For example, llGetText could return a list of four results: [text, color, alpha, font].&lt;br /&gt;
&lt;br /&gt;
This specific need to add llGetText to LSL illustrates a general design principle. LSL should define a way to get back everything it sets. Otherwise one script cannot discover if another script has set a property. For example, a script cannot see if an object has been labeled for sale, given a custom label, or given no label at all as its floating text. As another example, an instance of an editor script cannot show the operator if the operator has set the property thru another script instance.&lt;br /&gt;
&lt;br /&gt;
ATTACHMENT = None&lt;br /&gt;
&lt;br /&gt;
PATCH ATTACHED = (intentionally left blank)&lt;br /&gt;
&lt;br /&gt;
SOURCE VERSION = (intentionally left blank)&lt;br /&gt;
&lt;br /&gt;
== llGetText ==&lt;br /&gt;
&lt;br /&gt;
I think it should point to a JIRA feature suggestion but I&#039;m not feeling inspired enough to write one up. -- [[User:Strife Onizuka|Strife Onizuka]] 12:55, 29 October 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Thanks for making time to say so. I didn&#039;t know that. Now that I do, I&#039;ll volunteer me to research and then publish an article here that invites our audience to contribute to JIRA also. Writing up the JIRA entry for llGetText will be my first example, unless another among us beats me to it. -- [[User:Ppaatt Lynagh|Ppaatt Lynagh]] 13:07, 29 October 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:[[User:Strife_Onizuka]] &amp;gt; http://wiki.secondlife.com/wiki/Category:Jira_Reporters &amp;gt; [[Bug Reporting 101]] may be relevant. -- [[User:Ppaatt Lynagh|Ppaatt Lynagh]] 13:16, 29 October 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Wow that mess of a web of pages near [[Bug Reporting 101]] is nearly indecipherable.&lt;br /&gt;
&lt;br /&gt;
:http://jira.secondlife.com/secure/QuickSearch.jspa might be the first step that those too many words recommend. As of this moment, llSetText finds hits, llGetText finds no hits, confirming Strife&#039;s idea that we should add llGetText. -- [[User:Ppaatt Lynagh|Ppaatt Lynagh]] 20:26, 1 November 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
I regret that there were so many edits, it&#039;s the first time I&#039;ve contributed content to this Wiki, and am still learning the formatting.  Thanks for understanding.  It would help if there were a generic page with the formatting already in place that users could edit -- there may be one somewhere, but I haven&#039;t found it yet.  -- [[User:Rich Nykvist|Rich]]&lt;br /&gt;
:Don&#039;t worry about the number of edits. Just look around at the syntax used on other pages, it&#039;s the easiest way. [[User:Strife Onizuka|Strife Onizuka]] 04:54, 8 February 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
: With the exception of editing actual template code (as opposed to code that uses templates), the &amp;quot;Show Preview&amp;quot; button will allow you to keep an eye on your changes without committing them to the article :-)&lt;br /&gt;
: [[User:SignpostMarv Martin|SignpostMarv Martin]] 05:36, 8 February 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
== Different colors in the displayed text? ==&lt;br /&gt;
&lt;br /&gt;
I recently saw some RPG engine that lets people have colored health bars in the hovertext above their head.&lt;br /&gt;
&lt;br /&gt;
Is there a way to specify colors for individual text characters, or are they doing this by stacking up several llSetText prims, each showing only one color? [[User:Scalar Tardis|Scalar Tardis]] 20:25, 25 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Stacking. -- [[User:Strife Onizuka|Strife Onizuka]] 15:19, 26 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
== llSetText for storage ==&lt;br /&gt;
&lt;br /&gt;
Regarding the caveat &amp;quot;Do not rely on Floating Text as a storage medium; it is neither secure nor finalized.&amp;quot; I&#039;m wondering how necessary some of this is as a caveat anymore?&lt;br /&gt;
&lt;br /&gt;
I&#039;m not aware of the text limit for hover-text having changed in a long time, and even if it were to change that&#039;s an argument for checking that any stored data is the length you expect it to be (e.g- store expected length first). The main argument against storage is the lack of security, but the same is true of using prim descriptions, which are also commonly used for storage that can survive resets.&lt;br /&gt;
&lt;br /&gt;
I often use invisible set-text to store short pieces of persistent data that I need to survive resets (but which I&#039;m not concerned about being inspected), while leaving descriptions free for users to change manually (as I like to use descriptions for specifying prim-properties that a script can load, such as allowing a script to change all prims with the &amp;quot;primary&amp;quot; keyword). Obviously pushing the limits of either isn&#039;t a great idea, but short text should be fine in both so long as it&#039;s nothing sensitive, so I&#039;m wondering if the caveats should be updated to reflect that? The caveats for this page could probably use a cleanup in general actually, as things like clearing text could do with being in examples I think. --&#039;&#039;&#039;[[User:Haravikk_Mistral|Haravikk]]&#039;&#039;&#039; 01:58, 12 January 2016 (PST)&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral/Signature&amp;diff=1198833</id>
		<title>User:Haravikk Mistral/Signature</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral/Signature&amp;diff=1198833"/>
		<updated>2016-01-12T09:55:31Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&#039;&#039;&#039;[[User:Haravikk_Mistral|Haravikk]]&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1198776</id>
		<title>Simulator User Group</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1198776"/>
		<updated>2016-01-06T20:47:18Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User Group Page&lt;br /&gt;
|purpose=&lt;br /&gt;
The Server User Group exists to provide an opportunity for discussion about server technology, annoying bugs, and feature ideas.&lt;br /&gt;
|date-time= &lt;br /&gt;
* Tuesdays 12:00-13:00 (general) http://slurl.com/secondlife/Denby/220/41/33, &lt;br /&gt;
Meetings are&lt;br /&gt;
|location= &#039;&#039;&#039;Denby/225/25/25&#039;&#039;&#039;&lt;br /&gt;
|agenda=&lt;br /&gt;
* LL developer news&lt;br /&gt;
* Please review the premature closure of the following issues by Kyle Linden. I know he&#039;s not listed as a server/sim/scripting group member, but I have no idea who we&#039;re supposed to contact about closed issues as Lindens never seem to reply to IMs. I want to stress also that I am utterly sick of the pathetic canned responses that JIRA issues get when closed, because not only do they give no specific information, all they really do is link to a wiki page that is worse than useless at indicating valid reasons why an issue was closed, it&#039;s a deeply hostile process that makes me wonder why anyone bothers trying to improve SL. Anyway, sorry that these aren&#039;t all server/sim/scripting, but who the heck are we supposed to talk to about closed issues anymore? Reporters don&#039;t have any control over their own issues once closed. Anyway, these are the ones that I posted, I&#039;m sure Kyle&#039;s closing-with-worthless-canned-text rampage has affected others as well. -- [[User:Haravikk Mistral|Haravikk]]&lt;br /&gt;
** {{jira|BUG-10924|BUG-10924 llSubListFindList}}- this clearly comes under the remit of server/sim/scripting, so I don&#039;t know who Kyle is representing while closing the issue. However, the proposed function is very simple, actually it&#039;s just a case of adding a loop to skip items till start index is reached, then a counter to exit the function if the end index is reached, both changes that can actually be added to the existing code, with llListFindList becoming an equivalent of llSubListFindList(haystack, needle, 0, -1).&lt;br /&gt;
** {{jira|BUG-10965|BUG-10965|BUG-10965}}- this is a viewer-side only issue intended for open development which I&#039;m still hoping to find someone to implement or, if I can ever find the time, will implement myself. I don&#039;t know why it should be closed, at all, and I actually added as a result of discussion at one of these meetings.&lt;br /&gt;
** {{jira|BUG-10931|BUG-10931 Add support Ctrl-A and Ctrl-E Mac keyboard shortcuts for start/end of line}}- another viewer-only issue intended for open development, but I don&#039;t know who Kyle Linden is representing (no mention anywhere that I can see). It&#039;s a fairly important one as duplicating all Ctrl-key combinations onto Command-key was never a good idea in the first place, as it limits the keyspace for Mac shortcuts, and actually results in shortcuts that behave very differently to other programs; as mentioned in the JIRA issue, Ctrl-E and Ctrl-A are commonly available in most Mac programs with text-fields, but behave very differently in SL.&lt;br /&gt;
* Open discussion&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
|team= &lt;br /&gt;
* [[User:Andrew Linden|Andrew Linden]] (honorary member for all time)&lt;br /&gt;
* [[User:Simon Linden|Simon Linden]]&lt;br /&gt;
* [[User:Kelly Linden|Kelly Linden]]&lt;br /&gt;
* [[User:Baker Linden|Baker Linden]]&lt;br /&gt;
* [[User:Oz Linden|Oz Linden]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Meeting cancelled for August 12, 2014&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014.12  &#039;&#039;&#039;December&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.30|30]]&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.11  &#039;&#039;&#039;Nov&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&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;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;October&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.09  &#039;&#039;&#039;September&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.30|30]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.08  &#039;&#039;&#039;August&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
|-&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.05|05]]&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.12|12]]&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.19|19]]&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.26|26]]&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
| 31&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;
&lt;br /&gt;
2014.07  &#039;&#039;&#039;July&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.06  &#039;&#039;&#039;June&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.03|03]]&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
|-&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.10|10]]&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.17|17]]&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
|-&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.24|24]]&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
|-&lt;br /&gt;
| 29&lt;br /&gt;
| 30&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;
2014.05  &#039;&#039;&#039;May&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
|-&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.06|06]]&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.13|13]]&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.20|20]]&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.27|27]]&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.04  &#039;&#039;&#039;April&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.03  &#039;&#039;&#039;March&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| 31&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;
2014.02  &#039;&#039;&#039;February&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;January&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2012]]&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2011]]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1198773</id>
		<title>Simulator User Group</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1198773"/>
		<updated>2016-01-06T20:23:07Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User Group Page&lt;br /&gt;
|purpose=&lt;br /&gt;
The Server User Group exists to provide an opportunity for discussion about server technology, annoying bugs, and feature ideas.&lt;br /&gt;
|date-time= &lt;br /&gt;
* Tuesdays 12:00-13:00 (general) http://slurl.com/secondlife/Denby/220/41/33, &lt;br /&gt;
Meetings are&lt;br /&gt;
|location= &#039;&#039;&#039;Denby/225/25/25&#039;&#039;&#039;&lt;br /&gt;
|agenda=&lt;br /&gt;
* LL developer news&lt;br /&gt;
* Review premature closure of {{jira|BUG-10924|BUG-10924 llSubListFindList}}- it is a very simple function as llListFindList is already implemented, all that is required is to skip to the start index, and stop after the end index is reached. In essence only a single function implementation is required, as llListFindList would be equivalent to llSubListFindList(haystack, needle, 0, -1). With the woeful inefficiency of lists it&#039;s also a very important capability to have, if it can be strided at the same time (thus restricting which indices potential matches can start from) that would be even better. -- [[User:Haravikk Mistral|Haravikk]]&lt;br /&gt;
* Review premature closure of {{jira|BUG-10965|BUG-10965|BUG-10965}}- mainly because it isn&#039;t a server, simulator or scripting issue at all, since the drift occurs on the client-side. This particular issue is also specifically a viewer-side open-development issue that I&#039;m hoping to either find someone willing to implement or, if I can ever find the time, implement myself; also, if {{jira|BUG-10964}} is accepted then this should be too, as they&#039;re essentially two aspects of the same thing (ensuring animations display with correct timing per-viewer, so future cross-viewer features can be implemented for synchronised timing). -- [[User:Haravikk Mistral|Haravikk]]&lt;br /&gt;
* Review premature closure of {{jira|BUG-10931|BUG-10931 Add support Ctrl-A and Ctrl-E Mac keyboard shortcuts for start/end of line}}- in what way is this &amp;quot;unactionable&amp;quot;? I have to say I&#039;m really sick of the pathetic canned responses that closed issues get, it provides no information whatsoever as to why this issue might be &amp;quot;unactionable&amp;quot; (the wiki page is worse than useless). This is a simple keyboard shortcut, it&#039;s clearly possible to have separate Mac and Windows shortcuts, and it&#039;s a very useful shortcut to have, it&#039;s also an issue with SL&#039;s generally poor native platform support, as these shortcuts are available in most Mac programs with text-fields, yet behave completely differently in SL. In fact, having every Ctrl-shortcut from the Windows client in the Mac client was just a bad idea to begin with, as that&#039;s just now how keyboard shortcuts are done on Macs. -- [[User:Haravikk Mistral|Haravikk]]&lt;br /&gt;
* Open discussion&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
|team= &lt;br /&gt;
* [[User:Andrew Linden|Andrew Linden]] (honorary member for all time)&lt;br /&gt;
* [[User:Simon Linden|Simon Linden]]&lt;br /&gt;
* [[User:Kelly Linden|Kelly Linden]]&lt;br /&gt;
* [[User:Baker Linden|Baker Linden]]&lt;br /&gt;
* [[User:Oz Linden|Oz Linden]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Meeting cancelled for August 12, 2014&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014.12  &#039;&#039;&#039;December&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.30|30]]&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.11  &#039;&#039;&#039;Nov&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&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;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;October&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.09  &#039;&#039;&#039;September&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.30|30]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.08  &#039;&#039;&#039;August&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
|-&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.05|05]]&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.12|12]]&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.19|19]]&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.26|26]]&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
| 31&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;
&lt;br /&gt;
2014.07  &#039;&#039;&#039;July&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.06  &#039;&#039;&#039;June&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.03|03]]&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
|-&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.10|10]]&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.17|17]]&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
|-&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.24|24]]&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
|-&lt;br /&gt;
| 29&lt;br /&gt;
| 30&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;
2014.05  &#039;&#039;&#039;May&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
|-&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.06|06]]&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.13|13]]&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.20|20]]&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.27|27]]&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.04  &#039;&#039;&#039;April&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.03  &#039;&#039;&#039;March&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| 31&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;
2014.02  &#039;&#039;&#039;February&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;January&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2012]]&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2011]]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1198772</id>
		<title>Simulator User Group</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1198772"/>
		<updated>2016-01-06T19:55:16Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User Group Page&lt;br /&gt;
|purpose=&lt;br /&gt;
The Server User Group exists to provide an opportunity for discussion about server technology, annoying bugs, and feature ideas.&lt;br /&gt;
|date-time= &lt;br /&gt;
* Tuesdays 12:00-13:00 (general) http://slurl.com/secondlife/Denby/220/41/33, &lt;br /&gt;
Meetings are&lt;br /&gt;
|location= &#039;&#039;&#039;Denby/225/25/25&#039;&#039;&#039;&lt;br /&gt;
|agenda=&lt;br /&gt;
* LL developer news&lt;br /&gt;
* Review premature closure of {{jira|BUG-10924}}- it is a very simple function as llListFindList is already implemented, all that is required is to skip to the start index, and stop after the end index is reached. In essence only a single function implementation is required, as llListFindList would be equivalent to llSubListFindList(haystack, needle, 0, -1). With the woeful inefficiency of lists it&#039;s also a very important capability to have, if it can be strided at the same time (thus restricting which indices potential matches can start from) that would be even better.&lt;br /&gt;
* Open discussion&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
|team= &lt;br /&gt;
* [[User:Andrew Linden|Andrew Linden]] (honorary member for all time)&lt;br /&gt;
* [[User:Simon Linden|Simon Linden]]&lt;br /&gt;
* [[User:Kelly Linden|Kelly Linden]]&lt;br /&gt;
* [[User:Baker Linden|Baker Linden]]&lt;br /&gt;
* [[User:Oz Linden|Oz Linden]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Meeting cancelled for August 12, 2014&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014.12  &#039;&#039;&#039;December&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.30|30]]&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.11  &#039;&#039;&#039;Nov&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&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;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;October&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.09  &#039;&#039;&#039;September&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.30|30]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.08  &#039;&#039;&#039;August&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
|-&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.05|05]]&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.12|12]]&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.19|19]]&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.26|26]]&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
| 31&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;
&lt;br /&gt;
2014.07  &#039;&#039;&#039;July&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.06  &#039;&#039;&#039;June&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.03|03]]&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
|-&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.10|10]]&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.17|17]]&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
|-&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.24|24]]&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
|-&lt;br /&gt;
| 29&lt;br /&gt;
| 30&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;
2014.05  &#039;&#039;&#039;May&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
|-&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.06|06]]&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.13|13]]&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.20|20]]&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.27|27]]&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.04  &#039;&#039;&#039;April&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.03  &#039;&#039;&#039;March&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| 31&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;
2014.02  &#039;&#039;&#039;February&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;January&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2012]]&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2011]]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1198771</id>
		<title>Simulator User Group</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simulator_User_Group&amp;diff=1198771"/>
		<updated>2016-01-06T19:54:21Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User Group Page&lt;br /&gt;
|purpose=&lt;br /&gt;
The Server User Group exists to provide an opportunity for discussion about server technology, annoying bugs, and feature ideas.&lt;br /&gt;
|date-time= &lt;br /&gt;
* Tuesdays 12:00-13:00 (general) http://slurl.com/secondlife/Denby/220/41/33, &lt;br /&gt;
Meetings are&lt;br /&gt;
|location= &#039;&#039;&#039;Denby/225/25/25&#039;&#039;&#039;&lt;br /&gt;
|agenda=&lt;br /&gt;
* LL developer news&lt;br /&gt;
* Review premature closure of {{jira|BUG-10924}}- it is a very simple function as llListFindList is already implemented, all that is required is to skip to the start index, and stop after the end index is reached. In essence only a single function implementation is required, as llListFindList would be equivalent to llSubListFindList(haystack, needle, 0, -1). With the woeful inefficiency of lists it&#039;s also a very important capability to have, it can be strided at the same time (thus restricting which indices potential matches can start from) that would be even better.&lt;br /&gt;
* Open discussion&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
|team= &lt;br /&gt;
* [[User:Andrew Linden|Andrew Linden]] (honorary member for all time)&lt;br /&gt;
* [[User:Simon Linden|Simon Linden]]&lt;br /&gt;
* [[User:Kelly Linden|Kelly Linden]]&lt;br /&gt;
* [[User:Baker Linden|Baker Linden]]&lt;br /&gt;
* [[User:Oz Linden|Oz Linden]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Meeting cancelled for August 12, 2014&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2014.12  &#039;&#039;&#039;December&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.12.30|30]]&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.11  &#039;&#039;&#039;Nov&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&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;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;October&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.10.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.09  &#039;&#039;&#039;September&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.02|02]]&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
|-&lt;br /&gt;
| 07&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.09|09]]&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.16|16]]&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.23|23]]&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.09.30|30]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.08  &#039;&#039;&#039;August&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
|-&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.05|05]]&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.12|12]]&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.19|19]]&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.08.26|26]]&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
|-&lt;br /&gt;
| 31&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;
&lt;br /&gt;
2014.07  &#039;&#039;&#039;July&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.07.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.06  &#039;&#039;&#039;June&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.03|03]]&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
|-&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.10|10]]&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.17|17]]&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
|-&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.06.24|24]]&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
|-&lt;br /&gt;
| 29&lt;br /&gt;
| 30&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;
2014.05  &#039;&#039;&#039;May&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
|-&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.06|06]]&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.13|13]]&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.20|20]]&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.05.27|27]]&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.04  &#039;&#039;&#039;April&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.01|01]]&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
| 05&lt;br /&gt;
|-&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.08|08]]&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.15|15]]&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.22|22]]&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.04.29|29]]&lt;br /&gt;
| 30&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.03  &#039;&#039;&#039;March&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| 31&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;
2014.02  &#039;&#039;&#039;February&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
|-&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.04|04]]&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| 07&lt;br /&gt;
| 08&lt;br /&gt;
|-&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.03.11|11]]&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| 14&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.18|18]]&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| 21&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.02.25|25]]&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| 28&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2014.01  &#039;&#039;&#039;January&#039;&#039;&#039;&lt;br /&gt;
{|&lt;br /&gt;
| Sun&lt;br /&gt;
| Mon &lt;br /&gt;
| Tue &lt;br /&gt;
| Wed &lt;br /&gt;
| Thu &lt;br /&gt;
| Fri&lt;br /&gt;
| Sat&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 01&lt;br /&gt;
| 02&lt;br /&gt;
| 03&lt;br /&gt;
| 04&lt;br /&gt;
|-&lt;br /&gt;
| 05&lt;br /&gt;
| 06&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.07|07]]&lt;br /&gt;
| 08&lt;br /&gt;
| 09&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 13&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.14|14]]&lt;br /&gt;
| 15&lt;br /&gt;
| 16&lt;br /&gt;
| 17&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| 20&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.21|21]]&lt;br /&gt;
| 22&lt;br /&gt;
| 23&lt;br /&gt;
| 24&lt;br /&gt;
| 25&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 27&lt;br /&gt;
| [[Simulator_User_Group/Transcripts/2014.01.28|28]]&lt;br /&gt;
| 29&lt;br /&gt;
| 30&lt;br /&gt;
| 31&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2012]]&lt;br /&gt;
&lt;br /&gt;
[[Simulator_User_Group/Transcripts/2011]]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetText&amp;diff=1198603</id>
		<title>LlSetText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetText&amp;diff=1198603"/>
		<updated>2015-12-29T10:27:24Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{:PRIM_TEXT|set}}{{Issues/SVC-4539}}{{Issues/BUG-11077}}&lt;br /&gt;
|func_id=152&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llSetText&lt;br /&gt;
|sort=SetText&lt;br /&gt;
|p1_type=string|p1_name=text&lt;br /&gt;
|p2_type=vector|p2_name=color&lt;br /&gt;
|p3_type=float|p3_name=alpha&lt;br /&gt;
|func_desc=Displays {{LSLP|text}} that hovers over the prim with specific {{LSLP|color}} and translucency (specified with {{LSLP|alpha}}).&lt;br /&gt;
|return_text&lt;br /&gt;
|spec=&lt;br /&gt;
|caveats=&lt;br /&gt;
*If more than one [[llSetText]] is called (By reset,interaction or script state) within a prim the latest call will take priority over the previous.&lt;br /&gt;
*{{LSLP|text}} is limited to 254 [[bytes]] (compare [[Limits#Building]]), if the [[string]] is longer it will be truncated to 254 [[bytes]], even if that means the truncation will chop a character in half.&lt;br /&gt;
*An unbroken line of text of a great length may be broken automatically into two lines (one above the other).&lt;br /&gt;
*{{LSLP|text}} can be seen through walls and other object. Be considerate of neighbors in malls and apartment buildings.&lt;br /&gt;
**Visibility distance increases with prim size.&lt;br /&gt;
*Removing the script or deactivating it &#039;&#039;&#039;will not remove&#039;&#039;&#039; a prim&#039;s {{LSLP|text}} property. Floating {{LSLP|text}} is not dependent on a script for its continued existence but only when wanting to change it.&lt;br /&gt;
*To remove a prim&#039;s {{LSLP|text}}, use the following:&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Preferred method to remove a prim&#039;s floating {{LSLP|text}}&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Second method does the same effect-wise.&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!!}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//  empty string &amp;amp; black &amp;amp; transparent&lt;br /&gt;
    llSetText(&amp;quot;&amp;quot;, ZERO_VECTOR, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{!!}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//  empty string &amp;amp; black &amp;amp; transparent&lt;br /&gt;
    llSetText(&amp;quot;&amp;quot;, &amp;lt;0.0, 0.0, 0.0&amp;gt;, 0.0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
*Vertical whitespace is removed from the end of the {{LSLP|text}} string, so if you want vertical whitespace put any character (like a space) on the last line.&lt;br /&gt;
*Multiple linebreaks with empty lines are converted to a single linebreak, so add a whitespace character on every line you want to skip:&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Good&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Bad&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!!}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
    vector COLOR_WHITE = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
    float  OPAQUE      = 1.0;&lt;br /&gt;
&lt;br /&gt;
    llSetText(&amp;quot;Monkeys\n \n \n \n \n &amp;quot;, COLOR_WHITE, OPAQUE);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{!!}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
    vector COLOR_WHITE = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
    float  OPAQUE      = 1.0;&lt;br /&gt;
&lt;br /&gt;
    llSetText(&amp;quot;Monkeys\n\n\n\n\n&amp;quot;, COLOR_WHITE, OPAQUE);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
*&#039;&#039;&#039;Measurements showed a high impact of process time when doing numerous iterations in a while loop&#039;&#039;&#039;. For approx. 65 thousand iterations the process times are ca. 5 seconds without floating text, 24 seconds with [[llSetText]] and 96 seconds when using [[llSetPrimitiveParams#llSetLinkPrimitiveParamsFast]] in combination with [[PRIM_TEXT]]. Thats why you are &#039;&#039;&#039;not advised&#039;&#039;&#039; to make excessive use of changing a prim&#039;s {{LSLP|text}} within such iterations.&lt;br /&gt;
|examples=&lt;br /&gt;
Example of how [[llSetText]] could be used to show prim&#039;s name in green {{LSLP|text}}:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector COLOR_GREEN = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
        float  OPAQUE      = 1.0;&lt;br /&gt;
&lt;br /&gt;
//      prim&#039;s name (not necessarily object&#039;s)&lt;br /&gt;
        llSetText(llGetObjectName(), COLOR_GREEN, OPAQUE );&lt;br /&gt;
&lt;br /&gt;
//      delete the script as we only needed it to change the floating text property&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
By default the floating {{LSLP|text}} will appear on a single line. However, it can be spread over multiple lines by using a line break &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt; (read [[SplitLine]] in section &#039;See Also&#039;).&lt;br /&gt;
&lt;br /&gt;
===String escape codes:===&lt;br /&gt;
&lt;br /&gt;
LSL has four [[String#Escape Codes|string escape codes]]:&lt;br /&gt;
* &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; for a new line&lt;br /&gt;
* &amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt; for a backslash&lt;br /&gt;
* &amp;lt;code&amp;gt;\t&amp;lt;/code&amp;gt; for a tab&lt;br /&gt;
* &amp;lt;code&amp;gt;\&amp;quot;&amp;lt;/code&amp;gt; for a double-quote&lt;br /&gt;
&lt;br /&gt;
===Color &amp;amp; Alpha===&lt;br /&gt;
&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! Color&lt;br /&gt;
! Code&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #001f3f&amp;quot; {{!}}NAVY&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.122, 0.247&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #0074d9&amp;quot; {{!}}BLUE&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.455, 0.851&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #7fdbff&amp;quot; {{!}}AQUA&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.498, 0.859, 1.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #39cccc&amp;quot; {{!}}TEAL&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.224, 0.800, 0.800&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #3d9970&amp;quot; {{!}}OLIVE&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.239, 0.600, 0.439&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #2ecc40&amp;quot; {{!}}GREEN&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.180, 0.800, 0.251&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #01ff70&amp;quot; {{!}}LIME&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.004, 1.000, 0.439&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ffdc00&amp;quot; {{!}}YELLOW&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.863, 0.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ff851b&amp;quot; {{!}}ORANGE&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.522, 0.106&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ff4136&amp;quot; {{!}}RED&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.255, 0.212&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #85144b&amp;quot; {{!}}MAROON&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.522, 0.078, 0.294&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #f012be&amp;quot; {{!}}FUCHSIA&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.941, 0.071, 0.745&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #b10dc9&amp;quot; {{!}}PURPLE&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.694, 0.051, 0.788&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ffffff&amp;quot; {{!}}WHITE&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 1.000, 1.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #dddddd&amp;quot; {{!}}SILVER&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.867, 0.867, 0.867&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #aaaaaa&amp;quot; {{!}}GRAY&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.667, 0.667, 0.667&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #111111&amp;quot; {{!}}BLACK&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.000, 0.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
The x, y &amp;amp; z [[Vector#Components|components of the vector]] are used to represent red, green, and blue respectively. The range is &amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;different from traditional RGB&amp;lt;/span&amp;gt;, instead of being 0 -&amp;gt; 255, LSL uses 0 -&amp;gt; 1. &amp;lt;code&amp;gt;&amp;lt;1.0, 1.0, 1.0&amp;gt;&amp;lt;/code&amp;gt; represents &amp;quot;white&amp;quot; and &amp;lt;code&amp;gt;&amp;lt;0.0, 0.0, 0.0&amp;gt;&amp;lt;/code&amp;gt; represents &amp;quot;black&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//  white &amp;amp; opaque&lt;br /&gt;
    llSetText(&amp;quot;I am white&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
    vector myColor;// defaults to ZERO_VECTOR or &amp;lt;0.0, 0.0, 0.0&amp;gt; which is black&lt;br /&gt;
&lt;br /&gt;
    llSetText(&amp;quot;I am black and 30% transparent.&amp;quot;, myColor, 0.7);&lt;br /&gt;
&lt;br /&gt;
    llSleep(7.5);   // before: &amp;lt;0.0, 0.0, 0.0&amp;gt; black&lt;br /&gt;
    myColor.x = 1.0;// now:    &amp;lt;1.0, 0.0, 0.0&amp;gt; red&lt;br /&gt;
&lt;br /&gt;
    llSetText(&amp;quot;I am now red and 10% transparent.&amp;quot;, myColor, 0.9);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If {{LSLP|alpha}} is 1.0 it means the {{LSLP|text}} is fully opaque (alpha), 0.0 would make it completely transparent (invisible):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
    llSetText(&amp;quot;green text with alpha 0.7&amp;quot;, &amp;lt;0.0, 1.0, 0.0&amp;gt;, 0.7);&lt;br /&gt;
&lt;br /&gt;
    llSetText(&amp;quot;white text with alpha 0.4\n60% transparent&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 0.4);&lt;br /&gt;
    llSetText(&amp;quot;white text with alpha 1.0\nfully opaque&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
&lt;br /&gt;
//  next to lines have the same effect&lt;br /&gt;
    llSetText(&amp;quot;invisible black text with alpha 0.0\nfully transparent&amp;quot;, ZERO_VECTOR, 0);&lt;br /&gt;
    llSetText(&amp;quot;invisible black text with alpha 0.0\nfully transparent&amp;quot;, &amp;lt;0.0, 0.0, 0.0&amp;gt;, 0.0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Multiple lines===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//  two lines of orange text&lt;br /&gt;
&lt;br /&gt;
    llSetText(&amp;quot;I am\non two lines!&amp;quot;, &amp;lt;1.0, 0.4, 0.0&amp;gt;, 1.0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
Drag this script out of inventory onto an object to erase its set text:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// http://wiki.secondlife.com/wiki/llSetText&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
//      remove floating text (empty string &amp;amp; black &amp;amp; 100% transparent)&lt;br /&gt;
        llSetText(&amp;quot;&amp;quot;, ZERO_VECTOR, 0.0);&lt;br /&gt;
&lt;br /&gt;
//      delete the script as we only needed it to change the floating text property&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Code to easily specify appearance of hovertext:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
vector NAVY    = &amp;lt;0,     0.122, 0.247&amp;gt;;&lt;br /&gt;
vector BLUE    = &amp;lt;0,     0.455, 0.851&amp;gt;;&lt;br /&gt;
vector AQUA    = &amp;lt;0.498, 0.859, 1    &amp;gt;;&lt;br /&gt;
vector TEAL    = &amp;lt;0.224, 0.8,   0.8  &amp;gt;;&lt;br /&gt;
vector OLIVE   = &amp;lt;0.239, 0.6,   0.439&amp;gt;;&lt;br /&gt;
vector GREEN   = &amp;lt;0.18,  0.8,   0.251&amp;gt;;&lt;br /&gt;
vector LIME    = &amp;lt;0.004, 1    , 0.439&amp;gt;;&lt;br /&gt;
vector YELLOW  = &amp;lt;1    , 0.863, 0    &amp;gt;;&lt;br /&gt;
vector ORANGE  = &amp;lt;1    , 0.522, 0.106&amp;gt;;&lt;br /&gt;
vector RED     = &amp;lt;1    , 0.255, 0.212&amp;gt;;&lt;br /&gt;
vector MAROON  = &amp;lt;0.522, 0.078, 0.294&amp;gt;;&lt;br /&gt;
vector FUCHSIA = &amp;lt;0.941, 0.071, 0.745&amp;gt;;&lt;br /&gt;
vector PURPLE  = &amp;lt;0.694, 0.051, 0.788&amp;gt;;&lt;br /&gt;
vector WHITE   = &amp;lt;1    , 1    , 1    &amp;gt;;&lt;br /&gt;
vector SILVER  = &amp;lt;0.867, 0.867, 0.867&amp;gt;;&lt;br /&gt;
vector GRAY    = &amp;lt;0.667, 0.667, 0.667&amp;gt;;&lt;br /&gt;
vector BLACK   = &amp;lt;0.000, 0.000, 0.000&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
string  hoverText   = &amp;quot;TEXT GOES HERE&amp;quot;;&lt;br /&gt;
vector  hoverColor  = LIME;//  set predefined color or any RGB color vector in float form&lt;br /&gt;
float   hoverAlpha  = 1.0; // Sets the text&#039;s transparency, 1.0 being opaque, while 0.0 would be transparent&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText(hoverText, hoverColor, hoverAlpha);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To make hovertext when using linked prims you can use this simple function:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
mySetLinkText(integer linknum, string text, vector color, float alpha) {&lt;br /&gt;
    llSetLinkPrimitiveParamsFast(linknum, [PRIM_TEXT, text, color, alpha]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// For example:&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        mySetLinkText(LINK_SET, &amp;quot;TEST&amp;quot;, &amp;lt;0, 1, 0&amp;gt;, 0.5);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|also&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_constants=&lt;br /&gt;
{{LSL DefineRow||[[PRIM_TEXT]]}}&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[:Category:LSL Examples|Examples]]: [[SplitLine]]|Insert &#039;new line&#039; escape codes at certain positions of a string}}&lt;br /&gt;
{{LSL DefineRow||Useful snippet: [[llGetObjectPermMask]]|Label an object with text and newlines to give away or sell}}&lt;br /&gt;
|notes=To actually display text on a prim, see [[XyzzyText]], or consider using parcel prim [[:Category:LSL_Media|Media]] options (useful only if you have control over the land&#039;s media settings.)&lt;br /&gt;
----&lt;br /&gt;
The function displays {{LSLP|text}} that hover over the prim&#039;s center, the prim position. The height over the center is proportional to the prim&#039;s Z-dimension exclusively&lt;br /&gt;
* It doesn&#039;t matter how the prim is rotated, so if Z is smaller than X and Y the {{LSLP|text}} may be seen {{LSLP|on}} the prim&lt;br /&gt;
|cat1=Effects&lt;br /&gt;
|cat2=Prim&lt;br /&gt;
|cat3=Stop&lt;br /&gt;
|cat4=Floating Text&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-11077&amp;diff=1198602</id>
		<title>Template:Issues/BUG-11077</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Issues/BUG-11077&amp;diff=1198602"/>
		<updated>2015-12-29T10:27:10Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;{{Issues|BUG-11077|Set Floating Text Colour and Alpha Only|type=nf}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues|BUG-11077|Set Floating Text Colour and Alpha Only|type=nf}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198540</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198540"/>
		<updated>2015-12-21T15:45:55Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages (though for random messages this doesn&#039;t necessarily mean noticeably more duplicates).&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer State ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not call mprui_init() after exactly N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for most purposes this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
integer avatar_stride = 2; // Key + mprui state&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = ((llGetListLength(avatars) / avatar_stride) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * avatar_stride) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List State ==&lt;br /&gt;
For greater precision a list-based state must be used, which naturally carries with it the overhead of list manipulation. This comes in two varieties, a 16-bit precision which uses a list that is three elements long, and a full (32-bit) precision variation that uses a five element list. In both cases the next value is stored in the first element of the list, as such the implementations can actually be used interchangeably.&lt;br /&gt;
&lt;br /&gt;
=== Full Precision ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 1, start, stride, limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 3);&lt;br /&gt;
    integer limit   = llList2Integer(mprui_state, 4);&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
&lt;br /&gt;
        return llListReplaceList(mprui_state, [next, (counter + 1) % limit, start], 0, 2);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, (counter + 1) % limit], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 16-bit Precision ===&lt;br /&gt;
The following list-state implementation restricts precision to 16-bits (max limit of 65536) but uses a smaller list for its state (3 elements vs 5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 0x10000 | start, (stride &amp;lt;&amp;lt; 16) | limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = counter &amp;amp; 0xFFFF; counter = (counter &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer limit   = stride &amp;amp; 0xFFFF; stride = (stride &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, ((counter + 1) % limit) &amp;lt;&amp;lt; 16 | start], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
Once again we grant the gift of the alphabet upon avatars, this time using either of the above list-state implementations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the mprui functions from either of the list-state options here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
integer avatar_stride;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Get the stride width for avatar entries&lt;br /&gt;
        avatar_stride = llGetListLength(mprui_init(llStringLength(myString))) + 1;&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); list mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2List(avatars, index + 1, index + (avatar_stride - 1)));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 5);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = ((llGetListLength(avatars) / avatar_stride) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * avatar_stride) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = llList2Integer(mprui_state, 0);&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id] + mprui_state;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198539</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198539"/>
		<updated>2015-12-21T15:45:33Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages (though for random messages this doesn&#039;t necessarily mean noticeably more duplicates).&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer State ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not call mprui_init() after exactly N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for most purposes this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
integer avatar_stride = 2; // Key + mprui state&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = ((llGetListLength(avatars) / avatar_stride) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * avatar_stride) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List State ==&lt;br /&gt;
For greater precision a list-based state must be used, which naturally carries with it the overhead of list manipulation. This comes in two varieties, a 16-bit precision which uses a list that is three elements long, and a full (32-bit) precision variation that uses a five element list. In both cases the next value is stored in the first element of the list, as such the implementations can actually be used interchangeably.&lt;br /&gt;
&lt;br /&gt;
=== Full Precision ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 1, start, stride, limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 3);&lt;br /&gt;
    integer limit   = llList2Integer(mprui_state, 4);&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
&lt;br /&gt;
        return llListReplaceList(mprui_state, [next, (counter + 1) % limit, start], 0, 2);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, (counter + 1) % limit], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 16-bit Precision ===&lt;br /&gt;
The following list-state implementation restricts precision to 16-bits (max limit of 65536) but uses a smaller list for its state (3 elements vs 5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 0x10000 | start, (stride &amp;lt;&amp;lt; 16) | limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = counter &amp;amp; 0xFFFF; counter = (counter &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer limit   = stride &amp;amp; 0xFFFF; stride = (stride &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, ((counter + 1) % limit) &amp;lt;&amp;lt; 16 | start], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
Once again we grant the gift of the alphabet upon avatars, this time using either of the above list-state implementations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the mprui functions from either of the list-state options here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
integer avatar_stride;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Get the stride width for avatar entries&lt;br /&gt;
        avatar_stride = llGetListLength(mprui_init(llStringLength(myString))) + 1;&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); list mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2List(avatars, index + 1, index + (avatar_stride - 1)));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 5);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * avatar_stride) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = llList2Integer(mprui_state, 0);&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id] + mprui_state;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198538</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198538"/>
		<updated>2015-12-21T15:44:30Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages (though for random messages this doesn&#039;t necessarily mean noticeably more duplicates).&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer State ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not call mprui_init() after exactly N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for most purposes this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 2) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List State ==&lt;br /&gt;
For greater precision a list-based state must be used, which naturally carries with it the overhead of list manipulation. This comes in two varieties, a 16-bit precision which uses a list that is three elements long, and a full (32-bit) precision variation that uses a five element list. In both cases the next value is stored in the first element of the list, as such the implementations can actually be used interchangeably.&lt;br /&gt;
&lt;br /&gt;
=== Full Precision ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 1, start, stride, limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 3);&lt;br /&gt;
    integer limit   = llList2Integer(mprui_state, 4);&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
&lt;br /&gt;
        return llListReplaceList(mprui_state, [next, (counter + 1) % limit, start], 0, 2);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, (counter + 1) % limit], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 16-bit Precision ===&lt;br /&gt;
The following list-state implementation restricts precision to 16-bits (max limit of 65536) but uses a smaller list for its state (3 elements vs 5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 0x10000 | start, (stride &amp;lt;&amp;lt; 16) | limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = counter &amp;amp; 0xFFFF; counter = (counter &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer limit   = stride &amp;amp; 0xFFFF; stride = (stride &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, ((counter + 1) % limit) &amp;lt;&amp;lt; 16 | start], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
Once again we grant the gift of the alphabet upon avatars, this time using either of the above list-state implementations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the mprui functions from either of the list-state options here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
integer avatar_stride;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        // Get the stride width for avatar entries&lt;br /&gt;
        avatar_stride = llGetListLength(mprui_init(llStringLength(myString))) + 1;&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); list mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2List(avatars, index + 1, index + (avatar_stride - 1)));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 5);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * avatar_stride) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = llList2Integer(mprui_state, 0);&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id] + mprui_state;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198339</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198339"/>
		<updated>2015-12-17T12:57:04Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages (though for random messages this doesn&#039;t necessarily mean noticeably more duplicates).&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer State ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not call mprui_init() after exactly N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for most purposes this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 2) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List State ==&lt;br /&gt;
For greater precision a list-based state must be used, which naturally carries with it the overhead of list manipulation. This comes in two varieties, a 16-bit precision which uses a list that is three elements long, and a full (32-bit) precision variation that uses a five element list. In both cases the next value is stored in the first element of the list, as such the implementations can actually be used interchangeably.&lt;br /&gt;
&lt;br /&gt;
=== Full Precision ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 1, start, stride, limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 3);&lt;br /&gt;
    integer limit   = llList2Integer(mprui_state, 4);&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
&lt;br /&gt;
        return llListReplaceList(mprui_state, [next, (counter + 1) % limit, start], 0, 2);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, (counter + 1) % limit], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 16-bit Precision ===&lt;br /&gt;
The following list-state implementation restricts precision to 16-bits (max limit of 65536) but uses a smaller list for its state (3 elements vs 5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 0x10000 | start, (stride &amp;lt;&amp;lt; 16) | limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = counter &amp;amp; 0xFFFF; counter = (counter &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer limit   = stride &amp;amp; 0xFFFF; stride = (stride &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, ((counter + 1) % limit) &amp;lt;&amp;lt; 16 | start], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
Once again we grant the gift of the alphabet upon avatars, this time using either of the above list-state implementations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the mprui functions from either of the list-state options here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); list mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2List(avatars, index + 1, index + 5));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 5);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 6) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = llList2Integer(mprui_state, 0);&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id] + mprui_state;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198338</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198338"/>
		<updated>2015-12-17T12:56:07Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Single Integer State */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages (though for random messages this doesn&#039;t necessarily mean noticeably more duplicates).&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer State ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not call mprui_init() after exactly N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for most purposes this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 2) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List State ==&lt;br /&gt;
For greater precision a list-based state must be used, which naturally carries with it the overhead of list manipulation. This comes in two varieties, a 16-bit precision which uses a list that is three elements long, and a full (32-bit) precision variation that uses a five element list. In both cases the next value is stored in the first element of the list, as such the implementations can actually be used interchangeably.&lt;br /&gt;
&lt;br /&gt;
=== Full Precision ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 1, start, stride, limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 3);&lt;br /&gt;
    integer limit   = llList2Integer(mprui_state, 4);&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
&lt;br /&gt;
        return llListReplaceList(mprui_state, [next, (counter + 1) % limit, start], 0, 2);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, (counter + 1) % limit], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 16-bit Precision ===&lt;br /&gt;
The following list-state implementation restricts precision to 16-bits (max limit of 65536) but uses a smaller list for its state (3 elements vs 5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 0x10000 | start, (stride &amp;lt;&amp;lt; 16) | limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = counter &amp;amp; 0xFFFF; counter = (counter &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer limit   = stride &amp;amp; 0xFFFF; stride = (stride &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, ((counter + 1) % limit) &amp;lt;&amp;lt; 16 | start], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
Once again we grant the gift of the alphabet upon avatars, this time using either of the above list-state implementations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the mprui functions from either of the list-state options here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); list mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2List(avatars, index + 1, index + 5));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 5);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 6) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = llList2Integer(mprui_state, 0);&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id] + mprui_state;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198337</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198337"/>
		<updated>2015-12-17T12:55:46Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Single Integer State */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages (though for random messages this doesn&#039;t necessarily mean noticeably more duplicates).&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer State ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not call mprui_init() after exactly N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for the purposes of randomised behaviour this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 2) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List State ==&lt;br /&gt;
For greater precision a list-based state must be used, which naturally carries with it the overhead of list manipulation. This comes in two varieties, a 16-bit precision which uses a list that is three elements long, and a full (32-bit) precision variation that uses a five element list. In both cases the next value is stored in the first element of the list, as such the implementations can actually be used interchangeably.&lt;br /&gt;
&lt;br /&gt;
=== Full Precision ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 1, start, stride, limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 3);&lt;br /&gt;
    integer limit   = llList2Integer(mprui_state, 4);&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
&lt;br /&gt;
        return llListReplaceList(mprui_state, [next, (counter + 1) % limit, start], 0, 2);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, (counter + 1) % limit], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 16-bit Precision ===&lt;br /&gt;
The following list-state implementation restricts precision to 16-bits (max limit of 65536) but uses a smaller list for its state (3 elements vs 5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 0x10000 | start, (stride &amp;lt;&amp;lt; 16) | limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = counter &amp;amp; 0xFFFF; counter = (counter &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer limit   = stride &amp;amp; 0xFFFF; stride = (stride &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, ((counter + 1) % limit) &amp;lt;&amp;lt; 16 | start], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
Once again we grant the gift of the alphabet upon avatars, this time using either of the above list-state implementations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the mprui functions from either of the list-state options here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); list mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2List(avatars, index + 1, index + 5));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 5);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 6) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = llList2Integer(mprui_state, 0);&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id] + mprui_state;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198336</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198336"/>
		<updated>2015-12-17T12:54:48Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Multiple Number Generators */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages (though for random messages this doesn&#039;t necessarily mean noticeably more duplicates).&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer State ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not use a separate counter to call mprui_init() every N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for the purposes of randomised behaviour this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 2) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List State ==&lt;br /&gt;
For greater precision a list-based state must be used, which naturally carries with it the overhead of list manipulation. This comes in two varieties, a 16-bit precision which uses a list that is three elements long, and a full (32-bit) precision variation that uses a five element list. In both cases the next value is stored in the first element of the list, as such the implementations can actually be used interchangeably.&lt;br /&gt;
&lt;br /&gt;
=== Full Precision ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 1, start, stride, limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 3);&lt;br /&gt;
    integer limit   = llList2Integer(mprui_state, 4);&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
&lt;br /&gt;
        return llListReplaceList(mprui_state, [next, (counter + 1) % limit, start], 0, 2);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, (counter + 1) % limit], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 16-bit Precision ===&lt;br /&gt;
The following list-state implementation restricts precision to 16-bits (max limit of 65536) but uses a smaller list for its state (3 elements vs 5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 0x10000 | start, (stride &amp;lt;&amp;lt; 16) | limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = counter &amp;amp; 0xFFFF; counter = (counter &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer limit   = stride &amp;amp; 0xFFFF; stride = (stride &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, ((counter + 1) % limit) &amp;lt;&amp;lt; 16 | start], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
Once again we grant the gift of the alphabet upon avatars, this time using either of the above list-state implementations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the mprui functions from either of the list-state options here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); list mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2List(avatars, index + 1, index + 5));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 5);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 6) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = llList2Integer(mprui_state, 0);&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id] + mprui_state;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198335</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198335"/>
		<updated>2015-12-17T12:53:15Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Single Integer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages.&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer State ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not use a separate counter to call mprui_init() every N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for the purposes of randomised behaviour this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 2) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List State ==&lt;br /&gt;
For greater precision a list-based state must be used, which naturally carries with it the overhead of list manipulation. This comes in two varieties, a 16-bit precision which uses a list that is three elements long, and a full (32-bit) precision variation that uses a five element list. In both cases the next value is stored in the first element of the list, as such the implementations can actually be used interchangeably.&lt;br /&gt;
&lt;br /&gt;
=== Full Precision ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 1, start, stride, limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 3);&lt;br /&gt;
    integer limit   = llList2Integer(mprui_state, 4);&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
&lt;br /&gt;
        return llListReplaceList(mprui_state, [next, (counter + 1) % limit, start], 0, 2);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, (counter + 1) % limit], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 16-bit Precision ===&lt;br /&gt;
The following list-state implementation restricts precision to 16-bits (max limit of 65536) but uses a smaller list for its state (3 elements vs 5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
list mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)limit);&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
 &lt;br /&gt;
    return [start, 0x10000 | start, (stride &amp;lt;&amp;lt; 16) | limit];&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Retrieve the first element to get the next index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = llList2Integer(mprui_state, 0);&lt;br /&gt;
list mprui_next(list mprui_state) {&lt;br /&gt;
    integer next    = llList2Integer(mprui_state, 0);&lt;br /&gt;
    integer counter = llList2Integer(mprui_state, 1);&lt;br /&gt;
    integer start   = counter &amp;amp; 0xFFFF; counter = (counter &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
    integer stride  = llList2Integer(mprui_state, 2);&lt;br /&gt;
    integer limit   = stride &amp;amp; 0xFFFF; stride = (stride &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF;&lt;br /&gt;
&lt;br /&gt;
    if (!counter) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) {&lt;br /&gt;
        start = (start + 1) % limit;&lt;br /&gt;
        next = start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return llListReplaceList(mprui_state, [next, ((counter + 1) % limit) &amp;lt;&amp;lt; 16 | start], 0, 1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
Once again we grant the gift of the alphabet upon avatars, this time using either of the above list-state implementations:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the mprui functions from either of the list-state options here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8; // Maximum number of avatars to keep track of (list is pruned from longest ago touch)&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); list mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2List(avatars, index + 1, index + 5));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 5);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 6) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = llList2Integer(mprui_state, 0);&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id] + mprui_state;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198334</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198334"/>
		<updated>2015-12-17T12:29:54Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages.&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not use a separate counter to call mprui_init() every N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for the purposes of randomised behaviour this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)(limit + 1));&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 2) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
llOwnerSay(&amp;quot;avatars = [&amp;quot; + llList2CSV(avatars) + &amp;quot;]&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198333</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198333"/>
		<updated>2015-12-17T12:29:41Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Single Integer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages.&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not use a separate counter to call mprui_init() every N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for the purposes of randomised behaviour this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)(limit + 1));&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return ((limit - 1) &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer mprui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = ((mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) + 1;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // We&#039;re about to repeat&lt;br /&gt;
        // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
        // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
        if (next &amp;gt;= (limit - 1)) return mprui_init(limit);&lt;br /&gt;
        &lt;br /&gt;
        // Move the start and insert into new state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (next &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
The following example takes the same string-based alphabet spewing device and adapts it to support multiple avatars, which will each get their own unique range of random letters no matter how many are also using the device.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Insert the single-integer mprui functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
list avatars = []; integer avatar_limit = 8;&lt;br /&gt;
 &lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0); }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        key id = llDetectedKey(0); integer mprui_state;&lt;br /&gt;
&lt;br /&gt;
        integer index = llListFindList(avatars, [id]);&lt;br /&gt;
        if (~index) {&lt;br /&gt;
            mprui_state = mprui_next(llList2Integer(avatars, index + 1));&lt;br /&gt;
&lt;br /&gt;
            // Remove our old state&lt;br /&gt;
            avatars = llDeleteSubList(avatars, index, index + 1);&lt;br /&gt;
        } else {&lt;br /&gt;
            mprui_state = mprui_init(llStringLength(myString));&lt;br /&gt;
&lt;br /&gt;
            // Make room if the list is full&lt;br /&gt;
            integer prune = (llGetListLength(avatars) + 1) - avatar_limit;&lt;br /&gt;
            if (prune &amp;gt; 0) avatars = llDeleteSubList(avatars, 0, (prune * 2) - 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
        llRegionSayTo(id, PUBLIC_CHANNEL, llGetSubString(myString, next, next));&lt;br /&gt;
&lt;br /&gt;
        // Add the new state to the end of the list&lt;br /&gt;
        avatars += [id, mprui_state];&lt;br /&gt;
llOwnerSay(&amp;quot;avatars = [&amp;quot; + llList2CSV(avatars) + &amp;quot;]&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198332</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198332"/>
		<updated>2015-12-17T12:05:17Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    _prui_counter = (_prui_counter + 1) % _prui_limit;&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple Number Generators =&lt;br /&gt;
The above code is fine for uses where only a single number generator is required, for example when communicating with a single avatar. However, when working with multiple random tasks it is not possible for a single number generator to produce values for different limits without completing the tasks sequentially (or aborting one), and in cases where the limit is the same, sharing a single number generator between multiple tasks will cause it to produce duplicates faster. For example, if a script is sending one of 100 possible messages randomly to four different avatars, then it will only have an effective entropy of around 25 messages.&lt;br /&gt;
&lt;br /&gt;
For such cases, the following alternative functions enable the use of multiple number generators by producing and updating a state, by giving each task/avatar their own state value, it is possible to generate the full range of indices for each task/avatar.&lt;br /&gt;
&lt;br /&gt;
== Single Integer ==&lt;br /&gt;
The fastest and most memory efficient implementation uses four 8-bit values packed into a single 32-bit integer for its state, however this produces the following caveats:&lt;br /&gt;
* This implementation can only handle limits of up to 256.&lt;br /&gt;
* This implementation does not use a separate counter to call mprui_init() every N iterations, which means that it cannot guarantee a full N iterations without duplicates, however for the purposes of randomised behaviour this should still be adequate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive, max 256) and initialises&lt;br /&gt;
// Returns an mprui state that can then be passed into mprui_next()&lt;br /&gt;
integer mprui_init(integer limit) {&lt;br /&gt;
    integer start = (integer)llFrand((float)(limit + 1));&lt;br /&gt;
    integer stride = (integer)llFrand((float)limit) + 1;&lt;br /&gt;
    &lt;br /&gt;
    return (limit &amp;lt;&amp;lt; 24) | (start &amp;lt;&amp;lt; 16) | (stride &amp;lt;&amp;lt; 8) | start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of *around* N calls to this function will return each possible index only once.&lt;br /&gt;
// This function should be passed an mprui_state generated using mprui_init, and will return an updated state in response. Mask with 0xFF to get the index like so:&lt;br /&gt;
// mprui_state = prui_next(mprui_state);&lt;br /&gt;
// integer next_index = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
integer prui_next(integer mprui_state) {&lt;br /&gt;
    integer limit = (mprui_state &amp;gt;&amp;gt; 24) &amp;amp; 0xFF;&lt;br /&gt;
    integer start = (mprui_state &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    // This is a hack that can result in fewer or greater than limit &lt;br /&gt;
    // repetitions, but is fine in the spirit of &amp;quot;good enough&amp;quot;&lt;br /&gt;
    if (start == limit) return mprui_init(limit);&lt;br /&gt;
 &lt;br /&gt;
    integer stride = (mprui_state &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
    integer next = mprui_state &amp;amp; 0xFF;&lt;br /&gt;
&lt;br /&gt;
    next = (next + stride) % limit;&lt;br /&gt;
    if (next == start) { // Move the start and inset into state&lt;br /&gt;
        next = (start + 1) % limit;&lt;br /&gt;
        mprui_state = (mprui_state &amp;amp; 0xFF00FFFF) | (start &amp;lt;&amp;lt; 16);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Insert next value into state&lt;br /&gt;
    return (mprui_state &amp;amp; 0xFFFFFF00) | next;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198331</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198331"/>
		<updated>2015-12-17T11:32:23Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Pseudo-randomly Generate Unique Indices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
// Configures the random number generator to generate values between 0 (inclusive) and limit (exclusive) and initialises&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Call this each time the next random value is required.&lt;br /&gt;
// When configured with a limit of N, every discreet batch of N calls to this function will return each possible index only once.&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Offset_Compression&amp;diff=1198325</id>
		<title>Offset Compression</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Offset_Compression&amp;diff=1198325"/>
		<updated>2015-12-17T00:09:35Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Offset Compression =&lt;br /&gt;
In scripts that involve object manipulation and/or offsets for animations it is common to end up storing a vector and rotation for every such interaction, which can be memory intensive if the object has a lot of values to store. However, such offsets typically don&#039;t need to be very precise as linked objects won&#039;t move far from their root prim, and small errors in the rotation shouldn&#039;t result in any major issues, so long as those rotations aren&#039;t used as a reference for future actions.&lt;br /&gt;
&lt;br /&gt;
With this in mind, I&#039;ve produced some functions that allow both a positional and rotational offset to be stored as a single vector value, effectively cutting memory requirements by more than half (especially when considering list overhead), though this comes at the cost of declaring the functions instead, so if only require these in a few places you may wish to consider inlining them instead.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
For simplicity, these functions handle rotations as Euler vectors, which can be converted using [[llRot2Euler]]() and [[llEuler2Rot]](), this is also a convenient format for devices where rotation offsets may be specified in the user-friendly format in degrees (to match the build tools), such as in parsed notecards. These should still be converted to rotations for transformations in order to avoid [http://en.wikipedia.org/wiki/Gimbal_Lock Gimbal Lock]. &#039;&#039;&#039;NOTE:&#039;&#039;&#039; the combinedOffset() function below expects euler rotations to contain no component that exceeds positive or negative PI (just as the build tools do not allow this); for convenience the clampEulerRot() function is provided below to ensure that an Euler rotation is safe to use, but if your script is not vulnerable to this (for example, if your Euler rotations are created with llRot2Euler) then this function may be omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Ensures that an euler rot is within the required range (no values exceed plus or minus PI)&lt;br /&gt;
vector clampEulerRot(vector eulerRot) {&lt;br /&gt;
    @loopX1; @loopX2;&lt;br /&gt;
    if (eulerRot.x &amp;gt; PI) { eulerRot.x -= TWO_PI; jump loopX1; }&lt;br /&gt;
    else if (eulerRot.x &amp;lt; -PI) { eulerRot.x += TWO_PI; jump loopX2; }&lt;br /&gt;
    @loopY1; @loopY2;&lt;br /&gt;
    if (eulerRot.y &amp;gt; PI) { eulerRot.y -= TWO_PI; jump loopY1; }&lt;br /&gt;
    else if (eulerRot.y &amp;lt; -PI) { eulerRot.y += TWO_PI; jump loopY2; }&lt;br /&gt;
    @loopZ1; @loopZ2;&lt;br /&gt;
    if (eulerRot.z &amp;gt; PI) { eulerRot.z -= TWO_PI; jump loopZ1; }&lt;br /&gt;
    else if (eulerRot.z &amp;lt; -PI) { eulerRot.z += TWO_PI; jump loopZ2; }&lt;br /&gt;
    return eulerRot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Creates a combined vector from a position and Euler rotation. The rotation *must* be within the required range (no values exceed plus or minus PI) or it will not be possible to restore the values correctly&lt;br /&gt;
vector combinedOffset(vector offsetPos, vector offsetEulerRot) {&lt;br /&gt;
    return &amp;lt;&lt;br /&gt;
        (float)((integer)(offsetPos.x * 1000.0) * 10) + ((float)(((offsetPos.x &amp;lt; 0) * -2) + 1) * (offsetEulerRot.x + 5.0)), &lt;br /&gt;
        (float)((integer)(offsetPos.y * 1000.0) * 10) + ((float)(((offsetPos.y &amp;lt; 0) * -2) + 1) * (offsetEulerRot.y + 5.0)), &lt;br /&gt;
        (float)((integer)(offsetPos.z * 1000.0) * 10) + ((float)(((offsetPos.z &amp;lt; 0) * -2) + 1) * (offsetEulerRot.z + 5.0))&lt;br /&gt;
    &amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Retrieve the positional part from the combined offset&lt;br /&gt;
vector offsetToPos(vector offset) {&lt;br /&gt;
    return &amp;lt;&lt;br /&gt;
        (float)((integer)(offset.x / 10.0)) / 1000.0, &lt;br /&gt;
        (float)((integer)(offset.y / 10.0)) / 1000.0, &lt;br /&gt;
        (float)((integer)(offset.z / 10.0)) / 1000.0&lt;br /&gt;
    &amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Retrieve the rotation part from the combined offset&lt;br /&gt;
vector offsetToEulerRot(vector offset) {&lt;br /&gt;
    return &amp;lt;&lt;br /&gt;
        (offset.x - ((integer)(offset.x / 10.0) * 10)) * (float)(((offset.x &amp;lt; 0) * -2) + 1) - 5.0,&lt;br /&gt;
        (offset.y - ((integer)(offset.y / 10.0) * 10)) * (float)(((offset.y &amp;lt; 0) * -2) + 1) - 5.0,&lt;br /&gt;
        (offset.z - ((integer)(offset.z / 10.0) * 10)) * (float)(((offset.z &amp;lt; 0) * -2) + 1) - 5.0&lt;br /&gt;
    &amp;gt;;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Functions ===&lt;br /&gt;
The silly example below can be placed inside the root prim of a linked-set that you don&#039;t care much about (as it may be ruined). It will store the offsets of all prims and allow you to &amp;quot;crush&amp;quot; the object and then restore it by touching.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Paste the above functions in here&lt;br /&gt;
&lt;br /&gt;
list prim_offsets = []; integer crushed = FALSE;&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        integer prims = llGetNumberOfPrims();&lt;br /&gt;
        if (prims &amp;lt; 2) { llOwnerSay(&amp;quot;This object is not a linked set&amp;quot;); return; }&lt;br /&gt;
        &lt;br /&gt;
        integer link;&lt;br /&gt;
        for (link = LINK_ROOT + 1; link &amp;lt;= prims; ++link) {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(link, [PRIM_POS_LOCAL, PRIM_ROT_LOCAL]);&lt;br /&gt;
            prim_offsets += [combinedOffset(llList2Vector(params, 0), llRot2Euler(llList2Rot(params, 1)))];&lt;br /&gt;
        }&lt;br /&gt;
        llSetText(&amp;quot;Touch to crush!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer changes) { if (changes &amp;amp; CHANGED_LINK) llOwnerSay(&amp;quot;Object has changed, script should be reset&amp;quot;); }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        // If the object was crushed, restore it&lt;br /&gt;
        if (crushed) {&lt;br /&gt;
            integer x = prim_offsets != [];&lt;br /&gt;
            while ((--x) &amp;gt;= 0) {&lt;br /&gt;
                vector offset = llList2Vector(prim_offsets, x);&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(x + 2, &lt;br /&gt;
                    [PRIM_POS_LOCAL, offsetToPos(offset), PRIM_ROT_LOCAL, llEuler2Rot(offsetToEulerRot(offset))]&lt;br /&gt;
                );&lt;br /&gt;
            }&lt;br /&gt;
            llSetText(&amp;quot;Touch to crush!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
            crushed = FALSE;&lt;br /&gt;
        } else {&lt;br /&gt;
            integer x = prim_offsets != [];&lt;br /&gt;
            while ((--x) &amp;gt;= 0) llSetLinkPrimitiveParamsFast(x + 2, [PRIM_POS_LOCAL, ZERO_VECTOR, PRIM_ROT_LOCAL, ZERO_ROTATION]);&lt;br /&gt;
            llSetText(&amp;quot;Ouch!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
            crushed = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inline ===&lt;br /&gt;
This second example is an identical script, but instead of using the functions as-is it shows how they can be inlined. You may wish to do this in a script that only uses offset conversion in a few places, e.g- on load and on use, as this will eliminate the memory and performance costs of declaring and executing functions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list prim_offsets = []; integer crushed = FALSE;&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        integer prims = llGetNumberOfPrims();&lt;br /&gt;
        if (prims &amp;lt; 2) { llOwnerSay(&amp;quot;This object is not a linked set&amp;quot;); return; }&lt;br /&gt;
        &lt;br /&gt;
        integer link;&lt;br /&gt;
        for (link = LINK_ROOT + 1; link &amp;lt;= prims; ++link) {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(link, [PRIM_POS_LOCAL, PRIM_ROT_LOCAL]);&lt;br /&gt;
            vector offsetPos = llList2Vector(params, 0);&lt;br /&gt;
            vector offsetEulerRot = llList2Vector(params, 1);&lt;br /&gt;
            prim_offsets += [&amp;lt; // Inline conversion to offset&lt;br /&gt;
                (float)((integer)(offsetPos.x * 1000.0) * 10) + ((float)(((offsetPos.x &amp;lt; 0) * -2) + 1) * (offsetEulerRot.x + 5.0)), &lt;br /&gt;
                (float)((integer)(offsetPos.y * 1000.0) * 10) + ((float)(((offsetPos.y &amp;lt; 0) * -2) + 1) * (offsetEulerRot.y + 5.0)), &lt;br /&gt;
                (float)((integer)(offsetPos.z * 1000.0) * 10) + ((float)(((offsetPos.z &amp;lt; 0) * -2) + 1) * (offsetEulerRot.z + 5.0))&lt;br /&gt;
            &amp;gt;];&lt;br /&gt;
        }&lt;br /&gt;
        llSetText(&amp;quot;Touch to crush!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer changes) { if (changes &amp;amp; CHANGED_LINK) llOwnerSay(&amp;quot;Object has changed, script should be reset&amp;quot;); }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        // If the object was crushed, restore it&lt;br /&gt;
        if (crushed) {&lt;br /&gt;
            integer x = prim_offsets != [];&lt;br /&gt;
            while ((--x) &amp;gt;= 0) {&lt;br /&gt;
                vector offset = llList2Vector(prim_offsets, x);&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(x + 2, &lt;br /&gt;
                    [&lt;br /&gt;
                        PRIM_POS_LOCAL, &amp;lt; // Inline conversion from offset&lt;br /&gt;
                            (float)((integer)(offset.x / 10.0)) / 1000.0, &lt;br /&gt;
                            (float)((integer)(offset.y / 10.0)) / 1000.0, &lt;br /&gt;
                            (float)((integer)(offset.z / 10.0)) / 1000.0&lt;br /&gt;
                        &amp;gt;,&lt;br /&gt;
                        PRIM_ROT_LOCAL, llEuler2Rot(&amp;lt; // Inline conversion from offset&lt;br /&gt;
                            (offset.x - ((integer)(offset.x / 10.0) * 10)) * (float)(((offset.x &amp;lt; 0) * -2) + 1) - 5.0,&lt;br /&gt;
                            (offset.y - ((integer)(offset.y / 10.0) * 10)) * (float)(((offset.y &amp;lt; 0) * -2) + 1) - 5.0,&lt;br /&gt;
                            (offset.z - ((integer)(offset.z / 10.0) * 10)) * (float)(((offset.z &amp;lt; 0) * -2) + 1) - 5.0&lt;br /&gt;
                        &amp;gt;)]&lt;br /&gt;
                );&lt;br /&gt;
            }&lt;br /&gt;
            llSetText(&amp;quot;Touch to crush!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
            crushed = FALSE;&lt;br /&gt;
        } else {&lt;br /&gt;
            integer x = prim_offsets != [];&lt;br /&gt;
            while ((--x) &amp;gt;= 0) llSetLinkPrimitiveParamsFast(x + 2, [PRIM_POS_LOCAL, ZERO_VECTOR, PRIM_ROT_LOCAL, ZERO_ROTATION]);&lt;br /&gt;
            llSetText(&amp;quot;Ouch!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
            crushed = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Compression}}&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198324</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198324"/>
		<updated>2015-12-17T00:09:16Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral&amp;diff=1198322</id>
		<title>User:Haravikk Mistral</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral&amp;diff=1198322"/>
		<updated>2015-12-17T00:05:50Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Useful Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User:Haravikk_Mistral/Profile}}&lt;br /&gt;
= About =&lt;br /&gt;
== Real Life ==&lt;br /&gt;
Haravikk Mistral, or just Haravikk outside of [[Second Life]], is a Master of Engineering with Merit in Computer Science, and currently lives in central Scotland.&lt;br /&gt;
Interests are mostly computer-related, including a strong love for programming, as well as some experience in [[business]].&lt;br /&gt;
Programming knowledge includes:&lt;br /&gt;
* [http://en.wikipedia.org/wiki/C_(programming_language) C]/[http://en.wikipedia.org/wiki/C%2B%2B C++]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Objective-C Objective-C]/[http://en.wikipedia.org/wiki/Objective-C#Objective-C.2B.2B C++]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Java_(programming_language) Java]&lt;br /&gt;
* [[LSL]]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/PHP PHP]&lt;br /&gt;
&lt;br /&gt;
== Resident ==&lt;br /&gt;
Haravikk Mistral has been a Second Life [[Resident]] since 5th September 2005. Since joining Second Life Haravikk has been active in the [[Furry]] community, including popular places such as [http://furnation.com Furnation]. After quickly learning to build and script Haravikk began producing a number of popular scripted items, as well as open-source scripting projects.&lt;br /&gt;
&lt;br /&gt;
Haravikk frequently is seen wearing a self-styled [http://wikipedia.org/Renamon Renamon]-based avatar, a character referred to as [http://renara.com Renara] due to the different markings and other customisations. As a result of adopting Renara as an avatar, Haravikk typically wears the female form of the avatar, but is in actuality male.&lt;br /&gt;
&lt;br /&gt;
= Contributions =&lt;br /&gt;
Haravikk Mistral is an active [[community]] participant, and can be seen regularly posting in the [http://forums.secondlife.com Second Life.com Forums].&lt;br /&gt;
&lt;br /&gt;
== JIRA Reporter ==&lt;br /&gt;
Haravikk Mistral is an active participant of the [[JIRA|Second Life JIRA]], posting feature requests/bugs and spending some time helping with misfiled/duplicated issues.&lt;br /&gt;
{{Jira Reporter}}&lt;br /&gt;
&lt;br /&gt;
=== Key Issues ===&lt;br /&gt;
{{User:Haravikk_Mistral/JIRA/Issues/All}}&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
Haravikk Mistral specialises in scripting within the Second Life community, and is usually working on a number of scripting projects at any one time. Below are some useful code snippets or scripts that others may find useful in their own projects. Check back regularly as these are constantly being added to!&lt;br /&gt;
&lt;br /&gt;
=== Useful Functions ===&lt;br /&gt;
* [[Key]]&lt;br /&gt;
** [[generateKey|Generate a Key]]&lt;br /&gt;
* [[List]]&lt;br /&gt;
** [[ListCompare|Compare two lists]]&lt;br /&gt;
** [[ListCast|Cast the contents of a list to one-type]]&lt;br /&gt;
** [[Pseudo-randomly Generate Unique Indices]]&lt;br /&gt;
* Miscellaneous&lt;br /&gt;
** [[isPointInPolygon2D|Point in Polygon]]&lt;br /&gt;
&lt;br /&gt;
=== Useful Scripts ===&lt;br /&gt;
* [[:Category:LSL Compression|Compression]]&lt;br /&gt;
** [[Key Compression]]&lt;br /&gt;
** [[LZW Compression]]&lt;br /&gt;
** [[User:Haravikk_Mistral/Library/Offset_Compression|Offset Compression]]&lt;br /&gt;
* [[:Category:LSL Encryption|Cryptography]]&lt;br /&gt;
** [[AES Strong Encryption]]&lt;br /&gt;
** [[Vignére Weak Encryption]]&lt;br /&gt;
* [[:Category:LSL Parcel|Parcel]]&lt;br /&gt;
** [[Parcel Scanning]]&lt;br /&gt;
* Tools&lt;br /&gt;
** [[Pseudo Random Number Generator]]&lt;br /&gt;
** [[Scheduler]]&lt;br /&gt;
* Miscellaneous&lt;br /&gt;
** [[Lever Library]] (**IN DEVELOPMENT**)&lt;br /&gt;
&lt;br /&gt;
{{skills&lt;br /&gt;
|Architect=*&lt;br /&gt;
|Builder=*&lt;br /&gt;
|Machinima=&lt;br /&gt;
|Roleplayer=*&lt;br /&gt;
|Scenographer=&lt;br /&gt;
|Scripter=*&lt;br /&gt;
|SLogistician=&lt;br /&gt;
|Terraformer=&lt;br /&gt;
|}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral&amp;diff=1198321</id>
		<title>User:Haravikk Mistral</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Haravikk_Mistral&amp;diff=1198321"/>
		<updated>2015-12-17T00:05:28Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Useful Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User:Haravikk_Mistral/Profile}}&lt;br /&gt;
= About =&lt;br /&gt;
== Real Life ==&lt;br /&gt;
Haravikk Mistral, or just Haravikk outside of [[Second Life]], is a Master of Engineering with Merit in Computer Science, and currently lives in central Scotland.&lt;br /&gt;
Interests are mostly computer-related, including a strong love for programming, as well as some experience in [[business]].&lt;br /&gt;
Programming knowledge includes:&lt;br /&gt;
* [http://en.wikipedia.org/wiki/C_(programming_language) C]/[http://en.wikipedia.org/wiki/C%2B%2B C++]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Objective-C Objective-C]/[http://en.wikipedia.org/wiki/Objective-C#Objective-C.2B.2B C++]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Java_(programming_language) Java]&lt;br /&gt;
* [[LSL]]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/PHP PHP]&lt;br /&gt;
&lt;br /&gt;
== Resident ==&lt;br /&gt;
Haravikk Mistral has been a Second Life [[Resident]] since 5th September 2005. Since joining Second Life Haravikk has been active in the [[Furry]] community, including popular places such as [http://furnation.com Furnation]. After quickly learning to build and script Haravikk began producing a number of popular scripted items, as well as open-source scripting projects.&lt;br /&gt;
&lt;br /&gt;
Haravikk frequently is seen wearing a self-styled [http://wikipedia.org/Renamon Renamon]-based avatar, a character referred to as [http://renara.com Renara] due to the different markings and other customisations. As a result of adopting Renara as an avatar, Haravikk typically wears the female form of the avatar, but is in actuality male.&lt;br /&gt;
&lt;br /&gt;
= Contributions =&lt;br /&gt;
Haravikk Mistral is an active [[community]] participant, and can be seen regularly posting in the [http://forums.secondlife.com Second Life.com Forums].&lt;br /&gt;
&lt;br /&gt;
== JIRA Reporter ==&lt;br /&gt;
Haravikk Mistral is an active participant of the [[JIRA|Second Life JIRA]], posting feature requests/bugs and spending some time helping with misfiled/duplicated issues.&lt;br /&gt;
{{Jira Reporter}}&lt;br /&gt;
&lt;br /&gt;
=== Key Issues ===&lt;br /&gt;
{{User:Haravikk_Mistral/JIRA/Issues/All}}&lt;br /&gt;
&lt;br /&gt;
== Scripting ==&lt;br /&gt;
Haravikk Mistral specialises in scripting within the Second Life community, and is usually working on a number of scripting projects at any one time. Below are some useful code snippets or scripts that others may find useful in their own projects. Check back regularly as these are constantly being added to!&lt;br /&gt;
&lt;br /&gt;
=== Useful Functions ===&lt;br /&gt;
* [[Key]]&lt;br /&gt;
** [[generateKey|Generate a Key]]&lt;br /&gt;
* [[List]]&lt;br /&gt;
** [[ListCompare|Compare two lists]]&lt;br /&gt;
** [[ListCast|Cast the contents of a list to one-type]]&lt;br /&gt;
** [[Pseudo-randomly Generate Unique Indices]]&lt;br /&gt;
* Miscellaneous&lt;br /&gt;
** [[isPointInPolygon2D|Point in Polygon]]&lt;br /&gt;
&lt;br /&gt;
=== Useful Scripts ===&lt;br /&gt;
* [[:Category:LSL Compression|Compression]]&lt;br /&gt;
** [[Key Compression]]&lt;br /&gt;
** [[LZW Compression]]&lt;br /&gt;
** [[User:Haravikk_Mistral/Library/Offset_Compression|Offset Compression]]&lt;br /&gt;
* [[:Category:LSL Encryption|Cryptography]]&lt;br /&gt;
** [[AES Strong Encryption]]&lt;br /&gt;
** [[Vignére Weak Encryption]]&lt;br /&gt;
* [[:Category:LSL Parcel|Parcel]]&lt;br /&gt;
** [[Parcel Scanning]]&lt;br /&gt;
* Tools&lt;br /&gt;
** [[Pseudo Random Number Generator]]&lt;br /&gt;
** [[Scheduler]]&lt;br /&gt;
* Miscellaneous&lt;br /&gt;
** [[Lever Library]] (**IN DEVELOPMENT**)&lt;br /&gt;
&lt;br /&gt;
{{skills&lt;br /&gt;
|Architect=*&lt;br /&gt;
|Builder=*&lt;br /&gt;
|Machinima=&lt;br /&gt;
|Roleplayer=*&lt;br /&gt;
|Scenographer=&lt;br /&gt;
|Scripter=*&lt;br /&gt;
|SLogistician=&lt;br /&gt;
|Terraformer=&lt;br /&gt;
|}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PseudoRandomUniqueIndices&amp;diff=1198320</id>
		<title>PseudoRandomUniqueIndices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PseudoRandomUniqueIndices&amp;diff=1198320"/>
		<updated>2015-12-17T00:04:40Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Haravikk Mistral moved page PseudoRandomUniqueIndices to Pseudo-randomly Generate Unique Indices&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Pseudo-randomly Generate Unique Indices]]&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198319</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198319"/>
		<updated>2015-12-17T00:04:39Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Haravikk Mistral moved page PseudoRandomUniqueIndices to Pseudo-randomly Generate Unique Indices&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198318</id>
		<title>Pseudo-randomly Generate Unique Indices</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pseudo-randomly_Generate_Unique_Indices&amp;diff=1198318"/>
		<updated>2015-12-17T00:04:05Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: Created page with &amp;quot;= Pseudo-randomly Generate Unique Indices = Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elem...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Pseudo-randomly Generate Unique Indices =&lt;br /&gt;
Ordinarily when a collection of data needs to be retrieved in a random order, it can simply be reshuffled by randomly swapping elements and then iterating through the resulting, shuffled, collection. However there are cases where this is infeasible, especially in LSL, and as such the following functions can be used to generate indices in a pseudo-random way that should be &amp;quot;good enough&amp;quot; for many purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer _prui_counter = 1;&lt;br /&gt;
integer _prui_limit = 0;&lt;br /&gt;
&lt;br /&gt;
integer _prui_start = 0;&lt;br /&gt;
integer _prui_stride = 0;&lt;br /&gt;
integer _prui_next = 0;&lt;br /&gt;
&lt;br /&gt;
prui_init(integer limit) {&lt;br /&gt;
    _prui_limit = limit;&lt;br /&gt;
    _prui_start = (integer)llFrand((float)limit);&lt;br /&gt;
    _prui_stride = (integer)llFrand((float)limit - 1.0) + 1;&lt;br /&gt;
    _prui_next = _prui_start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer prui_next() {&lt;br /&gt;
    if (!_prui_counter) prui_init(_prui_limit);&lt;br /&gt;
&lt;br /&gt;
    integer result = _prui_next;&lt;br /&gt;
    _prui_next = (_prui_next + _prui_stride) % _prui_limit;&lt;br /&gt;
    if (_prui_next == _prui_start) {&lt;br /&gt;
        _prui_start = (_prui_start + 1) % _prui_limit;&lt;br /&gt;
        _prui_next = _prui_start;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== List ===&lt;br /&gt;
The following script will spit out a random entry from a list when touched. In this example the list contains letters of the alphabet and as such the first 26 touches will produce a unique letter, the following 26 touches will likewise produce no duplicates and so-on.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
list myList = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;r&amp;quot;, &amp;quot;s&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;, &amp;quot;w&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;z&amp;quot;];&lt;br /&gt;
integer myListLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myListLength = llGetListLength(myList));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llList2String(myList, prui_next())); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
This is the same example rewritten to more efficiently use a string for storing the letters of the alphabet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
string myString = &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
integer myStringLength;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        prui_init(myStringLength = llStringLength(myString));&lt;br /&gt;
        llSetText(&amp;quot;Touch me for a complimentary letter of the alphabet!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) { llRegionSayTo(llDetectedKey(0), PUBLIC_CHANNEL, llGetSubString(myString, x = prui_next(), x)); }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notecard ===&lt;br /&gt;
Finally, this example performs the same incredible feat using lines in a notecard (one for each letter of the alphabet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Add the above prui variables and functions here&lt;br /&gt;
&lt;br /&gt;
key myNotecard = &amp;quot;a62213ba-381d-2347-7f7b-818f15f12d83&amp;quot;;&lt;br /&gt;
integer myNotecardLength = -1;&lt;br /&gt;
key talkTo = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() { llGetNumberOfNotecardLines(myNotecard); }&lt;br /&gt;
    dataserver(key id, string data) {&lt;br /&gt;
        if (myNotecardLength &amp;gt; 0) llRegionSayTo(talkTo, PUBLIC_CHANNEL, data);&lt;br /&gt;
        else prui_init(myNotecardLength = (integer)data);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        talkTo = llDetectedKey(0);&lt;br /&gt;
        llGetNotecardLine(myNotecard, prui_next());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Offset_Compression&amp;diff=1198309</id>
		<title>Offset Compression</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Offset_Compression&amp;diff=1198309"/>
		<updated>2015-12-16T18:09:20Z</updated>

		<summary type="html">&lt;p&gt;Haravikk Mistral: /* Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
= Offset Compression =&lt;br /&gt;
In scripts that involve object manipulation and/or offsets for animations it is common to end up storing a vector and rotation for every such interaction, which can be memory intensive if the object has a lot of values to store. However, such offsets typically don&#039;t need to be very precise as linked objects won&#039;t move far from their root prim, and small errors in the rotation shouldn&#039;t result in any major issues, so long as those rotations aren&#039;t used as a reference for future actions.&lt;br /&gt;
&lt;br /&gt;
With this in mind, I&#039;ve produced some functions that allow both a positional and rotational offset to be stored as a single vector value, effectively cutting memory requirements by more than half (especially when considering list overhead), though this comes at the cost of declaring the functions instead, so if only require these in a few places you may wish to consider inlining them instead.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
For simplicity, these functions handle rotations as Euler vectors, which can be converted using [[llRot2Euler]]() and [[llEuler2Rot]](), this is also a convenient format for devices where rotation offsets may be specified in the user-friendly format in degrees (to match the build tools), such as in parsed notecards. These should still be converted to rotations for transformations in order to avoid [http://en.wikipedia.org/wiki/Gimbal_Lock Gimbal Lock]. &#039;&#039;&#039;NOTE:&#039;&#039;&#039; the combinedOffset() function below expects euler rotations to contain no component that exceeds positive or negative PI (just as the build tools do not allow this); for convenience the clampEulerRot() function is provided below to ensure that an Euler rotation is safe to use, but if your script is not vulnerable to this (for example, if your Euler rotations are created with llRot2Euler) then this function may be omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Ensures that an euler rot is within the required range (no values exceed plus or minus PI)&lt;br /&gt;
vector clampEulerRot(vector eulerRot) {&lt;br /&gt;
    @loopX1; @loopX2;&lt;br /&gt;
    if (eulerRot.x &amp;gt; PI) { eulerRot.x -= TWO_PI; jump loopX1; }&lt;br /&gt;
    else if (eulerRot.x &amp;lt; -PI) { eulerRot.x += TWO_PI; jump loopX2; }&lt;br /&gt;
    @loopY1; @loopY2;&lt;br /&gt;
    if (eulerRot.y &amp;gt; PI) { eulerRot.y -= TWO_PI; jump loopY1; }&lt;br /&gt;
    else if (eulerRot.y &amp;lt; -PI) { eulerRot.y += TWO_PI; jump loopY2; }&lt;br /&gt;
    @loopZ1; @loopZ2;&lt;br /&gt;
    if (eulerRot.z &amp;gt; PI) { eulerRot.z -= TWO_PI; jump loopZ1; }&lt;br /&gt;
    else if (eulerRot.z &amp;lt; -PI) { eulerRot.z += TWO_PI; jump loopZ2; }&lt;br /&gt;
    return eulerRot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Creates a combined vector from a position and Euler rotation. The rotation *must* be within the required range (no values exceed plus or minus PI) or it will not be possible to restore the values correctly&lt;br /&gt;
vector combinedOffset(vector offsetPos, vector offsetEulerRot) {&lt;br /&gt;
    return &amp;lt;&lt;br /&gt;
        (float)((integer)(offsetPos.x * 1000.0) * 10) + ((float)(((offsetPos.x &amp;lt; 0) * -2) + 1) * (offsetEulerRot.x + 5.0)), &lt;br /&gt;
        (float)((integer)(offsetPos.y * 1000.0) * 10) + ((float)(((offsetPos.y &amp;lt; 0) * -2) + 1) * (offsetEulerRot.y + 5.0)), &lt;br /&gt;
        (float)((integer)(offsetPos.z * 1000.0) * 10) + ((float)(((offsetPos.z &amp;lt; 0) * -2) + 1) * (offsetEulerRot.z + 5.0))&lt;br /&gt;
    &amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Retrieve the positional part from the combined offset&lt;br /&gt;
vector offsetToPos(vector offset) {&lt;br /&gt;
    return &amp;lt;&lt;br /&gt;
        (float)((integer)(offset.x / 10.0)) / 1000.0, &lt;br /&gt;
        (float)((integer)(offset.y / 10.0)) / 1000.0, &lt;br /&gt;
        (float)((integer)(offset.z / 10.0)) / 1000.0&lt;br /&gt;
    &amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Retrieve the rotation part from the combined offset&lt;br /&gt;
vector offsetToEulerRot(vector offset) {&lt;br /&gt;
    return &amp;lt;&lt;br /&gt;
        (offset.x - ((integer)(offset.x / 10.0) * 10)) * (float)(((offset.x &amp;lt; 0) * -2) + 1) - 5.0,&lt;br /&gt;
        (offset.y - ((integer)(offset.y / 10.0) * 10)) * (float)(((offset.y &amp;lt; 0) * -2) + 1) - 5.0,&lt;br /&gt;
        (offset.z - ((integer)(offset.z / 10.0) * 10)) * (float)(((offset.z &amp;lt; 0) * -2) + 1) - 5.0&lt;br /&gt;
    &amp;gt;;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Functions ===&lt;br /&gt;
The silly example below can be placed inside the root prim of a linked-set that you don&#039;t care much about (as it may be ruined). It will store the offsets of all prims and allow you to &amp;quot;crush&amp;quot; the object and then restore it by touching.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Paste the above functions in here&lt;br /&gt;
&lt;br /&gt;
list prim_offsets = []; integer crushed = FALSE;&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        integer prims = llGetNumberOfPrims();&lt;br /&gt;
        if (prims &amp;lt; 2) { llOwnerSay(&amp;quot;This object is not a linked set&amp;quot;); return; }&lt;br /&gt;
        &lt;br /&gt;
        integer link;&lt;br /&gt;
        for (link = LINK_ROOT + 1; link &amp;lt;= prims; ++link) {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(link, [PRIM_POS_LOCAL, PRIM_ROT_LOCAL]);&lt;br /&gt;
            prim_offsets += [combinedOffset(llList2Vector(params, 0), llRot2Euler(llList2Rot(params, 1)))];&lt;br /&gt;
        }&lt;br /&gt;
        llSetText(&amp;quot;Touch to crush!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer changes) { if (changes &amp;amp; CHANGED_LINK) llOwnerSay(&amp;quot;Object has changed, script should be reset&amp;quot;); }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        // If the object was crushed, restore it&lt;br /&gt;
        if (crushed) {&lt;br /&gt;
            integer x = prim_offsets != [];&lt;br /&gt;
            while ((--x) &amp;gt;= 0) {&lt;br /&gt;
                vector offset = llList2Vector(prim_offsets, x);&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(x + 2, &lt;br /&gt;
                    [PRIM_POS_LOCAL, offsetToPos(offset), PRIM_ROT_LOCAL, llEuler2Rot(offsetToEulerRot(offset))]&lt;br /&gt;
                );&lt;br /&gt;
            }&lt;br /&gt;
            llSetText(&amp;quot;Touch to crush!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
            crushed = FALSE;&lt;br /&gt;
        } else {&lt;br /&gt;
            integer x = prim_offsets != [];&lt;br /&gt;
            while ((--x) &amp;gt;= 0) llSetLinkPrimitiveParamsFast(x + 2, [PRIM_POS_LOCAL, ZERO_VECTOR, PRIM_ROT_LOCAL, ZERO_ROTATION]);&lt;br /&gt;
            llSetText(&amp;quot;Ouch!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
            crushed = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inline ===&lt;br /&gt;
This second example is an identical script, but instead of using the functions as-is it shows how they can be inlined. You may wish to do this in a script that only uses offset conversion in a few places, e.g- on load and on use, as this will eliminate the memory and performance costs of declaring and executing functions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list prim_offsets = []; integer crushed = FALSE;&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        integer prims = llGetNumberOfPrims();&lt;br /&gt;
        if (prims &amp;lt; 2) { llOwnerSay(&amp;quot;This object is not a linked set&amp;quot;); return; }&lt;br /&gt;
        &lt;br /&gt;
        integer link;&lt;br /&gt;
        for (link = LINK_ROOT + 1; link &amp;lt;= prims; ++link) {&lt;br /&gt;
            list params = llGetLinkPrimitiveParams(link, [PRIM_POS_LOCAL, PRIM_ROT_LOCAL]);&lt;br /&gt;
            vector offsetPos = llList2Vector(params, 0);&lt;br /&gt;
            vector offsetEulerRot = llList2Vector(params, 1);&lt;br /&gt;
            prim_offsets += [&amp;lt; // Inline conversion to offset&lt;br /&gt;
                (float)((integer)(offsetPos.x * 1000.0) * 10) + ((float)(((offsetPos.x &amp;lt; 0) * -2) + 1) * (offsetEulerRot.x + 5.0)), &lt;br /&gt;
                (float)((integer)(offsetPos.y * 1000.0) * 10) + ((float)(((offsetPos.y &amp;lt; 0) * -2) + 1) * (offsetEulerRot.y + 5.0)), &lt;br /&gt;
                (float)((integer)(offsetPos.z * 1000.0) * 10) + ((float)(((offsetPos.z &amp;lt; 0) * -2) + 1) * (offsetEulerRot.z + 5.0))&lt;br /&gt;
            &amp;gt;];&lt;br /&gt;
        }&lt;br /&gt;
        llSetText(&amp;quot;Touch to crush!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer changes) { if (changes &amp;amp; CHANGED_LINK) llOwnerSay(&amp;quot;Object has changed, script should be reset&amp;quot;); }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        // If the object was crushed, restore it&lt;br /&gt;
        if (crushed) {&lt;br /&gt;
            integer x = prim_offsets != [];&lt;br /&gt;
            while ((--x) &amp;gt;= 0) {&lt;br /&gt;
                vector offset = llList2Vector(prim_offsets, x);&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(x + 2, &lt;br /&gt;
                    [&lt;br /&gt;
                        PRIM_POS_LOCAL, &amp;lt; // Inline conversion from offset&lt;br /&gt;
                            (float)((integer)(offset.x / 10.0)) / 1000.0, &lt;br /&gt;
                            (float)((integer)(offset.y / 10.0)) / 1000.0, &lt;br /&gt;
                            (float)((integer)(offset.z / 10.0)) / 1000.0&lt;br /&gt;
                        &amp;gt;,&lt;br /&gt;
                        PRIM_ROT_LOCAL, llEuler2Rot(&amp;lt; // Inline conversion from offset&lt;br /&gt;
                            (offset.x - ((integer)(offset.x / 10.0) * 10)) * (float)(((offset.x &amp;lt; 0) * -2) + 1) - 5.0,&lt;br /&gt;
                            (offset.y - ((integer)(offset.y / 10.0) * 10)) * (float)(((offset.y &amp;lt; 0) * -2) + 1) - 5.0,&lt;br /&gt;
                            (offset.z - ((integer)(offset.z / 10.0) * 10)) * (float)(((offset.z &amp;lt; 0) * -2) + 1) - 5.0&lt;br /&gt;
                        &amp;gt;)]&lt;br /&gt;
                );&lt;br /&gt;
            }&lt;br /&gt;
            llSetText(&amp;quot;Touch to crush!&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
            crushed = FALSE;&lt;br /&gt;
        } else {&lt;br /&gt;
            integer x = prim_offsets != [];&lt;br /&gt;
            while ((--x) &amp;gt;= 0) llSetLinkPrimitiveParamsFast(x + 2, [PRIM_POS_LOCAL, ZERO_VECTOR, PRIM_ROT_LOCAL, ZERO_ROTATION]);&lt;br /&gt;
            llSetText(&amp;quot;Ouch!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
            crushed = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Compression}}&lt;/div&gt;</summary>
		<author><name>Haravikk Mistral</name></author>
	</entry>
</feed>